// 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 #include template 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