Iterator.h
Go to the documentation of this file.00001
00002
00003
00004
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
00258 using boost::function_output_iterator;
00259 using boost::make_function_output_iterator;
00260
00262
00263 }
00265 #endif // ZYPP_BASE_ITERATOR_H