1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/base/Iterable.h
11 #ifndef ZYPP_BASE_ITERABLE_H
12 #define ZYPP_BASE_ITERABLE_H
16 ///////////////////////////////////////////////////////////////////
19 ///////////////////////////////////////////////////////////////////
26 /// typedef Iterable<Iterator> IterableType;
28 /// Iterator myBegin();
31 /// IterableType iterate() { return makeIterable( myBegin(), myEnd() ); }
34 ///////////////////////////////////////////////////////////////////
35 template <class TIterator>
39 typedef size_t size_type;
40 typedef TIterator iterator_type;
41 typedef typename std::iterator_traits<iterator_type>::value_type value_type;
42 typedef typename std::iterator_traits<iterator_type>::difference_type difference_type;
43 typedef typename std::iterator_traits<iterator_type>::pointer pointer;
44 typedef typename std::iterator_traits<iterator_type>::reference reference;
45 typedef typename std::iterator_traits<iterator_type>::iterator_category iterator_category;
47 /** Ctor taking the iterator pair */
51 /** Ctor taking the iterator pair */
52 Iterable( iterator_type begin_r, iterator_type end_r )
53 : _begin( std::move(begin_r) )
54 , _end( std::move(end_r) )
57 /** Ctor taking the iterator pair */
58 Iterable( std::pair<iterator_type,iterator_type> range_r )
59 : _begin( std::move(range_r.first) )
60 , _end( std::move(range_r.second) )
63 iterator_type begin() const
66 iterator_type end() const
70 { return( _begin == _end ); }
72 size_type size() const
73 { size_type ret = 0; for ( iterator_type i = _begin; i != _end; ++i ) ++ret; return ret; }
75 bool contains( const value_type & val_r ) const
76 { return( find( val_r ) != _end ); }
78 iterator_type find( const value_type & val_r ) const
79 { iterator_type ret = _begin; for ( ; ret != _end; ++ret ) if ( *ret == val_r ) break; return ret; }
86 /** \relates Iterable convenient construction. */
87 template <class TIterator>
88 Iterable<TIterator> makeIterable( TIterator && begin_r, TIterator && end_r )
89 { return Iterable<TIterator>( std::forward<TIterator>(begin_r), std::forward<TIterator>(end_r) ); }
91 /** \relates Iterable convenient construction. */
92 template <class TIterator>
93 Iterable<TIterator> makeIterable( std::pair<TIterator,TIterator> && range_r )
94 { return Iterable<TIterator>( std::forward<std::pair<TIterator,TIterator>>(range_r) ); }
96 ///////////////////////////////////////////////////////////////////
97 #endif // ZYPP_BASE_ITERABLE_H