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
|