1 | #ifndef BOOST_RANGE_DEFINE_ADAPTOR_HPP_INCLUDED |
---|
2 | #define BOOST_RANGE_DEFINE_ADAPTOR_HPP_INCLUDED |
---|
3 | |
---|
4 | #include <boost/tuple/tuple.hpp> |
---|
5 | |
---|
6 | #define BOOST_DEFINE_RANGE_ADAPTOR( adaptor_name, range_adaptor ) \ |
---|
7 | struct adaptor_name##_forwarder {}; \ |
---|
8 | \ |
---|
9 | template<typename Range> range_adaptor <Range> \ |
---|
10 | operator|(Range& rng, adaptor_name##_forwarder) \ |
---|
11 | { \ |
---|
12 | return range_adaptor <Range>( rng ); \ |
---|
13 | } \ |
---|
14 | \ |
---|
15 | template<typename Range> range_adaptor <const Range> \ |
---|
16 | operator|(const Range& rng, adaptor_name##_forwarder) \ |
---|
17 | { \ |
---|
18 | return range_adaptor <const Range>( rng ); \ |
---|
19 | } \ |
---|
20 | \ |
---|
21 | static adaptor_name##_forwarder adaptor_name = adaptor_name##_forwarder(); \ |
---|
22 | \ |
---|
23 | template<typename Range> \ |
---|
24 | range_adaptor <Range> \ |
---|
25 | make_##adaptor_name(Range& rng) \ |
---|
26 | { \ |
---|
27 | return range_adaptor <Range>(rng); \ |
---|
28 | } \ |
---|
29 | \ |
---|
30 | template<typename Range> \ |
---|
31 | range_adaptor <const Range> \ |
---|
32 | make_##adaptor_name(const Range& rng) \ |
---|
33 | { \ |
---|
34 | return range_adaptor <const Range>(rng); \ |
---|
35 | } |
---|
36 | |
---|
37 | #define BOOST_DEFINE_RANGE_ADAPTOR_1( adaptor_name, range_adaptor, adaptor_class ) \ |
---|
38 | template<typename Range> range_adaptor <Range> \ |
---|
39 | operator|(Range& rng, const adaptor_name & args) \ |
---|
40 | { \ |
---|
41 | return range_adaptor <Range>(rng, args.arg1); \ |
---|
42 | } \ |
---|
43 | template<typename Range> range_adaptor <const Range> \ |
---|
44 | operator|(const Range& rng, const adaptor_name & args) \ |
---|
45 | { \ |
---|
46 | return range_adaptor <Range>(rng, args.arg1); \ |
---|
47 | } \ |
---|
48 | template<typename Range, typename Arg1> \ |
---|
49 | range_adaptor<Range> \ |
---|
50 | make_##adaptor_name(Range& rng, Arg1 arg1) \ |
---|
51 | { \ |
---|
52 | return range_adaptor<Range>(rng, arg1); \ |
---|
53 | } |
---|
54 | |
---|
55 | #define BOOST_DEFINE_RANGE_ADAPTOR_1( adaptor_name, range_adaptor, arg1_type ) \ |
---|
56 | struct adaptor_name \ |
---|
57 | { \ |
---|
58 | explicit adaptor_name (arg1_type arg1_) \ |
---|
59 | : arg1(arg1_) {} \ |
---|
60 | arg1_type arg1; \ |
---|
61 | }; \ |
---|
62 | \ |
---|
63 | template<typename Range> range_adaptor <Range> \ |
---|
64 | operator|(Range& rng, adaptor_name args) \ |
---|
65 | { \ |
---|
66 | return range_adaptor <Range>(rng, args.arg1); \ |
---|
67 | } \ |
---|
68 | \ |
---|
69 | template<typename Range> range_adaptor <const Range> \ |
---|
70 | operator|(const Range& rng, adaptor_name args) \ |
---|
71 | { \ |
---|
72 | return range_adaptor <const Range>(rng, args.arg1); \ |
---|
73 | } \ |
---|
74 | \ |
---|
75 | template<typename Range> \ |
---|
76 | range_adaptor <Range> \ |
---|
77 | make_##adaptor_name(Range& rng, arg1_type arg1) \ |
---|
78 | { \ |
---|
79 | return range_adaptor <Range>(rng, arg1); \ |
---|
80 | } \ |
---|
81 | \ |
---|
82 | template<typename Range> \ |
---|
83 | range_adaptor <const Range> \ |
---|
84 | make_##adaptor_name(const Range& rng, arg1_type arg1) \ |
---|
85 | { \ |
---|
86 | return range_adaptor <const Range>(rng, arg1); \ |
---|
87 | } |
---|
88 | |
---|
89 | #define BOOST_RANGE_ADAPTOR_2( adaptor_name, range_adaptor, arg1_type, arg2_type ) \ |
---|
90 | struct adaptor_name \ |
---|
91 | { \ |
---|
92 | explicit adaptor_name (arg1_type arg1_, arg2_type arg2_) \ |
---|
93 | : arg1(arg1_), arg2(arg2_) {} \ |
---|
94 | arg1_type arg1; \ |
---|
95 | arg2_type arg2; \ |
---|
96 | }; \ |
---|
97 | \ |
---|
98 | template<typename Range> range_adaptor <Range> \ |
---|
99 | operator|(Range& rng, adaptor_name args) \ |
---|
100 | { \ |
---|
101 | return range_adaptor <Range>(rng, args.arg1, args.arg2); \ |
---|
102 | } \ |
---|
103 | template<typename Range> \ |
---|
104 | range_adaptor <Range> \ |
---|
105 | make_##adaptor_name(Range& rng, arg1_type arg1, arg2_type arg2) \ |
---|
106 | { \ |
---|
107 | return range_adaptor <Range>(rng, arg1, arg2); \ |
---|
108 | } \ |
---|
109 | template<typename Range> \ |
---|
110 | range_adaptor <const Range> \ |
---|
111 | make_##adaptor_name(const Range& rng, arg1_type arg1, arg2_type arg2) \ |
---|
112 | { \ |
---|
113 | return range_adaptor <const Range>(rng, arg1, arg2); \ |
---|
114 | } |
---|
115 | |
---|
116 | |
---|
117 | #endif // include guard |
---|