summaryrefslogtreecommitdiff
path: root/boost/parameter/aux_/preprocessor/impl/specification.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/parameter/aux_/preprocessor/impl/specification.hpp')
-rw-r--r--boost/parameter/aux_/preprocessor/impl/specification.hpp109
1 files changed, 109 insertions, 0 deletions
diff --git a/boost/parameter/aux_/preprocessor/impl/specification.hpp b/boost/parameter/aux_/preprocessor/impl/specification.hpp
new file mode 100644
index 0000000000..d2a4638a83
--- /dev/null
+++ b/boost/parameter/aux_/preprocessor/impl/specification.hpp
@@ -0,0 +1,109 @@
+// Copyright Daniel Wallin 2006.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_PARAMETER_AUX_PREPROCESSOR_IMPL_SPECIFICATION_HPP
+#define BOOST_PARAMETER_AUX_PREPROCESSOR_IMPL_SPECIFICATION_HPP
+
+#include <boost/parameter/optional.hpp>
+
+// Helper macros for BOOST_PARAMETER_SPECIFICATION_ELEM_R.
+#define BOOST_PARAMETER_QUALIFIED_TAG_optional(tag) \
+ optional<tag
+/**/
+
+#include <boost/parameter/required.hpp>
+
+#define BOOST_PARAMETER_QUALIFIED_TAG_required(tag) \
+ required<tag
+/**/
+
+#include <boost/parameter/deduced.hpp>
+
+#define BOOST_PARAMETER_QUALIFIED_TAG_deduced_optional(tag) \
+ optional< ::boost::parameter::deduced<tag>
+/**/
+
+#define BOOST_PARAMETER_QUALIFIED_TAG_deduced_required(tag) \
+ required< ::boost::parameter::deduced<tag>
+/**/
+
+#include <boost/parameter/aux_/preprocessor/impl/argument_specs.hpp>
+#include <boost/parameter/config.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+
+#include <boost/parameter/aux_/use_default.hpp>
+
+#define BOOST_PARAMETER_SPECIFICATION_ELEM_R(r, tag_namespace, i, elem) \
+ BOOST_PP_COMMA_IF(i) ::boost::parameter::BOOST_PP_CAT( \
+ BOOST_PARAMETER_QUALIFIED_TAG_ \
+ , BOOST_PARAMETER_FN_ARG_QUALIFIER(elem) \
+ )(tag_namespace::BOOST_PARAMETER_FN_ARG_NAME(elem)) \
+ , ::boost::parameter::aux::use_default \
+ >
+/**/
+
+#else // !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+
+#include <boost/parameter/aux_/pp_impl/unwrap_predicate.hpp>
+
+// Expands to each boost::parameter::parameters<> element type.
+#define BOOST_PARAMETER_SPECIFICATION_ELEM_R(r, tag_namespace, i, elem) \
+ BOOST_PP_COMMA_IF(i) ::boost::parameter::BOOST_PP_CAT( \
+ BOOST_PARAMETER_QUALIFIED_TAG_ \
+ , BOOST_PARAMETER_FN_ARG_QUALIFIER(elem) \
+ )(tag_namespace::BOOST_PARAMETER_FN_ARG_NAME(elem)) \
+ , typename ::boost::parameter::aux::unwrap_predicate< \
+ void BOOST_PARAMETER_FN_ARG_PRED(elem) \
+ >::type \
+ >
+/**/
+
+#endif // Borland workarounds needed.
+
+#include <boost/parameter/parameters.hpp>
+#include <boost/parameter/aux_/preprocessor/impl/function_name.hpp>
+#include <boost/preprocessor/control/if.hpp>
+#include <boost/preprocessor/seq/for_each_i.hpp>
+
+// Expands to a boost::parameter::parameters<> specialization for the
+// function named base. Used by BOOST_PARAMETER_CONSTRUCTOR_AUX and
+// BOOST_PARAMETER_FUNCTION_HEAD for their respective ParameterSpec models.
+#define BOOST_PARAMETER_SPECIFICATION(tag_ns, base, split_args, is_const) \
+ template <typename BoostParameterDummy> \
+ struct BOOST_PP_CAT( \
+ BOOST_PP_CAT( \
+ BOOST_PP_IF( \
+ is_const \
+ , boost_param_params_const_ \
+ , boost_param_params_ \
+ ) \
+ , __LINE__ \
+ ) \
+ , BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base) \
+ ) : ::boost::parameter::parameters< \
+ BOOST_PP_SEQ_FOR_EACH_I( \
+ BOOST_PARAMETER_SPECIFICATION_ELEM_R, tag_ns, split_args \
+ ) \
+ > \
+ { \
+ }; \
+ typedef BOOST_PP_CAT( \
+ BOOST_PP_CAT( \
+ BOOST_PP_IF( \
+ is_const \
+ , boost_param_params_const_ \
+ , boost_param_params_ \
+ ) \
+ , __LINE__ \
+ ) \
+ , BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base) \
+ )<int>
+/**/
+
+#endif // include guard
+