libzypp
10.5.0
|
00001 /*---------------------------------------------------------------------\ 00002 | ____ _ __ __ ___ | 00003 | |__ / \ / / . \ . \ | 00004 | / / \ V /| _/ _/ | 00005 | / /__ | | | | | | | 00006 | /_____||_| |_| |_| | 00007 | | 00008 \---------------------------------------------------------------------*/ 00012 #ifndef ZYPP_BASE_ITERATOR_H 00013 #define ZYPP_BASE_ITERATOR_H 00014 00015 #include <iterator> 00016 #include <utility> 00017 00018 #include <boost/functional.hpp> 00019 #include <boost/iterator/filter_iterator.hpp> 00020 #include <boost/iterator/transform_iterator.hpp> 00021 #include <boost/function_output_iterator.hpp> 00022 00024 namespace zypp 00025 { 00026 00066 00093 using boost::filter_iterator; 00094 using boost::make_filter_iterator; 00095 00097 template<class _Filter, class _Container> 00098 filter_iterator<_Filter, typename _Container::const_iterator> 00099 make_filter_begin( _Filter f, const _Container & c ) 00100 { 00101 return make_filter_iterator( f, c.begin(), c.end() ); 00102 } 00103 00105 template<class _Filter, class _Container> 00106 filter_iterator<_Filter, typename _Container::const_iterator> 00107 make_filter_begin( const _Container & c ) 00108 { 00109 return make_filter_iterator( _Filter(), c.begin(), c.end() ); 00110 } 00111 00113 template<class _Filter, class _Container> 00114 filter_iterator<_Filter, typename _Container::const_iterator> 00115 make_filter_end( _Filter f, const _Container & c ) 00116 { 00117 return make_filter_iterator( f, c.end(), c.end() ); 00118 } 00119 00121 template<class _Filter, class _Container> 00122 filter_iterator<_Filter, typename _Container::const_iterator> 00123 make_filter_end( const _Container & c ) 00124 { 00125 return make_filter_iterator( _Filter(), c.end(), c.end() ); 00126 } 00127 00146 using boost::transform_iterator; 00147 using boost::make_transform_iterator; 00148 00152 template<class _Pair> 00153 struct GetPairFirst : public std::unary_function<_Pair, const typename _Pair::first_type &> 00154 { 00155 const typename _Pair::first_type & operator()( const _Pair & pair_r ) const 00156 { return pair_r.first; } 00157 }; 00158 00162 template<class _Pair> 00163 struct GetPairSecond : public std::unary_function<_Pair, const typename _Pair::second_type &> 00164 { 00165 const typename _Pair::second_type & operator()( const _Pair & pair_r ) const 00166 { return pair_r.second; } 00167 }; 00168 00207 template<class _Map> 00208 struct MapKVIteratorTraits 00209 { 00211 typedef _Map MapType; 00213 typedef typename _Map::key_type KeyType; 00215 typedef transform_iterator<GetPairFirst<typename MapType::value_type>, 00216 typename MapType::const_iterator> Key_const_iterator; 00218 typedef typename _Map::mapped_type ValueType; 00220 typedef transform_iterator<GetPairSecond<typename MapType::value_type>, 00221 typename MapType::const_iterator> Value_const_iterator; 00222 }; 00223 00225 template<class _Map> 00226 inline typename MapKVIteratorTraits<_Map>::Key_const_iterator make_map_key_begin( const _Map & map_r ) 00227 { return make_transform_iterator( map_r.begin(), GetPairFirst<typename _Map::value_type>() ); } 00228 00230 template<class _Map> 00231 inline typename MapKVIteratorTraits<_Map>::Key_const_iterator make_map_key_end( const _Map & map_r ) 00232 { return make_transform_iterator( map_r.end(), GetPairFirst<typename _Map::value_type>() ); } 00233 00235 template<class _Map> 00236 inline typename MapKVIteratorTraits<_Map>::Value_const_iterator make_map_value_begin( const _Map & map_r ) 00237 { return make_transform_iterator( map_r.begin(), GetPairSecond<typename _Map::value_type>() ); } 00238 00240 template<class _Map> 00241 inline typename MapKVIteratorTraits<_Map>::Value_const_iterator make_map_value_end( const _Map & map_r ) 00242 { return make_transform_iterator( map_r.end(), GetPairSecond<typename _Map::value_type>() ); } 00243 00245 template<class _Map> 00246 inline typename MapKVIteratorTraits<_Map>::Key_const_iterator make_map_key_lower_bound( const _Map & map_r, const typename _Map::key_type & key_r ) 00247 { return make_transform_iterator( map_r.lower_bound( key_r ), GetPairFirst<typename _Map::value_type>() ); } 00248 00250 template<class _Map> 00251 inline typename MapKVIteratorTraits<_Map>::Key_const_iterator make_map_key_upper_bound( const _Map & map_r, const typename _Map::key_type & key_r ) 00252 { return make_transform_iterator( map_r.upper_bound( key_r ), GetPairFirst<typename _Map::value_type>() ); } 00253 00255 template<class _Map> 00256 inline typename MapKVIteratorTraits<_Map>::Value_const_iterator make_map_value_lower_bound( const _Map & map_r, const typename _Map::key_type & key_r ) 00257 { return make_transform_iterator( map_r.lower_bound( key_r ), GetPairSecond<typename _Map::value_type>() ); } 00258 00260 template<class _Map> 00261 inline typename MapKVIteratorTraits<_Map>::Value_const_iterator make_map_value_upper_bound( const _Map & map_r, const typename _Map::key_type & key_r ) 00262 { return make_transform_iterator( map_r.upper_bound( key_r ), GetPairSecond<typename _Map::value_type>() ); } 00263 00278 using boost::function_output_iterator; 00279 using boost::make_function_output_iterator; 00280 00282 00283 } // namespace zypp 00285 #endif // ZYPP_BASE_ITERATOR_H