| // Copyright 2022 Google LLC | |
| // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. | |
| #ifndef SkAlignedStorage_DEFINED | |
| #define SkAlignedStorage_DEFINED | |
| #include <cstddef> | |
| #include <iterator> | |
| template <int N, typename T> class SkAlignedSTStorage { | |
| public: | |
| SkAlignedSTStorage() {} | |
| SkAlignedSTStorage(SkAlignedSTStorage&&) = delete; | |
| SkAlignedSTStorage(const SkAlignedSTStorage&) = delete; | |
| SkAlignedSTStorage& operator=(SkAlignedSTStorage&&) = delete; | |
| SkAlignedSTStorage& operator=(const SkAlignedSTStorage&) = delete; | |
| // Returns void* because this object does not initialize the | |
| // memory. Use placement new for types that require a constructor. | |
| void* get() { return fStorage; } | |
| const void* get() const { return fStorage; } | |
| // Act as a container of bytes because the storage is uninitialized. | |
| std::byte* data() { return fStorage; } | |
| const std::byte* data() const { return fStorage; } | |
| size_t size() const { return std::size(fStorage); } | |
| private: | |
| alignas(T) std::byte fStorage[sizeof(T) * N]; | |
| }; | |
| #endif // SkAlignedStorage_DEFINED |