[3408] | 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 |
---|