blob: f02f2ac0c167ea571244309a30a329cdd13d4720 [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/operators.hpp>
#include <boost/type_erasure/any_cast.hpp>
#include <boost/type_erasure/deduced.hpp>
#include <boost/type_erasure/same_type.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/assert.hpp>
#include <boost/type_traits/remove_pointer.hpp>
#include <boost/type_traits/is_same.hpp>
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
using namespace boost::type_erasure;
BOOST_AUTO_TEST_CASE(test_deduce_dereference)
{
typedef ::boost::mpl::vector<
copy_constructible<>,
typeid_<_a>,
dereferenceable<deduced<boost::remove_pointer<_self> >&>,
same_type<deduced<boost::remove_pointer<_self> >, _a>
> test_concept;
int i;
any<test_concept> x(&i);
any<test_concept, _a&> y(*x);
BOOST_CHECK_EQUAL(&any_cast<int&>(y), &i);
}
BOOST_MPL_ASSERT((
boost::is_same<
deduced<boost::remove_pointer<_self> >::type,
deduced<boost::remove_pointer<_self> > >));
BOOST_MPL_ASSERT((
boost::is_same<deduced<boost::remove_pointer<int*> >::type, int >));
BOOST_AUTO_TEST_CASE(test_duplicate)
{
typedef ::boost::mpl::vector<
copy_constructible<>,
typeid_<_a>,
dereferenceable<deduced<boost::remove_pointer<_self> >&>,
same_type<deduced<boost::remove_pointer<_self> >, _a>,
same_type<deduced<boost::remove_pointer<_self> >, _a>
> test_concept;
int i;
any<test_concept> x(&i);
any<test_concept, _a&> y(*x);
BOOST_CHECK_EQUAL(&any_cast<int&>(y), &i);
}
BOOST_AUTO_TEST_CASE(test_convert)
{
typedef ::boost::mpl::vector<
copy_constructible<>,
typeid_<_a>,
dereferenceable<deduced<boost::remove_pointer<_self> >&>,
same_type<deduced<boost::remove_pointer<_self> >, _a>
> test_concept_src;
typedef ::boost::mpl::vector<
copy_constructible<_b>,
typeid_<_c>,
dereferenceable<deduced<boost::remove_pointer<_b> >&, _b>,
same_type<deduced<boost::remove_pointer<_b> >, _c>
> test_concept_dest;
int i;
any<test_concept_src> x1(&i);
any<test_concept_src, _a&> y1(*x1);
any<test_concept_dest, _b> x2(x1);
any<test_concept_dest, _c&> y2(*x2);
BOOST_CHECK_EQUAL(&any_cast<int&>(y2), &i);
}