]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/range/include/boost/range/adaptor/define_adaptor.hpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / range / include / 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