aboutsummaryrefslogblamecommitdiffstats
path: root/util/generic/vector.h
blob: a5b258955a87039666c7f53565cb72c25ecf33ad (plain) (tree)


































































































































                                                                                               
#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());
        }
    }
};