#pragma once #include #include #include #include #include #include #include #include namespace nall { template struct vector_iterator; template struct vector_iterator_const; template struct vector { //core.hpp vector() = default; vector(const initializer_list& values); vector(const vector& source); vector(vector&& source); ~vector(); explicit operator bool() const; auto capacity() const -> uint; auto size() const -> uint; auto data() -> T*; auto data() const -> const T*; //assign.hpp auto operator=(const vector& source) -> vector&; auto operator=(vector&& source) -> vector&; //memory.hpp auto reset() -> void; auto release() -> T*; auto reserveLeft(uint capacity) -> bool; auto reserveRight(uint capacity) -> bool; auto reserve(uint capacity) -> bool { return reserveRight(capacity); } auto resizeLeft(uint size, const T& value = T()) -> bool; auto resizeRight(uint size, const T& value = T()) -> bool; auto resize(uint size, const T& value = T()) -> bool { return resizeRight(size, value); } //access.hpp alwaysinline auto operator[](uint offset) -> T&; alwaysinline auto operator[](uint offset) const -> const T&; alwaysinline auto operator()(uint offset) -> T&; alwaysinline auto operator()(uint offset, const T& value) const -> const T&; alwaysinline auto left() -> T&; alwaysinline auto left() const -> const T&; alwaysinline auto right() -> T&; alwaysinline auto right() const -> const T&; //modify.hpp auto prepend(const T& value) -> void; auto prepend(T&& value) -> void; auto prepend(const vector& values) -> void; auto prepend(vector&& values) -> void; auto append(const T& value) -> void; auto append(T&& value) -> void; auto append(const vector& values) -> void; auto append(vector&& values) -> void; auto insert(uint offset, const T& value) -> void; auto removeLeft(uint length = 1) -> void; auto removeRight(uint length = 1) -> void; auto remove(uint offset, uint length = 1) -> void; auto takeLeft() -> T; auto takeRight() -> T; auto take(uint offset) -> T; //iterator.hpp auto begin() { return vector_iterator{*this, 0}; } auto end() { return vector_iterator{*this, size()}; } auto begin() const { return vector_iterator_const{*this, 0}; } auto end() const { return vector_iterator_const{*this, size()}; } //utility.hpp auto sort(const function& comparator = [](auto& lhs, auto& rhs) { return lhs < rhs; }) -> void; auto find(const T& value) const -> maybe; private: T* _pool = nullptr; //pointer to first initialized element in pool uint _size = 0; //number of initialized elements in pool uint _left = 0; //number of allocated elements free on the left of pool uint _right = 0; //number of allocated elements free on the right of pool }; } #include #include #include #include #include #include #include namespace nall { template inline auto range(const vector& value) { return range_t{0, (int)value.size(), 1}; } template inline auto rrange(const vector& value) { return range_t{(int)value.size() - 1, -1, -1}; } }