libzypp  10.5.0
Iterator.h
Go to the documentation of this file.
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