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_BUFFER_PERSISTENT_PROVIDER_HPP
8 : #define VSET_BUFFER_PERSISTENT_PROVIDER_HPP
9 :
10 : #include <vset/buffer/provider.hpp>
11 : #include <vset/buffer/persistent/tags.hpp>
12 :
13 :
14 : namespace vset { namespace buffer{
15 :
16 : template<typename T>
17 : class persistent_provider
18 : : public provider<T>
19 : {
20 : using provider<T>::_target;
21 : public:
22 : typedef typename T::aspect::template advice_cast<_data_type_>::type data_type;
23 : typedef typename T::aspect::template advice_cast<_size_type_>::type size_type;
24 :
25 23 : explicit persistent_provider(T* target)
26 23 : : provider<T>(target)
27 : {
28 23 : }
29 :
30 6 : void close()
31 : {
32 6 : _target->get_aspect().template gete< persistent::_before_close_ >()(*_target);
33 6 : _target->get_aspect().template get< persistent::_close_ >()(*_target);
34 6 : _target->get_aspect().template gete< persistent::_after_close_ >()(*_target);
35 6 : }
36 :
37 9 : void open(const char* path)
38 : {
39 9 : _target->get_aspect().template gete< persistent::_before_open_>()(*_target);
40 9 : _target->get_aspect().template get< persistent::_open_>()(*_target, path);
41 9 : _target->get_aspect().template gete< persistent::_after_open_>()(*_target);
42 9 : }
43 :
44 2 : size_type sync()
45 : {
46 2 : _target->get_aspect().template gete< persistent::_before_sync_ >()(*_target);
47 2 : size_type result = _target->get_aspect().template get<persistent::_sync_>()(*_target);
48 2 : _target->get_aspect().template gete< persistent::_after_sync_>()(*_target, result);
49 2 : return result;
50 : }
51 :
52 : size_type sync(size_type offset, size_type size )
53 : {
54 : _target->get_aspect().template gete< persistent::_before_sync_ >()(*_target, offset, size);
55 : size_type result = _target->get_aspect().template get<persistent::_sync_>()(*_target, offset, size);
56 : _target->get_aspect().template gete< persistent::_after_sync_>()(*_target, result);
57 : return result;
58 : }
59 :
60 : size_type sync(bool async)
61 : {
62 : _target->get_aspect().template gete< persistent::_before_sync_ >()(*_target, async);
63 : size_type result = _target->get_aspect().template get<persistent::_sync_>()(*_target, async);
64 : _target->get_aspect().template gete< persistent::_after_sync_>()(*_target, result, async);
65 : return result;
66 : }
67 :
68 : size_type sync(size_type offset, size_type size, bool async )
69 : {
70 : _target->get_aspect().template gete< persistent::_before_sync_ >()(*_target, offset, size, async);
71 : size_type result = _target->get_aspect().template get<persistent::_sync_>()(*_target, offset, size, async);
72 : _target->get_aspect().template gete< persistent::_after_sync_>()(*_target, result, async);
73 : return result;
74 : }
75 : };
76 :
77 : }}
78 :
79 : #endif
|