#pragma once #include #include #include #include #include #include #include #include #include namespace nall { template struct vector_iterator; template struct vector_iterator_const; template struct vector_iterator_reverse; template struct vector_iterator_reverse_const; template struct vector_base { using type = vector_base; //core.hpp vector_base() = default; vector_base(const initializer_list& values); vector_base(const type& source); vector_base(type&& source); ~vector_base(); 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 type& source) -> type&; auto operator=(type&& source) -> type&; //compare.hpp auto operator==(const type& source) const -> bool; auto operator!=(const type& source) const -> bool; //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 type& values) -> void; auto prepend(type&& values) -> void; auto append(const T& value) -> void; auto append(T&& value) -> void; auto append(const type& values) -> void; auto append(type&& 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() -> iterator { return {data(), 0}; } auto end() -> iterator { return {data(), size()}; } auto begin() const -> iterator_const { return {data(), 0}; } auto end() const -> iterator_const { return {data(), size()}; } auto rbegin() -> reverse_iterator { return {data(), size() - 1}; } auto rend() -> reverse_iterator { return {data(), (uint)-1}; } auto rbegin() const -> reverse_iterator_const { return {data(), size() - 1}; } auto rend() const -> reverse_iterator_const { return {data(), (uint)-1}; } //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 }; } #define vector vector_base #include #include #include #include #include #include #include #include #undef vector namespace nall { template struct vector : vector_base { using vector_base::vector_base; }; }