blob: 4878837a804fcd4bebec77e75c6660368beca95c [file] [log] [blame]
// Boost.TypeErasure library
//
// Copyright 2012 Steven Watanabe
//
// 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)
//
// $Id$
#include <boost/type_erasure/any.hpp>
#include <boost/type_erasure/builtin.hpp>
#include <boost/type_erasure/free.hpp>
#include <boost/mpl/vector.hpp>
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
using namespace boost::type_erasure;
struct model {
explicit model(int v) : val(v) {}
int val;
};
int f1(model& m) { return m.val; }
int f1(model& m, int i) { return m.val + i; }
BOOST_TYPE_ERASURE_FREE((global_has_f1_1), f1, 1);
BOOST_AUTO_TEST_CASE(test_global_has_f1_1) {
typedef ::boost::mpl::vector<
global_has_f1_1<int(_self&)>,
copy_constructible<> > concept_type;
model m(10);
any<concept_type> x(m);
BOOST_CHECK_EQUAL(f1(x), 10);
}
BOOST_TYPE_ERASURE_FREE((ns1)(ns2)(ns_has_f1_1), f1, 1);
BOOST_AUTO_TEST_CASE(test_ns_has_f1_1) {
typedef ::boost::mpl::vector<
ns1::ns2::ns_has_f1_1<int(_self&)>,
copy_constructible<> > concept_type;
model m(10);
any<concept_type> x(m);
BOOST_CHECK_EQUAL(f1(x), 10);
}
struct model_const {
explicit model_const(int v) : val(v) {}
int val;
};
int f1(const model_const& m) { return m.val; }
int f1(const model_const& m, int i) { return m.val + i; }
BOOST_AUTO_TEST_CASE(test_global_has_f1_1_const) {
typedef ::boost::mpl::vector<
ns1::ns2::ns_has_f1_1<int(const _self&)>,
copy_constructible<> > concept_type;
model_const m(10);
const any<concept_type> x(m);
BOOST_CHECK_EQUAL(f1(x), 10);
}
BOOST_AUTO_TEST_CASE(test_global_has_f1_1_void) {
typedef ::boost::mpl::vector<
global_has_f1_1<void(_self&)>,
copy_constructible<> > concept_type;
model m(10);
any<concept_type> x(m);
f1(x);
}
BOOST_TYPE_ERASURE_FREE((global_has_f1_2), f1, 2);
BOOST_AUTO_TEST_CASE(test_global_has_f1_overload) {
typedef ::boost::mpl::vector<
global_has_f1_1<int(_self&)>,
global_has_f1_2<int(_self&, int)>,
copy_constructible<> > concept_type;
model m(10);
any<concept_type> x(m);
BOOST_CHECK_EQUAL(f1(x), 10);
BOOST_CHECK_EQUAL(f1(x, 5), 15);
}
BOOST_AUTO_TEST_CASE(test_global_has_f1_overload_const) {
typedef ::boost::mpl::vector<
global_has_f1_1<int(const _self&)>,
global_has_f1_2<int(const _self&, int)>,
copy_constructible<> > concept_type;
model_const m(10);
const any<concept_type> x(m);
BOOST_CHECK_EQUAL(f1(x), 10);
BOOST_CHECK_EQUAL(f1(x, 5), 15);
}
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
BOOST_AUTO_TEST_CASE(test_global_has_f1_rv) {
typedef ::boost::mpl::vector<
global_has_f1_2<int(_self&&, int&&)>,
copy_constructible<> > concept_type;
model_const m(10);
any<concept_type> x(m);
BOOST_CHECK_EQUAL(f1(std::move(x), 5), 15);
}
#endif