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_VTREE_ASPECT_AD_ERASE_RANGE_HPP
8 : #define VSET_VTREE_ASPECT_AD_ERASE_RANGE_HPP
9 :
10 : #include <vset/vtree/aspect/tags.hpp>
11 :
12 : namespace vset{ namespace vtree{
13 :
14 :
15 : #ifdef __GXX_EXPERIMENTAL_CXX0X__
16 :
17 29 : struct ad_erase_range
18 : {
19 : template<typename T>
20 : typename T::iterator
21 16847 : operator()(T& t, typename T::const_iterator beg, typename T::const_iterator end)
22 : {
23 : typedef typename T::difference_type difference_type;
24 16847 : typename T::iterator last = t.end();
25 :
26 16847 : difference_type dist = std::distance(beg, end);
27 16847 : if (dist!=0)
28 : {
29 16846 : last = t.get_aspect().template get<_erase_iterator_>()(t, beg, false);
30 16852 : for ( --dist; dist != 0; --dist)
31 : {
32 6 : last = t.get_aspect().template get<_erase_iterator_>()(t, last, false);
33 : }
34 : }
35 :
36 16847 : t.get_aspect().template get<_defrag_container_>()(t, last);
37 16847 : return last;
38 : }
39 : };
40 :
41 : #else
42 :
43 : struct ad_erase_range
44 : {
45 : template<typename T>
46 : void operator()(T& t, typename T::iterator beg, typename T::iterator end)
47 : {
48 : typedef typename T::difference_type difference_type;
49 : difference_type dist = std::distance(beg, end);
50 : for ( ;dist!=0; --dist)
51 : {
52 : beg = t.get_aspect().template get<_erase_iterator_>()(t, beg, false);
53 : }
54 : t.get_aspect().template get<_defrag_container_>()(t, beg);
55 : }
56 : };
57 :
58 : #endif
59 :
60 : }}
61 :
62 : #endif
|