LCOV - code coverage report
Current view: top level - src/common - stack.hpp (source / functions) Hit Total Coverage
Test: flower-f.info Lines: 5 5 100.0 %
Date: 2022-06-10 00:44:15 Functions: 1 1 100.0 %

          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

Generated by: LCOV version 1.14