• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2022 Google LLC
2 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
3 
4 #ifndef SkAlignedStorage_DEFINED
5 #define SkAlignedStorage_DEFINED
6 
7 #include <cstddef>
8 #include <iterator>
9 
10 template <int N, typename T> class SkAlignedSTStorage {
11 public:
SkAlignedSTStorage()12     SkAlignedSTStorage() {}
13     SkAlignedSTStorage(SkAlignedSTStorage&&) = delete;
14     SkAlignedSTStorage(const SkAlignedSTStorage&) = delete;
15     SkAlignedSTStorage& operator=(SkAlignedSTStorage&&) = delete;
16     SkAlignedSTStorage& operator=(const SkAlignedSTStorage&) = delete;
17 
18     // Returns void* because this object does not initialize the
19     // memory. Use placement new for types that require a constructor.
get()20     void* get() { return fStorage; }
get()21     const void* get() const { return fStorage; }
22 
23     // Act as a container of bytes because the storage is uninitialized.
data()24     std::byte* data() { return fStorage; }
data()25     const std::byte* data() const { return fStorage; }
size()26     size_t size() const { return std::size(fStorage); }
27 
28 private:
29     alignas(T) std::byte fStorage[sizeof(T) * N];
30 };
31 
32 #endif  // SkAlignedStorage_DEFINED
33