IteratorRange.h
Go to the documentation of this file.
1 #ifndef _utl_IteratorRange_h_
2 #define _utl_IteratorRange_h_
3 
4 #include <boost/range/iterator_range.hpp>
5 
6 
7 /*
8  \author Darko Veberic
9  \date 04 Jun 2020
10 */
11 
12 /*
13  The iterator ranges are suitable for *named* Begin/End iterators, eg
14 
15  class Foo {
16  BarIterator BarsBegin();
17  BarIterator BarsEnd();
18  ConstBarIterator BarsBegin() const;
19  ConstBarIterator BarsEnd() const;
20  OFFLINE_MAKE_BOTH_ITERATOR_RANGES(BarIterator, ConstBarIterator, Bars)
21  };
22 */
23 
24 #define OFFLINE_MAKE_ITERATOR_RANGE(_Iterator_, _NamePrefix_) \
25  boost::iterator_range<_Iterator_> _NamePrefix_##Range() \
26  { return boost::make_iterator_range(_NamePrefix_##Begin(), _NamePrefix_##End()); }
27 
28 #define OFFLINE_MAKE_CONST_ITERATOR_RANGE(_ConstIterator_, _NamePrefix_) \
29  boost::iterator_range<_ConstIterator_> _NamePrefix_##Range() const \
30  { return boost::make_iterator_range(_NamePrefix_##Begin(), _NamePrefix_##End()); }
31 
32 #define OFFLINE_DECLARE_CONST_ITERATOR_RANGE(_ConstIterator_, _NamePrefix_) \
33  boost::iterator_range<_ConstIterator_> _NamePrefix_##Range() const
34 
35 #define OFFLINE_DEFINE_CONST_ITERATOR_RANGE(_ConstIterator_, _Class_, _NamePrefix_) \
36  boost::iterator_range<_Class_::_ConstIterator_> \
37  _Class_::_NamePrefix_##Range() \
38  const \
39  { \
40  return boost::make_iterator_range(_NamePrefix_##Begin(), _NamePrefix_##End()); \
41  }
42 
43 #define OFFLINE_MAKE_BOTH_ITERATOR_RANGES(_Iterator_, _ConstIterator_, _NamePrefix_) \
44  OFFLINE_MAKE_ITERATOR_RANGE(_Iterator_, _NamePrefix_) \
45  OFFLINE_MAKE_CONST_ITERATOR_RANGE(_ConstIterator_, _NamePrefix_)
46 
47 
48 /*
49  Ranges for iterators with one argument
50 
51  class Foo {
52  BarIterator BarsBegin(Type var);
53  BarIterator BarsEnd(Type var);
54  ConstBarIterator BarsBegin(Type var) const;
55  ConstBarIterator BarsEnd(Type var) const;
56  # note, "arg" has to be explicitly used as the variable name:
57  OFFLINE_MAKE_BOTH_ITERATOR_RANGES_ARG(BarIterator, ConstBarIterator, Bars, Type arg)
58  };
59 */
60 
61 #define OFFLINE_MAKE_ITERATOR_RANGE_ARG(_Iterator_, _NamePrefix_, _Arg_) \
62  boost::iterator_range<_Iterator_> _NamePrefix_##Range(_Arg_) \
63  { return boost::make_iterator_range(_NamePrefix_##Begin(arg), _NamePrefix_##End(arg)); }
64 
65 #define OFFLINE_MAKE_CONST_ITERATOR_RANGE_ARG(_ConstIterator_, _NamePrefix_, _Arg_) \
66  boost::iterator_range<_ConstIterator_> _NamePrefix_##Range(_Arg_) const \
67  { return boost::make_iterator_range(_NamePrefix_##Begin(arg), _NamePrefix_##End(arg)); }
68 
69 #define OFFLINE_MAKE_BOTH_ITERATOR_RANGES_ARG(_Iterator_, _ConstIterator_, _NamePrefix_, _Arg_) \
70  OFFLINE_MAKE_ITERATOR_RANGE_ARG(_Iterator_, _NamePrefix_, _Arg_) \
71  OFFLINE_MAKE_CONST_ITERATOR_RANGE_ARG(_ConstIterator_, _NamePrefix_, _Arg_)
72 
73 
74 /*
75  Ranges for iterators with two arguments
76 
77  class Foo {
78  BarIterator BarsBegin(Type1 v1, Type2 v2);
79  BarIterator BarsEnd(Type1 v1, Type2 v2);
80  ConstBarIterator BarsBegin(Type1 v1, Type2 v2) const;
81  ConstBarIterator BarsEnd(Type1 v1, Type2 v2) const;
82  # note, "arg1" and "arg2" have to be explicitely used as varaible names:
83  OFFLINE_MAKE_BOTH_ITERATOR_RANGES_ARG(BarIterator, ConstBarIterator, Bars, Type1 arg1, Type2 arg2)
84  };
85 */
86 
87 #define OFFLINE_MAKE_ITERATOR_RANGE_ARG2(_Iterator_, _NamePrefix_, _Arg1_, _Arg2_) \
88  boost::iterator_range<_Iterator_> _NamePrefix_##Range(_Arg1_, _Arg2_) \
89  { return boost::make_iterator_range(_NamePrefix_##Begin(arg1, arg2), _NamePrefix_##End(arg1, arg2)); }
90 
91 #define OFFLINE_MAKE_CONST_ITERATOR_RANGE_ARG2(_ConstIterator_, _NamePrefix_, _Arg1_, _Arg2_) \
92  boost::iterator_range<_ConstIterator_> _NamePrefix_##Range(_Arg1_, _Arg2_) const \
93  { return boost::make_iterator_range(_NamePrefix_##Begin(arg1, arg2), _NamePrefix_##End(arg1, arg2)); }
94 
95 #define OFFLINE_MAKE_BOTH_ITERATOR_RANGES_ARG2(_Iterator_, _ConstIterator_, _NamePrefix_, _Arg1_, _Arg2_) \
96  OFFLINE_MAKE_ITERATOR_RANGE_ARG2(_Iterator_, _NamePrefix_, _Arg1_, _Arg2_) \
97  OFFLINE_MAKE_CONST_ITERATOR_RANGE_ARG2(_ConstIterator_, _NamePrefix_, _Arg1_, _Arg2_)
98 
99 
100 /*
101  The friend are for classes that have only one Begin/End pair, eg
102 
103  class Foo {
104  Iterator Begin();
105  Iterator End();
106  ConstIterator Begin() const;
107  ConstIterator End() const;
108  OFFLINE_MAKE_BOTH_FRIEND_RANGES(Iterator, ConstIterator, Foo)
109  };
110 */
111 
112 #define OFFLINE_MAKE_FRIEND_RANGES(_Iterator_, _Class_) \
113  friend _Iterator_ begin(_Class_& x) { return x.Begin(); } \
114  friend _Iterator_ end(_Class_& x) { return x.End(); }
115 
116 #define OFFLINE_MAKE_FRIEND_CONST_RANGES(_ConstIterator_, _Class_) \
117  friend _ConstIterator_ begin(const _Class_& x) { return x.Begin(); } \
118  friend _ConstIterator_ cbegin(const _Class_& x) { return x.Begin(); } \
119  friend _ConstIterator_ end(const _Class_& x) { return x.End(); } \
120  friend _ConstIterator_ cend(const _Class_& x) { return x.End(); }
121 
122 #define OFFLINE_MAKE_BOTH_FRIEND_RANGES(_Iterator_, _ConstIterator_, _Class_) \
123  OFFLINE_MAKE_FRIEND_RANGES(_Iterator_, _Class_) \
124  OFFLINE_MAKE_FRIEND_CONST_RANGES(_ConstIterator_, _Class_)
125 
126 
127 #endif

, generated on Tue Sep 26 2023.