// License: Modified MIT (NON-AI) // See the LICENSE file in the root directory for license information. // Copyright 2025 Timothy Prepscius #pragma once #include "InPlaceArray.h" #include "Array.h" #include #include #include #include "../types/Types.h" namespace tjp { namespace core { template class InPlaceArray { public: static constexpr size_t MaxLength = N; private: using Array = std::array; using Block = char; using Size = u32; union Static { Block block; Array array; Static() : block(0) {} ~Static () {} } ; Static v; Size length = 0; typedef std::allocator Allocator; Allocator allocator; public: using value_type = typename Array::value_type; using iterator = typename Array::iterator; using const_iterator = typename Array::const_iterator; using pointer = typename Array::pointer; using reference = typename Array::reference; using const_reference = typename Array::const_reference; inline auto data() { return v.array.data(); } inline auto data() const { return v.array.data(); } inline auto begin() { return v.array.begin(); } inline auto end () { return v.array.begin() + length; } inline auto begin() const { return v.array.begin(); } inline auto end () const { return v.array.begin() + length; } inline auto rbegin() { return v.array.rbegin() + (v.array.size() - length); } inline auto rend () { return v.array.rend(); } inline auto rbegin() const { return v.array.rbegin() + (v.array.size() - length); } inline auto rend () const { return v.array.rend(); } inline const_reference front () const { return v.array.front(); } inline const_reference back () const { return *(v.array.data() + (length - 1)); } inline reference front () { return v.array.front(); } inline reference back () { return *(v.array.data() + (length - 1)); } private: template void construct(T *t, Args&& ...args) { std::allocator_traits::construct(allocator, t, std::forward(args)...); } void destruct(T *t) { std::allocator_traits::destroy(allocator, t); } protected: void shorten_block(size_t length_); void shorten_items(size_t length_); void shorten(size_t length_); void append_block(const T *begin, const T *end); void append_items(const T *begin, const T *end); void emplace_items(T *begin, T *end); public: InPlaceArray (); InPlaceArray(size_t length_, T t=T()); // InPlaceArray(InPlaceArray &&rhs); // template InPlaceArray(const InPlaceArray &rhs); InPlaceArray(const std::initializer_list &rhs); InPlaceArray(const T *begin, const T *end); InPlaceArray(const T *begin, size_t size); // template InPlaceArray &operator =(const InPlaceArray &rhs); InPlaceArray &operator =(const Array &rhs); ~InPlaceArray (); void resize(size_t length_, T t=T()); void append(const T *begin, const T *end); void emplace(T *begin, T *end); void push_back_(); void push_back (const T &element); void push_back (T &&element); void pop_back (); template T &emplace_back (Args&& ...args); const T &at(size_t i) const; T &at(size_t i); const T &operator[] (size_t i) const; T &operator[] (size_t i); size_t size () const; void clear (); bool empty () const; } ; } // namespace utilities } // namespace #include "InPlaceArray.inl" #include "InPlaceArray+iterator.inl"