]> git.sesse.net Git - casparcg/blob - dependencies/boost/boost/range/adaptor/define_adaptor.hpp
Manually merged pull request #222
[casparcg] / dependencies / boost / boost / range / adaptor / define_adaptor.hpp
1 // Boost.Range library
2 //
3 //  Copyright Neil Groves 2010. Use, modification and
4 //  distribution is subject to the Boost Software License, Version
5 //  1.0. (See accompanying file LICENSE_1_0.txt or copy at
6 //  http://www.boost.org/LICENSE_1_0.txt)
7 //
8 // For more information, see http://www.boost.org/libs/range/
9 //
10
11 #ifndef BOOST_RANGE_DEFINE_ADAPTOR_HPP_INCLUDED
12 #define BOOST_RANGE_DEFINE_ADAPTOR_HPP_INCLUDED
13
14 #include <boost/tuple/tuple.hpp>
15
16 #define BOOST_DEFINE_RANGE_ADAPTOR( adaptor_name, range_adaptor ) \
17     struct adaptor_name##_forwarder {}; \
18     \
19     template<typename Range> range_adaptor <Range> \
20         operator|(Range& rng, adaptor_name##_forwarder) \
21     { \
22         return range_adaptor <Range>( rng ); \
23     } \
24     \
25     template<typename Range> range_adaptor <const Range> \
26         operator|(const Range& rng, adaptor_name##_forwarder) \
27     { \
28         return range_adaptor <const Range>( rng ); \
29     } \
30     \
31     static adaptor_name##_forwarder adaptor_name = adaptor_name##_forwarder(); \
32     \
33     template<typename Range> \
34     range_adaptor <Range> \
35     make_##adaptor_name(Range& rng) \
36     { \
37         return range_adaptor <Range>(rng); \
38     } \
39     \
40     template<typename Range> \
41     range_adaptor <const Range> \
42     make_##adaptor_name(const Range& rng) \
43     { \
44         return range_adaptor <const Range>(rng); \
45     }
46
47 #define BOOST_DEFINE_RANGE_ADAPTOR_1( adaptor_name, range_adaptor, arg1_type ) \
48     struct adaptor_name \
49     { \
50         explicit adaptor_name (arg1_type arg1_) \
51             : arg1(arg1_) {} \
52         arg1_type arg1; \
53     }; \
54     \
55     template<typename Range> range_adaptor <Range> \
56         operator|(Range& rng, adaptor_name args) \
57     { \
58         return range_adaptor <Range>(rng, args.arg1); \
59     } \
60     \
61     template<typename Range> range_adaptor <const Range> \
62         operator|(const Range& rng, adaptor_name args) \
63     { \
64         return range_adaptor <const Range>(rng, args.arg1); \
65     } \
66     \
67     template<typename Range> \
68     range_adaptor <Range> \
69     make_##adaptor_name(Range& rng, arg1_type arg1) \
70     { \
71         return range_adaptor <Range>(rng, arg1); \
72     } \
73     \
74     template<typename Range> \
75     range_adaptor <const Range> \
76     make_##adaptor_name(const Range& rng, arg1_type arg1) \
77     { \
78         return range_adaptor <const Range>(rng, arg1); \
79     }
80
81 #define BOOST_RANGE_ADAPTOR_2( adaptor_name, range_adaptor, arg1_type, arg2_type ) \
82     struct adaptor_name \
83     { \
84         explicit adaptor_name (arg1_type arg1_, arg2_type arg2_) \
85             : arg1(arg1_), arg2(arg2_) {} \
86         arg1_type arg1; \
87         arg2_type arg2; \
88     }; \
89     \
90     template<typename Range> range_adaptor <Range> \
91     operator|(Range& rng, adaptor_name args) \
92     { \
93         return range_adaptor <Range>(rng, args.arg1, args.arg2); \
94     } \
95     template<typename Range> \
96     range_adaptor <Range> \
97     make_##adaptor_name(Range& rng, arg1_type arg1, arg2_type arg2) \
98     { \
99         return range_adaptor <Range>(rng, arg1, arg2); \
100     } \
101     template<typename Range> \
102     range_adaptor <const Range> \
103     make_##adaptor_name(const Range& rng, arg1_type arg1, arg2_type arg2) \
104     { \
105         return range_adaptor <const Range>(rng, arg1, arg2); \
106     }
107
108
109 #endif // include guard