Imported Upstream version 14.45.10
[platform/upstream/libzypp.git] / zypp / base / Iterable.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/base/Iterable.h
10  */
11 #ifndef ZYPP_BASE_ITERABLE_H
12 #define ZYPP_BASE_ITERABLE_H
13
14 #include <iterator>
15
16 ///////////////////////////////////////////////////////////////////
17 namespace zypp
18 {
19   ///////////////////////////////////////////////////////////////////
20   /// \class Iterable
21   /// \brief
22   /// \code
23   ///   struct Foo
24   ///   {
25   ///     class Iterator;
26   ///     typedef Iterable<Iterator> IterableType;
27   ///
28   ///     Iterator myBegin();
29   ///     Iterator myEnd();
30   ///
31   ///     IterableType iterate() { return makeIterable( myBegin(), myEnd() ); }
32   ///   };
33   /// \endcode
34   ///////////////////////////////////////////////////////////////////
35   template <class TIterator>
36   class Iterable
37   {
38   public:
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;
46
47     /** Ctor taking the iterator pair */
48     Iterable()
49     {}
50
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) )
55     {}
56
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) )
61     {}
62
63     iterator_type begin() const
64     { return _begin; }
65
66     iterator_type end() const
67     { return _end; }
68
69     bool empty() const
70     { return( _begin == _end ); }
71
72     size_type size() const
73     { size_type ret = 0; for ( iterator_type i = _begin; i != _end; ++i ) ++ret; return ret; }
74
75     bool contains( const value_type & val_r ) const
76     { return( find( val_r ) != _end ); }
77
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; }
80
81   private:
82     iterator_type _begin;
83     iterator_type _end;
84   };
85
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) ); }
90
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) ); }
95 } // namespace zypp
96 ///////////////////////////////////////////////////////////////////
97 #endif // ZYPP_BASE_ITERABLE_H