blob: 165087234aec1d1ed6694fd06c459a76a5631717 [file] [log] [blame]
//-----------------------------------------------------------------------------
// boost-libs variant/test/variant_reference_test.cpp source file
// See http://www.boost.org for updates, documentation, and revision history.
//-----------------------------------------------------------------------------
//
// Copyright (c) 2003
// Eric Friedman, Itay Maman
//
// 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/variant.hpp"
#include "boost/test/minimal.hpp"
#include "boost/mpl/bool.hpp"
#include "boost/type_traits/add_reference.hpp"
#include "boost/type_traits/is_pointer.hpp"
/////
// support types and functions
struct base_t { };
struct derived_t : base_t { };
template <typename Base, typename Derived>
bool check_base_derived(Base* b, Derived* d, long)
{
return b == d;
}
template <typename Base, typename Derived>
bool check_base_derived(Base& b, Derived& d, int)
{
return &b == &d;
}
template <typename T>
typename boost::add_reference<T>::type
wknd_get(boost::variant<T&>& var, long)
{
return boost::get<T>(var);
}
template <typename T>
typename boost::add_reference<T>::type
wknd_get(boost::variant<T>& var, int)
{
return boost::get<T>(var);
}
/////
// test functions
template <typename T>
void test_reference_content(T& t, const T& value1, const T& value2)
{
BOOST_CHECK( !(value1 == value2) );
/////
boost::variant< T& > var(t);
BOOST_CHECK(( boost::get<T>(&var) == &t ));
t = value1;
BOOST_CHECK(( boost::get<T>(var) == value1 ));
/////
boost::variant< T > var2(var);
BOOST_CHECK(( boost::get<T>(var2) == value1 ));
t = value2;
BOOST_CHECK(( boost::get<T>(var2) == value1 ));
}
template <typename Base, typename Derived>
void base_derived_test(Derived d)
{
typedef typename boost::is_pointer<Base>::type is_ptr;
Base b(d);
BOOST_CHECK((check_base_derived(
b
, d
, 1L
)));
boost::variant<Base> base_var(d);
BOOST_CHECK((check_base_derived(
wknd_get(base_var, 1L)
, d
, 1L
)));
boost::variant<Derived> derived_var(d);
boost::variant<Base> base_from_derived_var(derived_var);
BOOST_CHECK((check_base_derived(
wknd_get(base_from_derived_var, 1L)
, wknd_get(derived_var, 1L)
, 1L
)));
}
int test_main(int , char* [])
{
int i = 0;
test_reference_content(i, 1, 2);
/////
derived_t d;
base_derived_test< int&,int >(i);
base_derived_test< base_t*,derived_t* >(&d);
base_derived_test< base_t&,derived_t& >(d);
return boost::exit_success;
}