mirror of https://gitee.com/bigwinds/arangodb
113 lines
2.6 KiB
C++
Executable File
113 lines
2.6 KiB
C++
Executable File
// Copyright David Abrahams, Daniel Wallin 2003. Use, modification and
|
|
// distribution is subject to 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.hpp>
|
|
#include <cassert>
|
|
#include <string.h>
|
|
#include <boost/bind.hpp>
|
|
#include <boost/ref.hpp>
|
|
|
|
#include "basics.hpp"
|
|
|
|
namespace test
|
|
{
|
|
// A separate function for getting the "value" key, so we can deduce
|
|
// F and use lazy_binding on it.
|
|
template <class Params, class F>
|
|
typename boost::parameter::lazy_binding<Params,tag::value,F>::type
|
|
extract_value(Params const& p, F const& f)
|
|
{
|
|
typename boost::parameter::lazy_binding<
|
|
Params, tag::value, F
|
|
>::type v = p[value || f ];
|
|
return v;
|
|
}
|
|
|
|
template<class Params>
|
|
int f_impl(Params const& p)
|
|
{
|
|
typename boost::parameter::binding<Params, tag::name>::type
|
|
n = p[name];
|
|
|
|
typename boost::parameter::binding<
|
|
Params, tag::value, double
|
|
>::type v = extract_value(p, boost::bind(&value_default));
|
|
|
|
typename boost::parameter::binding<
|
|
Params, tag::index, int
|
|
>::type i =
|
|
#if BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590042))
|
|
p[test::index | 999];
|
|
#else
|
|
p[index | 999];
|
|
#endif
|
|
|
|
p[tester](n,v,i);
|
|
|
|
return 1;
|
|
}
|
|
|
|
template<class Tester, class Name, class Value, class Index>
|
|
int f(Tester const& t, const Name& name_,
|
|
const Value& value_, const Index& index_)
|
|
{
|
|
return f_impl(f_parameters()(t, name_, value_, index_));
|
|
}
|
|
|
|
template<class Tester, class Name, class Value>
|
|
int f(Tester const& t, const Name& name_, const Value& value_)
|
|
{
|
|
return f_impl(f_parameters()(t, name_, value_));
|
|
}
|
|
|
|
template<class Tester, class Name>
|
|
int f(Tester const& t, const Name& name_)
|
|
{
|
|
return f_impl(f_parameters()(t, name_));
|
|
}
|
|
|
|
template<class Params>
|
|
int f_list(Params const& params)
|
|
{
|
|
return f_impl(params);
|
|
}
|
|
|
|
}
|
|
|
|
int main()
|
|
{
|
|
using test::f;
|
|
using test::f_list;
|
|
using test::name;
|
|
using test::value;
|
|
using test::index;
|
|
using test::tester;
|
|
|
|
f(
|
|
test::values(S("foo"), S("bar"), S("baz"))
|
|
, S("foo"), S("bar"), S("baz")
|
|
);
|
|
|
|
int x = 56;
|
|
f(
|
|
test::values("foo", 666.222, 56)
|
|
, index = boost::ref(x), name = "foo"
|
|
);
|
|
|
|
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
|
|
// No comma operator available on Borland
|
|
f_list((
|
|
tester = test::values("foo", 666.222, 56)
|
|
, index = boost::ref(x)
|
|
, name = "foo"
|
|
));
|
|
#endif
|
|
|
|
//f(index = 56, name = 55); // won't compile
|
|
|
|
return boost::report_errors();
|
|
}
|
|
|