123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- //-----------------------------------------------------------------------------
- // 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/core/lightweight_test.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_TEST( !(value1 == value2) );
- /////
- boost::variant< T& > var(t);
- BOOST_TEST(( boost::get<T>(&var) == &t ));
- t = value1;
- BOOST_TEST(( boost::get<T>(var) == value1 ));
- /////
- boost::variant< T > var2(var);
- BOOST_TEST(( boost::get<T>(var2) == value1 ));
- t = value2;
- BOOST_TEST(( boost::get<T>(var2) == value1 ));
- }
- template <typename Base, typename Derived>
- void base_derived_test(Derived d)
- {
- Base b(d);
- BOOST_TEST((check_base_derived(
- b
- , d
- , 1L
- )));
- boost::variant<Base> base_var(d);
- BOOST_TEST((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_TEST((check_base_derived(
- wknd_get(base_from_derived_var, 1L)
- , wknd_get(derived_var, 1L)
- , 1L
- )));
- }
- int main()
- {
- 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::report_errors();
- }
|