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_MEMORY_FSB_OFFSET_PROVIDER_HPP
8 : #define VSET_VSET_MEMORY_FSB_OFFSET_PROVIDER_HPP
9 :
10 : #include <fas/system/nullptr.hpp>
11 : #include <vset/memory/fsb/tags.hpp>
12 : #include <cassert>
13 : #include <stdexcept>
14 :
15 : namespace vset { namespace memory{ namespace fsb{
16 :
17 : template<typename T>
18 : class offset_provider
19 : {
20 : public:
21 : typedef typename T::aspect::template advice_cast<_value_type_>::type value_type;
22 : typedef value_type* pointer;
23 : typedef const value_type* const_pointer;
24 : typedef value_type& reference;
25 : typedef const value_type& const_reference;
26 :
27 4 : offset_provider()
28 4 : : _target(fas_nullptr)
29 4 : {}
30 :
31 61696 : offset_provider(T* off, size_t=static_cast<size_t>(-1))
32 61696 : : _target(off)
33 61696 : {}
34 :
35 4407 : const value_type* get(size_t off) const
36 : {
37 4407 : assert(_target!=fas_nullptr);
38 4407 : return _target->get_aspect().template get<_ptr_by_offset_>()(*_target, off);
39 : }
40 :
41 2749202 : value_type* get(size_t off)
42 : {
43 2749202 : assert(_target!=fas_nullptr);
44 2749202 : return _target->get_aspect().template get<_ptr_by_offset_>()(*_target, off);
45 : }
46 :
47 11622 : size_t offset(value_type* p) const
48 : {
49 11622 : assert(_target!=fas_nullptr);
50 11622 : return _target->get_aspect().template get<_offset_by_ptr_>()(*_target, p);
51 : }
52 :
53 114060 : size_t next(size_t off, size_t cnt = 1) const
54 : {
55 114060 : assert(_target!=fas_nullptr);
56 114060 : return _target->get_aspect().template get<_next_offset_>()(*_target, off, cnt);
57 : }
58 :
59 22347 : size_t pred(size_t off, size_t cnt = 1) const
60 : {
61 22347 : assert(_target!=fas_nullptr);
62 22347 : return _target->get_aspect().template get<_pred_offset_>()(*_target, off, cnt);
63 : }
64 :
65 20225 : bool operator == (const offset_provider<T> right) const
66 : {
67 20225 : return _target==right._target;
68 : }
69 :
70 : private:
71 : T *_target;
72 : };
73 :
74 :
75 : }}}
76 :
77 : #endif
|