1 // Copyright Daniel Wallin 2006. 2 // Distributed under the Boost Software License, Version 1.0. 3 // (See accompanying file LICENSE_1_0.txt or copy at 4 // http://www.boost.org/LICENSE_1_0.txt) 5 6 #ifndef BOOST_PARAMETER_AUX_NAME_HPP 7 #define BOOST_PARAMETER_AUX_NAME_HPP 8 9 namespace boost { namespace parameter { namespace aux { 10 11 struct name_tag_base 12 { 13 }; 14 15 template <typename Tag> 16 struct name_tag 17 { 18 }; 19 }}} // namespace boost::parameter::aux 20 21 #include <boost/mpl/bool.hpp> 22 23 namespace boost { namespace parameter { namespace aux { 24 25 template <typename T> 26 struct is_name_tag : ::boost::mpl::false_ 27 { 28 }; 29 }}} // namespace boost::parameter::aux 30 31 #include <boost/parameter/value_type.hpp> 32 #include <boost/mpl/placeholders.hpp> 33 #include <boost/config.hpp> 34 #include <boost/config/workaround.hpp> 35 36 #if !defined(BOOST_NO_SFINAE) && \ 37 !BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x592)) 38 #include <boost/parameter/aux_/lambda_tag.hpp> 39 #include <boost/mpl/lambda.hpp> 40 #include <boost/mpl/bind.hpp> 41 #include <boost/mpl/quote.hpp> 42 #include <boost/core/enable_if.hpp> 43 44 namespace boost { namespace mpl { 45 46 template <typename T> 47 struct lambda< 48 T 49 , typename ::boost::enable_if< 50 ::boost::parameter::aux::is_name_tag<T> 51 , ::boost::parameter::aux::lambda_tag 52 >::type 53 > 54 { 55 typedef ::boost::mpl::true_ is_le; 56 typedef ::boost::mpl::bind3< 57 ::boost::mpl::quote3< ::boost::parameter::value_type> 58 , ::boost::mpl::arg<2> 59 , T 60 , void 61 > result_; 62 typedef result_ type; 63 }; 64 }} // namespace boost::mpl 65 66 #endif // SFINAE enabled, not Borland. 67 68 #include <boost/parameter/aux_/void.hpp> 69 70 #define BOOST_PARAMETER_TAG_PLACEHOLDER_TYPE(tag) \ 71 ::boost::parameter::value_type< \ 72 ::boost::mpl::_2,tag,::boost::parameter::void_ \ 73 > 74 /**/ 75 76 #if defined(BOOST_PARAMETER_CAN_USE_MP11) 77 #define BOOST_PARAMETER_TAG_MP11_PLACEHOLDER_VALUE(name, tag) \ 78 template <typename ArgumentPack> \ 79 using name = typename ::boost::parameter \ 80 ::value_type<ArgumentPack,tag,::boost::parameter::void_>::type 81 /**/ 82 83 #include <boost/parameter/binding.hpp> 84 85 #define BOOST_PARAMETER_TAG_MP11_PLACEHOLDER_BINDING(name, tag) \ 86 template <typename ArgumentPack> \ 87 using name = typename ::boost::parameter \ 88 ::binding<ArgumentPack,tag,::boost::parameter::void_>::type 89 /**/ 90 91 #endif // BOOST_PARAMETER_CAN_USE_MP11 92 #endif // include guard 93 94