#pragma once #include "fwd.h" #include "reserve.h" #include <util/memory/alloc.h> #include <vector> #include <initializer_list> template <class T, class A> class TVector: public std::vector<T, TReboundAllocator<A, T>> { public: using TBase = std::vector<T, TReboundAllocator<A, T>>; using TSelf = TVector<T, A>; using size_type = typename TBase::size_type; inline TVector() : TBase() { } inline TVector(const typename TBase::allocator_type& a) : TBase(a) { } inline explicit TVector(::NDetail::TReserveTag rt) : TBase() { this->reserve(rt.Capacity); } inline explicit TVector(::NDetail::TReserveTag rt, const typename TBase::allocator_type& a) : TBase(a) { this->reserve(rt.Capacity); } inline explicit TVector(size_type count) : TBase(count) { } inline explicit TVector(size_type count, const typename TBase::allocator_type& a) : TBase(count, a) { } inline TVector(size_type count, const T& val) : TBase(count, val) { } inline TVector(size_type count, const T& val, const typename TBase::allocator_type& a) : TBase(count, val, a) { } inline TVector(std::initializer_list<T> il) : TBase(il) { } inline TVector(std::initializer_list<T> il, const typename TBase::allocator_type& a) : TBase(il, a) { } inline TVector(const TSelf& src) : TBase(src) { } inline TVector(TSelf&& src) noexcept : TBase(std::forward<TSelf>(src)) { } template <class TIter> inline TVector(TIter first, TIter last) : TBase(first, last) { } inline TSelf& operator=(const TSelf& src) { TBase::operator=(src); return *this; } inline TSelf& operator=(TSelf&& src) noexcept { TBase::operator=(std::forward<TSelf>(src)); return *this; } inline TSelf& operator=(std::initializer_list<T> il) { this->assign(il.begin(), il.end()); return *this; } inline explicit operator bool() const noexcept { return !this->empty(); } Y_PURE_FUNCTION inline bool empty() const noexcept { return TBase::empty(); } inline yssize_t ysize() const noexcept { return (yssize_t)TBase::size(); } #ifdef _YNDX_LIBCXX_ENABLE_VECTOR_POD_RESIZE_UNINITIALIZED void yresize(size_type newSize) { if (std::is_pod<T>::value) { TBase::resize_uninitialized(newSize); } else { TBase::resize(newSize); } } #else void yresize(size_type newSize) { TBase::resize(newSize); } #endif inline void crop(size_type size) { if (this->size() > size) { this->erase(this->begin() + size, this->end()); } } };