aboutsummaryrefslogtreecommitdiffstats
path: root/common/flexarray.h
diff options
context:
space:
mode:
Diffstat (limited to 'common/flexarray.h')
-rw-r--r--common/flexarray.h50
1 files changed, 23 insertions, 27 deletions
diff --git a/common/flexarray.h b/common/flexarray.h
index b2884639..09aeef4e 100644
--- a/common/flexarray.h
+++ b/common/flexarray.h
@@ -15,14 +15,12 @@ namespace al {
* trivially destructible.
*/
template<typename T, size_t alignment, bool = std::is_trivially_destructible<T>::value>
-struct FlexArrayStorage {
- alignas(std::max(alignment, alignof(::al::span<T>))) const ::al::span<T> mData;
-
+struct alignas(std::max(alignment, alignof(al::span<T>))) FlexArrayStorage : al::span<T> {
static constexpr size_t Sizeof(size_t count, size_t base=0u) noexcept
{ return sizeof(FlexArrayStorage) + sizeof(T)*count + base; }
FlexArrayStorage(size_t size) noexcept(std::is_nothrow_constructible_v<T>)
- : mData{::new(static_cast<void*>(this+1)) T[size], size}
+ : al::span<T>{::new(static_cast<void*>(this+1)) T[size], size}
{ }
~FlexArrayStorage() = default;
@@ -31,16 +29,14 @@ struct FlexArrayStorage {
};
template<typename T, size_t alignment>
-struct FlexArrayStorage<T,alignment,false> {
- alignas(std::max(alignment, alignof(::al::span<T>))) const ::al::span<T> mData;
-
+struct alignas(std::max(alignment, alignof(al::span<T>))) FlexArrayStorage<T,alignment,false> : al::span<T> {
static constexpr size_t Sizeof(size_t count, size_t base=0u) noexcept
{ return sizeof(FlexArrayStorage) + sizeof(T)*count + base; }
FlexArrayStorage(size_t size) noexcept(std::is_nothrow_constructible_v<T>)
- : mData{::new(static_cast<void*>(this+1)) T[size], size}
+ : al::span<T>{::new(static_cast<void*>(this+1)) T[size], size}
{ }
- ~FlexArrayStorage() { std::destroy(mData.begin(), mData.end()); }
+ ~FlexArrayStorage() { std::destroy(this->begin(), this->end()); }
FlexArrayStorage(const FlexArrayStorage&) = delete;
FlexArrayStorage& operator=(const FlexArrayStorage&) = delete;
@@ -82,33 +78,33 @@ struct FlexArray {
{ }
~FlexArray() = default;
- [[nodiscard]] auto size() const noexcept -> index_type { return mStore.mData.size(); }
- [[nodiscard]] auto empty() const noexcept -> bool { return mStore.mData.empty(); }
+ [[nodiscard]] auto size() const noexcept -> index_type { return mStore.size(); }
+ [[nodiscard]] auto empty() const noexcept -> bool { return mStore.empty(); }
- [[nodiscard]] auto data() noexcept -> pointer { return mStore.mData.data(); }
- [[nodiscard]] auto data() const noexcept -> const_pointer { return mStore.mData.data(); }
+ [[nodiscard]] auto data() noexcept -> pointer { return mStore.data(); }
+ [[nodiscard]] auto data() const noexcept -> const_pointer { return mStore.data(); }
- [[nodiscard]] auto operator[](index_type i) noexcept -> reference { return mStore.mData[i]; }
- [[nodiscard]] auto operator[](index_type i) const noexcept -> const_reference { return mStore.mData[i]; }
+ [[nodiscard]] auto operator[](index_type i) noexcept -> reference { return mStore[i]; }
+ [[nodiscard]] auto operator[](index_type i) const noexcept -> const_reference { return mStore[i]; }
- [[nodiscard]] auto front() noexcept -> reference { return mStore.mData.front(); }
- [[nodiscard]] auto front() const noexcept -> const_reference { return mStore.mData.front(); }
+ [[nodiscard]] auto front() noexcept -> reference { return mStore.front(); }
+ [[nodiscard]] auto front() const noexcept -> const_reference { return mStore.front(); }
- [[nodiscard]] auto back() noexcept -> reference { return mStore.mData.back(); }
- [[nodiscard]] auto back() const noexcept -> const_reference { return mStore.mData.back(); }
+ [[nodiscard]] auto back() noexcept -> reference { return mStore.back(); }
+ [[nodiscard]] auto back() const noexcept -> const_reference { return mStore.back(); }
- [[nodiscard]] auto begin() noexcept -> iterator { return mStore.mData.begin(); }
- [[nodiscard]] auto begin() const noexcept -> const_iterator { return mStore.mData.begin(); }
- [[nodiscard]] auto cbegin() const noexcept -> const_iterator { return mStore.mData.cbegin(); }
- [[nodiscard]] auto end() noexcept -> iterator { return mStore.mData.end(); }
- [[nodiscard]] auto end() const noexcept -> const_iterator { return mStore.mData.end(); }
- [[nodiscard]] auto cend() const noexcept -> const_iterator { return mStore.mData.cend(); }
+ [[nodiscard]] auto begin() noexcept -> iterator { return mStore.begin(); }
+ [[nodiscard]] auto begin() const noexcept -> const_iterator { return mStore.cbegin(); }
+ [[nodiscard]] auto cbegin() const noexcept -> const_iterator { return mStore.cbegin(); }
+ [[nodiscard]] auto end() noexcept -> iterator { return mStore.end(); }
+ [[nodiscard]] auto end() const noexcept -> const_iterator { return mStore.cend(); }
+ [[nodiscard]] auto cend() const noexcept -> const_iterator { return mStore.cend(); }
[[nodiscard]] auto rbegin() noexcept -> reverse_iterator { return end(); }
- [[nodiscard]] auto rbegin() const noexcept -> const_reverse_iterator { return end(); }
+ [[nodiscard]] auto rbegin() const noexcept -> const_reverse_iterator { return cend(); }
[[nodiscard]] auto crbegin() const noexcept -> const_reverse_iterator { return cend(); }
[[nodiscard]] auto rend() noexcept -> reverse_iterator { return begin(); }
- [[nodiscard]] auto rend() const noexcept -> const_reverse_iterator { return begin(); }
+ [[nodiscard]] auto rend() const noexcept -> const_reverse_iterator { return cbegin(); }
[[nodiscard]] auto crend() const noexcept -> const_reverse_iterator { return cbegin(); }
gsl::owner<void*> operator new(size_t, FamCount count)