1 /* 2 * Copyright 2013 Arx Libertatis Team (see the AUTHORS file) 3 * 4 * This file is part of Arx Libertatis. 5 * 6 * Original source is copyright 2010 - 2011. Alexey Tsoy. 7 * http://sourceforge.net/projects/interpreter11/ 8 * 9 * Boost Software License - Version 1.0 - August 17th, 2003 10 * 11 * Permission is hereby granted, free of charge, to any person or organization 12 * obtaining a copy of the software and accompanying documentation covered by 13 * this license (the "Software") to use, reproduce, display, distribute, 14 * execute, and transmit the Software, and to prepare derivative works of the 15 * Software, and to permit third-parties to whom the Software is furnished to 16 * do so, all subject to the following: 17 * 18 * The copyright notices in the Software and this entire statement, including 19 * the above license grant, this restriction and the following disclaimer, 20 * must be included in all copies of the Software, in whole or in part, and 21 * all derivative works of the Software, unless such copies or derivative 22 * works are solely in the form of machine-executable object code generated by 23 * a source language processor. 24 * 25 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27 * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT 28 * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE 29 * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, 30 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 31 * DEALINGS IN THE SOFTWARE. 32 */ 33 34 #ifdef BOOST_PP_IS_ITERATING 35 36 #define DEC_N BOOST_PP_DEC(N) 37 38 #define SUPER_T args_adapter_impl<void(BOOST_PP_ENUM_PARAMS(DEC_N, A))> 39 #define IMPL_T \ 40 arg_impl<typename boost::remove_cv<typename boost::remove_reference<BOOST_PP_CAT(A,DEC_N)>::type>::type, DEC_N> 41 42 template<BOOST_PP_ENUM_PARAMS(N, typename A)> 43 struct args_adapter_impl<void(BOOST_PP_ENUM_PARAMS(N, A))> 44 #if (N > 0) 45 : SUPER_T 46 , IMPL_T 47 #endif //(N > 0) 48 { 49 template<typename SourceType> 50 explicit args_adapter_impl(SourceType& s) 51 #if (N > 0) 52 : SUPER_T(s) 53 , IMPL_T(construct 54 (s,static_cast<typename IMPL_T::BOOST_PP_CAT(BOOST_PP_CAT(arg, DEC_N), _t) const*>(0))) 55 #endif //(N > 0) 56 { 57 } 58 }; 59 60 #undef DEC_N 61 #undef SUPER_T 62 63 template< 64 typename R 65 BOOST_PP_COMMA_IF(N) BOOST_PP_ENUM_PARAMS(N, typename A) 66 > 67 struct args_adapter_impl<R(BOOST_PP_ENUM_PARAMS(N, A))> 68 : args_adapter_impl<void(BOOST_PP_ENUM_PARAMS(N, A))> { 69 }; 70 71 #endif // BOOST_PP_IS_ITERATING 72