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_VALUE_HPP
8 : #define VSET_VTREE_ASPECT_AD_ERASE_VALUE_HPP
9 :
10 : #include <vset/vtree/aspect/tags.hpp>
11 :
12 : namespace vset{ namespace vtree{
13 :
14 : #ifdef __GXX_EXPERIMENTAL_CXX0X__
15 :
16 29 : struct ad_erase_value
17 : {
18 : template<typename T>
19 16847 : typename T::size_type operator()(T& t, const typename T::key_type& value)
20 : {
21 : typedef typename T::size_type size_type;
22 : typedef typename T::const_iterator iterator_type;
23 16847 : iterator_type lower( t.get_aspect().template get<_lower_bound_>()(t, value) );
24 16847 : iterator_type upper( t.get_aspect().template get<_upper_bound_>()(t, value) );
25 16847 : size_type result = static_cast<size_type>( std::distance(lower, upper) );
26 :
27 16847 : t.get_aspect().template get<_erase_range_>()( t, lower, upper );
28 16847 : return result;
29 : }
30 : };
31 :
32 : #else
33 :
34 : struct ad_erase_value
35 : {
36 : template<typename T>
37 : typename T::size_type operator()(T& t, const typename T::key_type& value)
38 : {
39 : typedef typename T::size_type size_type;
40 : typename T::iterator lower = t.get_aspect().template get<_lower_bound_>()(t, value);
41 : typename T::iterator upper = t.get_aspect().template get<_upper_bound_>()(t, value);
42 : size_type result = static_cast<size_type>( std::distance(lower, upper) );
43 :
44 : t.get_aspect().template get<_erase_range_>()( t, lower, upper );
45 : return result;
46 : }
47 : };
48 :
49 :
50 : #endif
51 :
52 :
53 :
54 : }}
55 :
56 : #endif
|