#ifndef ARBUTILS_UNIQUEPTRLIST_HPP #define ARBUTILS_UNIQUEPTRLIST_HPP #include #include #include #include #include "BorrowedPtr.hpp" namespace ArbUt { template class UniquePtrList { private: std::vector _vector; using iterator = typename std::vector::iterator; using const_iterator = typename std::vector::const_iterator; public: inline UniquePtrList() : _vector() {} inline UniquePtrList(std::vector vec) : _vector(vec) {} explicit inline UniquePtrList(size_t capacity) : _vector() { _vector.reserve(capacity); } inline UniquePtrList(const std::initializer_list& l) : _vector(l) {} inline UniquePtrList(ValueT* const* begin, ValueT* const* end) : _vector(begin, end) {} UniquePtrList(const UniquePtrList&) = delete; UniquePtrList& operator=(const UniquePtrList&) = delete; ~UniquePtrList() { Clear(); } inline void Clear() { for (auto& i : _vector) { delete i; } } inline BorrowedPtr At(size_t index) const { #ifndef NO_ASSERT if (index >= _vector.size()) { std::stringstream ss; ss << "Index " << index << " is out of bounds."; throw std::logic_error(ss.str()); } #endif return _vector[index]; } inline void Remove(size_t index){ #ifndef NO_ASSERT if (index >= _vector.size()) { std::stringstream ss; ss << "Index " << index << " is out of bounds."; throw std::logic_error(ss.str()); } #endif auto item = _vector[index]; delete item; _vector.erase(item); } inline bool Contains(const BorrowedPtr& value) const { return std::find(_vector.begin(), _vector.end(), value) != _vector.end(); } /// Find the index of the first occurrence of a value in the list, return -1 if none is found. /// \param value The value we want the index for. /// \return The index of the first occurrence of the value in the list, or -1 if none is found. inline size_t IndexOf(const BorrowedPtr& value) const { const auto& it = std::find(_vector.begin(), _vector.end(), value); if (it == _vector.end()) return -1; return std::distance(_vector.begin(), it); } inline void Append(ValueT* value) { _vector.push_back(value); } inline BorrowedPtr operator[](size_t index) const { return At(index); } inline size_t Count() const { return _vector.size(); } iterator begin() { return _vector.begin(); } iterator end() { return _vector.end(); } const_iterator begin() const { return _vector.begin(); } const_iterator end() const { return _vector.end(); } ValueT* const* RawData() const { return _vector.data(); } const std::vector& GetStdList() const { return _vector; } std::vector& GetStdList() { return _vector; } }; } #endif // ARBUTILS_UNIQUEPTRLIST_HPP