Line data Source code
1 : #ifndef STACK_H 2 : #define STACK_H 3 : 4 : #include <cstddef> 5 : 6 : #include "config.hpp" 7 : #include "common/exprtype.hpp" 8 : 9 : /** Класс, предназначенный для освобождения неиспользуемой памяти. 10 : * Во время своей работы виртуальная машина выделяет память под 11 : * каждое новое значение, будь то строка или целое число. Поэтому 12 : * как только это значение было присвоено некоторой переменной, 13 : * жандарм освобождает всю выделенную до этого момента память. 14 : * Так как машина стековая, каждый объект в её памяти живёт до 15 : * тех пор, пока не покинет её стек (кроме статических переменных), 16 : * поэтому вызов Gendarme::burn() произойдёт при опустошении стека. 17 : */ 18 : class Gendarme { 19 : void * pointers[MAXSTACK]; //!< Указатели на выделенную память. 20 : type_t types[MAXSTACK]; //!< Типы хранящихся по указателям значений. 21 : int pos; //!< Текущая позиция в массиве. 22 : 23 : public: 24 : //! Конструктор 25 414 : Gendarme(void): pos(0) { 26 424350 : for (int i = 0; i < MAXSTACK; i++) { 27 423936 : pointers[i] = nullptr; 28 423936 : types[i] = _NONE_; 29 : } 30 414 : }; 31 : 32 : /** Добавить новый указатель в массив. 33 : * @param[in] p Указатель на выделенную память 34 : * @param[in] type Тип хранящегося в ней значения 35 : */ 36 : void push(void * p, type_t type); 37 : 38 : //! Освободить память по всем сохранённым указателям. 39 : void burn(void); 40 : 41 : //! Узнать тип последнего элемента. 42 : type_t topType(void) const; 43 : 44 : //! Получить массив типов. 45 : const type_t * getTypes(void) const; 46 : 47 : /** Изменить тип последнего элемента. 48 : * @param[in] type Новый тип элемента 49 : */ 50 : void updateType(type_t type); 51 : 52 : //! Деструктор 53 : ~Gendarme(); 54 : }; 55 : 56 : class Stack { 57 : void * elem[MAXSTACK]; 58 : bool defined[MAXSTACK]; 59 : int pos; 60 : 61 : Gendarme memControl; 62 : public: 63 : Stack(bool gendarme = true); 64 : 65 : void push(void * x, type_t type = _NONE_); 66 : void * pop(void); // удаляет 67 : void * top(void) const; // НЕ удаляет 68 : void * get(int x) const; // НЕ удаляет 69 : void set(int i, void * x); 70 : int size(void) const; 71 : void * const * data(void) const; 72 : type_t topType(void) const; 73 : void updateType(type_t type); 74 : const type_t * getTypes(void) const; 75 : bool isEmpty(void) const; 76 : bool isDefined(void); 77 : }; 78 : 79 : #endif