33 lines
1.1 KiB
C
33 lines
1.1 KiB
C
|
|
// 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
|