#pragma once #include #include #include #include template using SVectorBase = std::vector>; template using SVectorBasePtr = std::shared_ptr>; template class SVector : public SVectorBasePtr { public: SVector(bool bInit = true, size_t res = 0) { if (bInit || res) init(res); } void init(size_t res = 0) { SVectorBasePtr::reset(new SVectorBase(res)); } inline bool isInit() const { return SVectorBasePtr::get() != nullptr; } void canUse() const { if (!isInit()) throw std::bad_cast(); } size_t size() const { canUse(); return SVectorBasePtr::get()->size(); } bool empty() const { canUse(); return SVectorBasePtr::get()->empty(); } std::shared_ptr& operator[](size_t index) { canUse(); return SVectorBasePtr::get()->operator[](index); } const std::shared_ptr& operator[](size_t index) const { canUse(); return SVectorBasePtr::get()->operator[](index); } void push_back(const std::shared_ptr &el) { if (!isInit()) init(); SVectorBasePtr::get()->push_back(el); } void clear() { canUse(); SVectorBasePtr::get()->clear(); } };