//////////////////////////////////////////////////////////////////////////////// /** \file \brief \ru Не владеющий стек указателей. \en Not owning stack of pointers. \~ */ //////////////////////////////////////////////////////////////////////////////// #ifndef __TEMPL_RP_STACK_H #define __TEMPL_RP_STACK_H #include //------------------------------------------------------------------------------ /** \brief \ru Стек указателей. \en Stack of pointers. \~ \details \ru Стек указателей без владения. \n Для организации стека используем в качестве базы RPArray, и отсекаем лишнее с помощью приватного наследования. \en Stack of pointers without ownership. \n For the organization of the stack use RPArray as the base and cut all unnecessary by the private inheritance. \~ \ingroup Base_Tools_Containers */ // --- template class RPStack: private RPArray { public: RPStack( size_t i_upper, uint16 i_delta = 1 ): RPArray( i_upper, i_delta ) {} public: void Push( Type & obj ); ///< \ru Добавить элемент в стек. \en Add an element to the stack. Type * Pop(); ///< \ru Извлечь один элемент стека, если возвращаетя nullptr, значит достигнуто дно стека. \en Retrieve one element from the stack, if nullptr is returned then the bottom of stack is reached. Type * Top() const; ///< \ru Верхний элемент стека. \en The top element of the stack. // \ru Оставить доступными следующие методы: \en Leave an access to the next methods: using RPArray::DetachAll; ///< \ru Отцепить все элементы (очистить стек). \en Detach all elements (clear the stack). using RPArray::Count; using RPArray::IsExist; using RPArray::operator[]; ///< \ru Оператор доступа по индексу; \en Access by index operator; private: RPStack( const RPStack & ); // \ru запрещено !!! \en forbidden !!! void operator =( const RPStack & ); // \ru запрещено !!! \en forbidden !!! }; //------------------------------------------------------------------------------ // \ru Добавить элемент в стек \en Add an element to the stack. //--- template void RPStack::Push( Type & obj ) { RPArray::Add( &obj ); } //------------------------------------------------------------------------------ // \ru Извлечь один элемент стека \en Retrieve one element from the stack //--- template Type * RPStack::Pop() { if ( RPArray::count > 0 ) { Type * ret = (*this)[RPArray::count-1]; RPArray::count--; return ret; } return nullptr; } //------------------------------------------------------------------------------ // \ru Верхний элемент стека; \en The top element of the stack; //--- template Type * RPStack::Top() const { if ( RPArray::count > 0 ) { return (*this)[RPArray::count-1]; } return nullptr; } #endif // __TEMPL_RP_STACK_H