summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/parameter/test/sfinae.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/parameter/test/sfinae.cpp')
-rw-r--r--src/boost/libs/parameter/test/sfinae.cpp174
1 files changed, 174 insertions, 0 deletions
diff --git a/src/boost/libs/parameter/test/sfinae.cpp b/src/boost/libs/parameter/test/sfinae.cpp
new file mode 100644
index 00000000..17c50443
--- /dev/null
+++ b/src/boost/libs/parameter/test/sfinae.cpp
@@ -0,0 +1,174 @@
+// Copyright David Abrahams, Daniel Wallin 2003.
+// 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)
+
+#include <boost/parameter/config.hpp>
+
+#if (BOOST_PARAMETER_MAX_ARITY < 2)
+#error Define BOOST_PARAMETER_MAX_ARITY as 2 or greater.
+#endif
+#if !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)
+#if (BOOST_PARAMETER_EXPONENTIAL_OVERLOAD_THRESHOLD_ARITY < 3)
+#error Define BOOST_PARAMETER_EXPONENTIAL_OVERLOAD_THRESHOLD_ARITY \
+as 3 or greater.
+#endif
+#endif
+
+#include <boost/parameter/name.hpp>
+
+namespace test {
+
+ BOOST_PARAMETER_NAME((name, keywords) in(name))
+ BOOST_PARAMETER_NAME((value, keywords) in(value))
+} // namespace test
+
+#if defined(BOOST_PARAMETER_CAN_USE_MP11)
+#include <type_traits>
+#else
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#endif
+
+namespace test {
+
+ template <typename To>
+ struct f_predicate
+ {
+ template <typename From, typename Args>
+#if defined(BOOST_PARAMETER_CAN_USE_MP11)
+ using fn = std::is_convertible<From,To>;
+#else
+ struct apply
+ : boost::mpl::if_<
+ boost::is_convertible<From,To>
+ , boost::mpl::true_
+ , boost::mpl::false_
+ >
+ {
+ };
+#endif
+ };
+} // namespace test
+
+#include <boost/parameter/parameters.hpp>
+#include <boost/parameter/optional.hpp>
+#include <string>
+
+namespace test {
+
+ struct f_parameters
+ : boost::parameter::parameters<
+ boost::parameter::optional<
+ test::keywords::name
+ , test::f_predicate<std::string>
+ >
+ , boost::parameter::optional<
+ test::keywords::value
+ , test::f_predicate<float>
+ >
+ >
+ {
+ };
+} // namespace test
+
+#include <boost/core/lightweight_test.hpp>
+
+namespace test {
+
+ // The use of assert_equal_string is just a nasty workaround for a
+ // vc++ 6 ICE.
+ void assert_equal_string(std::string x, std::string y)
+ {
+ BOOST_TEST(x == y);
+ }
+
+ template <typename P>
+ void f_impl(P const& p)
+ {
+ float v = p[test::value | 3.f];
+ BOOST_TEST_EQ(v, 3.f);
+ test::assert_equal_string(p[test::name | "bar"], "foo");
+ }
+
+ void f()
+ {
+ test::f_impl(f_parameters()());
+ }
+} // namespace test
+
+#include <boost/parameter/match.hpp>
+
+namespace test {
+
+ template <typename A0>
+ void
+ f(
+ A0 const& a0
+ , BOOST_PARAMETER_MATCH(f_parameters, (A0), args)
+ )
+ {
+ test::f_impl(args(a0));
+ }
+
+ template <typename A0, typename A1>
+ void
+ f(
+ A0 const& a0
+ , A1 const& a1
+ , BOOST_PARAMETER_MATCH(f_parameters, (A0)(A1), args)
+ )
+ {
+ test::f_impl(args(a0, a1));
+ }
+} // namespace test
+
+#if !defined(BOOST_NO_SFINAE) && \
+ !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))
+#include <boost/core/enable_if.hpp>
+
+#if !defined(BOOST_PARAMETER_CAN_USE_MP11)
+#include <boost/type_traits/is_same.hpp>
+#endif
+
+namespace test {
+
+ // On compilers that actually support SFINAE, add another overload that is
+ // an equally good match and can only be in the overload set when the
+ // others are not. This tests that the SFINAE is actually working. On
+ // all other compilers we're just checking that everything about
+ // SFINAE-enabled code will work, except of course the SFINAE.
+ template <typename A0, typename A1>
+ typename boost::enable_if<
+#if defined(BOOST_PARAMETER_CAN_USE_MP11)
+ std::is_same<int,A0>
+#else
+ typename boost::mpl::if_<
+ boost::is_same<int,A0>
+ , boost::mpl::true_
+ , boost::mpl::false_
+ >::type
+#endif
+ , int
+ >::type
+ f(A0 const& a0, A1 const& a1)
+ {
+ return 0;
+ }
+} // namespace test
+
+#endif // SFINAE enabled, no Borland workarounds needed.
+
+int main()
+{
+ test::f("foo");
+ test::f("foo", 3.f);
+ test::f(test::value = 3.f, test::name = "foo");
+#if !defined(BOOST_NO_SFINAE) && \
+ !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))
+ BOOST_TEST_EQ(0, test::f(3, 4));
+#endif
+ return boost::report_errors();
+}
+