Chris@16: // Boost.Range library Chris@16: // Chris@16: // Copyright Neil Groves 2010. Use, modification and Chris@16: // distribution is subject to the Boost Software License, Version Chris@16: // 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: // For more information, see http://www.boost.org/libs/range/ Chris@16: // Chris@16: Chris@16: #ifndef BOOST_RANGE_DEFINE_ADAPTOR_HPP_INCLUDED Chris@16: #define BOOST_RANGE_DEFINE_ADAPTOR_HPP_INCLUDED Chris@16: Chris@16: #include Chris@16: Chris@16: #define BOOST_DEFINE_RANGE_ADAPTOR( adaptor_name, range_adaptor ) \ Chris@16: struct adaptor_name##_forwarder {}; \ Chris@16: \ Chris@16: template range_adaptor \ Chris@16: operator|(Range& rng, adaptor_name##_forwarder) \ Chris@16: { \ Chris@16: return range_adaptor ( rng ); \ Chris@16: } \ Chris@16: \ Chris@16: template range_adaptor \ Chris@16: operator|(const Range& rng, adaptor_name##_forwarder) \ Chris@16: { \ Chris@16: return range_adaptor ( rng ); \ Chris@16: } \ Chris@16: \ Chris@16: static adaptor_name##_forwarder adaptor_name = adaptor_name##_forwarder(); \ Chris@16: \ Chris@16: template \ Chris@16: range_adaptor \ Chris@16: make_##adaptor_name(Range& rng) \ Chris@16: { \ Chris@16: return range_adaptor (rng); \ Chris@16: } \ Chris@16: \ Chris@16: template \ Chris@16: range_adaptor \ Chris@16: make_##adaptor_name(const Range& rng) \ Chris@16: { \ Chris@16: return range_adaptor (rng); \ Chris@16: } Chris@16: Chris@16: #define BOOST_DEFINE_RANGE_ADAPTOR_1( adaptor_name, range_adaptor, arg1_type ) \ Chris@16: struct adaptor_name \ Chris@16: { \ Chris@16: explicit adaptor_name (arg1_type arg1_) \ Chris@16: : arg1(arg1_) {} \ Chris@16: arg1_type arg1; \ Chris@16: }; \ Chris@16: \ Chris@16: template range_adaptor \ Chris@16: operator|(Range& rng, adaptor_name args) \ Chris@16: { \ Chris@16: return range_adaptor (rng, args.arg1); \ Chris@16: } \ Chris@16: \ Chris@16: template range_adaptor \ Chris@16: operator|(const Range& rng, adaptor_name args) \ Chris@16: { \ Chris@16: return range_adaptor (rng, args.arg1); \ Chris@16: } \ Chris@16: \ Chris@16: template \ Chris@16: range_adaptor \ Chris@16: make_##adaptor_name(Range& rng, arg1_type arg1) \ Chris@16: { \ Chris@16: return range_adaptor (rng, arg1); \ Chris@16: } \ Chris@16: \ Chris@16: template \ Chris@16: range_adaptor \ Chris@16: make_##adaptor_name(const Range& rng, arg1_type arg1) \ Chris@16: { \ Chris@16: return range_adaptor (rng, arg1); \ Chris@16: } Chris@16: Chris@16: #define BOOST_RANGE_ADAPTOR_2( adaptor_name, range_adaptor, arg1_type, arg2_type ) \ Chris@16: struct adaptor_name \ Chris@16: { \ Chris@16: explicit adaptor_name (arg1_type arg1_, arg2_type arg2_) \ Chris@16: : arg1(arg1_), arg2(arg2_) {} \ Chris@16: arg1_type arg1; \ Chris@16: arg2_type arg2; \ Chris@16: }; \ Chris@16: \ Chris@16: template range_adaptor \ Chris@16: operator|(Range& rng, adaptor_name args) \ Chris@16: { \ Chris@16: return range_adaptor (rng, args.arg1, args.arg2); \ Chris@16: } \ Chris@16: template \ Chris@16: range_adaptor \ Chris@16: make_##adaptor_name(Range& rng, arg1_type arg1, arg2_type arg2) \ Chris@16: { \ Chris@16: return range_adaptor (rng, arg1, arg2); \ Chris@16: } \ Chris@16: template \ Chris@16: range_adaptor \ Chris@16: make_##adaptor_name(const Range& rng, arg1_type arg1, arg2_type arg2) \ Chris@16: { \ Chris@16: return range_adaptor (rng, arg1, arg2); \ Chris@16: } Chris@16: Chris@16: Chris@16: #endif // include guard