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