#pragma once #include #include #include #include #include #include #include #include #include #include #include #include namespace nall { 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; operator array_span(); operator array_view() const; template auto capacity() const -> uint64_t; template auto size() const -> uint64_t; template auto data() -> Cast*; template auto data() const -> const Cast*; //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 acquire(const T* data, uint64_t size, uint64_t capacity = 0) -> void; auto release() -> T*; auto reserveLeft(uint64_t capacity) -> bool; auto reserveRight(uint64_t capacity) -> bool; auto reserve(uint64_t capacity) -> bool { return reserveRight(capacity); } auto reallocateLeft(uint64_t size) -> bool; auto reallocateRight(uint64_t size) -> bool; auto reallocate(uint64_t size) -> bool { return reallocateRight(size); } auto resizeLeft(uint64_t size, const T& value = T()) -> bool; auto resizeRight(uint64_t size, const T& value = T()) -> bool; auto resize(uint64_t size, const T& value = T()) -> bool { return resizeRight(size, value); } //access.hpp alwaysinline auto operator[](uint64_t offset) -> T&; alwaysinline auto operator[](uint64_t offset) const -> const T&; alwaysinline auto operator()(uint64_t offset) -> T&; alwaysinline auto operator()(uint64_t offset, const T& value) const -> const T&; alwaysinline auto left() -> T&; alwaysinline auto first() -> T& { return left(); } alwaysinline auto left() const -> const T&; alwaysinline auto first() const -> const T& { return left(); } alwaysinline auto right() -> T&; alwaysinline auto last() -> T& { return right(); } alwaysinline auto right() const -> const T&; alwaysinline auto last() const -> const T& { return right(); } //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(uint64_t offset, const T& value) -> void; auto removeLeft(uint64_t length = 1) -> void; auto removeFirst(uint64_t length = 1) -> void { return removeLeft(length); } auto removeRight(uint64_t length = 1) -> void; auto removeLast(uint64_t length = 1) -> void { return removeRight(length); } auto remove(uint64_t offset, uint64_t length = 1) -> void; struct RemoveWhere { RemoveWhere(type& source) : self(source) {} auto operator==(const T& value) -> type&; auto operator!=(const T& value) -> type&; auto operator< (const T& value) -> type&; auto operator<=(const T& value) -> type&; auto operator> (const T& value) -> type&; auto operator>=(const T& value) -> type&; private: type& self; template auto remove(const T& value) -> type&; }; auto removeWhere() -> RemoveWhere { return RemoveWhere{*this}; } auto takeLeft() -> T; auto takeFirst() -> T { return move(takeLeft()); } auto takeRight() -> T; auto takeLast() -> T { return move(takeRight()); } auto take(uint64_t 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(), (uint64_t)-1}; } auto rbegin() const -> reverse_iterator_const { return {data(), size() - 1}; } auto rend() const -> reverse_iterator_const { return {data(), (uint64_t)-1}; } //utility.hpp auto fill(const T& value = {}) -> void; auto sort(const function& comparator = [](auto& lhs, auto& rhs) { return lhs < rhs; }) -> void; auto reverse() -> void; auto find(const function& comparator) -> maybe; auto find(const T& value) const -> maybe; auto findSorted(const T& value) const -> maybe; struct FindWhere { FindWhere(type& source) : self(source) {} auto operator==(const T& value) -> vector_base>; auto operator!=(const T& value) -> vector_base>; auto operator< (const T& value) -> vector_base>; auto operator<=(const T& value) -> vector_base>; auto operator> (const T& value) -> vector_base>; auto operator>=(const T& value) -> vector_base>; private: type& self; template auto find(const T& value) -> vector_base>; }; auto findWhere() { return FindWhere{*this}; } struct FindWhereConst { FindWhereConst(const type& source) : self(source) {} auto operator==(const T& value) const -> vector_base>; auto operator!=(const T& value) const -> vector_base>; auto operator< (const T& value) const -> vector_base>; auto operator<=(const T& value) const -> vector_base>; auto operator> (const T& value) const -> vector_base>; auto operator>=(const T& value) const -> vector_base>; private: const type& self; template auto find(const T& value) const -> vector_base>; }; auto findWhere() const { return FindWhereConst{*this}; } auto foreach(const function& callback) -> void; auto foreach(const function& callback) -> void; protected: T* _pool = nullptr; //pointer to first initialized element in pool uint64_t _size = 0; //number of initialized elements in pool uint64_t _left = 0; //number of allocated elements free on the left of pool uint64_t _right = 0; //number of allocated elements free on the right of pool }; template auto removeWhere(vector_base& source) { return source.removeWhere(); } template auto findWhere(vector_base& source) { return source.findWhere(); } template auto findWhere(const vector_base& source) { return source.findWhere(); } } #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; }; } #include