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_MEMORY_PROVIDER_HPP
8 : #define VSET_MEMORY_PROVIDER_HPP
9 :
10 : #include <vset/memory/tags.hpp>
11 : #include <fas/typemanip/type2type.hpp>
12 : #include <vset/memory/aspect_maker.hpp>
13 : #include <fas/system/nullptr.hpp>
14 :
15 : namespace vset { namespace memory{
16 :
17 : template<typename Manager >
18 : class provider
19 : {
20 : public:
21 : typedef Manager manager;
22 :
23 : typedef typename aspect_maker<manager>::value_type value_type;
24 : typedef typename aspect_maker<manager>::buffer_type buffer_type;
25 : typedef typename aspect_maker<manager>::pointer pointer;
26 : typedef typename aspect_maker<manager>::const_pointer const_pointer;
27 : typedef typename aspect_maker<manager>::difference_type difference_type;
28 :
29 : typedef value_type& reference;
30 : typedef const value_type& const_reference;
31 :
32 : typedef size_t size_type;
33 :
34 2 : provider(): _manager(fas_nullptr) {}
35 :
36 26 : explicit provider(Manager* m): _manager(m) {}
37 :
38 2 : pointer begin()
39 : {
40 2 : return _manager->get_aspect().template get<_begin_>()(*_manager, fas::type2type<pointer>() );
41 : }
42 :
43 : const_pointer begin() const
44 : {
45 : return _manager->get_aspect().template get<_begin_>()(*_manager, fas::type2type<const_pointer>() );
46 : }
47 :
48 2 : pointer end()
49 : {
50 2 : return _manager->get_aspect().template get<_end_>()(*_manager, fas::type2type<pointer>() );
51 : }
52 :
53 : const_pointer end() const
54 : {
55 : return _manager->get_aspect().template get<_end_>()(*_manager, fas::type2type<const_pointer>() );
56 : }
57 :
58 36 : pointer allocate(size_t num, void * hint = fas_nullptr)
59 : {
60 36 : return _manager->get_aspect().template get<_allocate_>()(*_manager, fas::type2type<pointer>(), num, hint );
61 : }
62 :
63 2 : void deallocate(pointer ptr, size_type num)
64 : {
65 2 : return _manager->get_aspect().template get<_deallocate_>()(*_manager, ptr, num );
66 : }
67 :
68 7 : buffer_type buffer()
69 : {
70 7 : return buffer_type(_manager);
71 : }
72 :
73 : const buffer_type buffer() const
74 : {
75 : return buffer_type(_manager);
76 : }
77 :
78 : size_type count() const
79 : {
80 : return _manager->get_aspect().template get<_count_>()(*_manager);
81 : }
82 :
83 : size_type capacity() const
84 : {
85 : return _manager->get_aspect().template get<_capacity_>()(*_manager);
86 : }
87 :
88 : private:
89 :
90 : manager* _manager;
91 : };
92 :
93 : }}
94 :
95 :
96 :
97 : #endif
|