#pragma once #include namespace nall { template struct array { auto capacity() const -> uint { return Capacity; } auto size() const -> uint { return _size; } auto reset() -> void { for(uint n : range(_size)) _pool.t[n].~T(); _size = 0; } auto operator[](uint index) -> T& { return _pool.t[index]; } auto operator[](uint index) const -> const T& { return _pool.t[index]; } auto append() -> T& { new(_pool.t + _size) T; return _pool.t[_size++]; } auto append(const T& value) -> void { new(_pool.t + _size++) T(value); } auto append(T&& value) -> void { new(_pool.t + _size++) T(move(value)); } auto begin() { return &_pool.t[0]; } auto end() { return &_pool.t[_size]; } auto begin() const { return &_pool.t[0]; } auto end() const { return &_pool.t[_size]; } private: union U { U() {} ~U() {} T t[Capacity]; } _pool; uint _size = 0; }; }