LCOV - code coverage report
Current view: top level - vset/memory - manager.hpp (source / functions) Hit Total Coverage
Test: v-set-coverage.info Lines: 19 19 100.0 %
Date: 2019-09-12 Functions: 29 29 100.0 %

          Line data    Source code
       1             : //
       2             : // Author: Vladimir Migashko <migashko@gmail.com>, (C) 2012
       3             : //
       4             : // Copyright: See COPYING file that comes with this distribution
       5             : //
       6             : 
       7             : #ifndef VSET_VSET_ALLOCATOR_CHAIN_ALLOCATOR_HPP
       8             : #define VSET_VSET_ALLOCATOR_CHAIN_ALLOCATOR_HPP
       9             : 
      10             : #include <cstddef>
      11             : #include <vset/memory/manager_base.hpp>
      12             : #include <vset/memory/strategy.hpp>
      13             : #include <fas/system/nullptr.hpp>
      14             : 
      15             : namespace vset { namespace memory{
      16             : 
      17             : /**
      18             :  * @brief Интерфейс менеждера памяти
      19             :  * @tparam S стратегия 
      20             :  * @tparam A дополнительный аспект
      21             :  * @details доступные стратегии:
      22             :  *    * vset::memory::strategy::fsb_mmap
      23             :  *    * vset::memory::strategy::fsb_inmem
      24             :  *    * vset::memory::strategy::fsb_filesync
      25             :  */
      26             : template<typename S, typename A = fas::aspect<> >
      27          14 : class manager
      28             :   : public manager_base< typename fas::merge_aspect<A, S>::type >
      29             : {
      30             :   typedef manager_base< typename fas::merge_aspect<A, S>::type > super;
      31             : public:
      32             :   typedef manager<S, A> self;
      33             :   /** Тип размещаемого объекта */
      34             :   typedef typename super::value_type    value_type;
      35             :   /** Буфер, где рамещаются объекты value_type*/
      36             :   typedef typename super::buffer_type   buffer_type;
      37             :   /** Указатель vset::memory::offset_pointer */
      38             :   typedef typename super::pointer       pointer;
      39             :   /** Константный vset::memory::offset_pointer */
      40             :   typedef typename super::const_pointer const_pointer;
      41             :   
      42             :   typedef value_type& reference;
      43             :   typedef const value_type& const_reference;
      44             : 
      45             :   /** Беззнаковый целочисленный тип (size_t) */
      46             :   typedef size_t size_type;
      47             :   /** Знаковый целочисленный тип (std::ptrdiff_t) */
      48             :   typedef std::ptrdiff_t difference_type;
      49             : 
      50             :   /** 
      51             :    * @brief Возвращает указатель на первый элемент контейнера. 
      52             :    * @return указатель vset::memory::offset_pointer на первый элемент
      53             :    */
      54       30220 :   pointer begin()
      55             :   {
      56       30220 :     return super::_begin(*this);
      57             :   }
      58             : 
      59             :   /** 
      60             :    * @brief Возвращает указатель на первый элемент контейнера. 
      61             :    * @return указатель vset::memory::offset_pointer на первый элемент
      62             :    */
      63           9 :   const_pointer begin() const
      64             :   {
      65           9 :     return super::_begin(*this);
      66             :   }
      67             : 
      68             :   /** 
      69             :    * @brief Возвращает указатель на элемент, следующий за последним элементом контейнера
      70             :    * @return указатель vset::memory::offset_pointer на элемент, следующий за последним элементом контейнера
      71             :    * @details Этот элемент выступает в качестве заполнителя; попытке доступа к нему приводит к неопределенному поведению
      72             :    */  
      73       20216 :   pointer end()
      74             :   {
      75       20216 :     return super::_end(*this);
      76             :   }
      77             : 
      78             :   /** 
      79             :    * @brief Возвращает указатель на элемент, следующий за последним элементом контейнера
      80             :    * @return указатель vset::memory::offset_pointer на элемент, следующий за последним элементом контейнера
      81             :    * @details Этот элемент выступает в качестве заполнителя; попытке доступа к нему приводит к неопределенному поведению
      82             :    */  
      83         414 :   const_pointer end() const
      84             :   {
      85         414 :     return super::_end(*this);
      86             :   }
      87             : 
      88             :   /**
      89             :    * @brief Выделяет память для num объектов
      90             :    * @param num количество объектов
      91             :    * @return указатель vset::memory::offset_pointer на первый объект
      92             :    * @details указатель на первый объект не является указателем на первый элемент массива,
      93             :    * но получить доступ к остальным объектам можно с помощью операторов += и ++. Но основной 
      94             :    * кейс это выделение и освобождение по одному объекту
      95             :    */
      96       10797 :   pointer allocate(size_t num, void *  hint = fas_nullptr)
      97             :   {
      98       10797 :     return super::_allocate(*this, num, hint);
      99             :   }
     100             : 
     101             :   /**
     102             :    * @brief Освобождает память для num объектов
     103             :    * @param num количество объектов
     104             :    * @details освобождает память для текущего объекта и еще для num-1 следующих. Но основной 
     105             :    * кейс это выделение и освобождение по одному объекту
     106             :    */
     107       10006 :   void deallocate(pointer ptr, size_type num)
     108             :   {
     109       10006 :     return super::_deallocate(*this, ptr, num);
     110             :   }
     111             : 
     112             :   /**
     113             :    * @brief Возвращает количество распределенных объектов
     114             :    * @return количество распределенных объектов
     115             :    */
     116         206 :   size_type count() const
     117             :   {
     118         206 :     return super::_count(*this);
     119             :   }
     120             :   
     121             :   /**
     122             :    * @brief Проверка на отсутствие элементов 
     123             :    * @return true если память ни для одного элемента не распределена, false - в противном случае 
     124             :    */
     125             :   bool empty() const
     126             :   {
     127             :     return this->begin() == this->end();
     128             :   }
     129             : 
     130             :   /**
     131             :    * @brief Возвращает количество элементов, для которого зарезервирована память контейнером.
     132             :    * @return Текущая вместимость, под которую в сейчас выделена память
     133             :    */
     134           3 :   size_type capacity() const
     135             :   {
     136           3 :     return super::_capacity(*this);
     137             :   }
     138             :   
     139             :   /**
     140             :    * @brief Буфер
     141             :    * @return Объект управления буфером в котором происходит размещение объектов
     142             :    */
     143          17 :   buffer_type buffer()
     144             :   {
     145          17 :     return super::_buffer(*this);
     146             :   }
     147             : 
     148             :   /**
     149             :    * @brief Буфер
     150             :    * @return Объект управления буфером в котором происходит размещение объектов
     151             :    */
     152             :   const buffer_type buffer() const
     153             :   {
     154             :     return super::_buffer(*this);
     155             :   }
     156             : 
     157             : };
     158             : 
     159             : }}
     160             : 
     161             : #endif

Generated by: LCOV version 1.10