//----------------------------------------------------------------------------- // boost-libs variant/test/test8.cpp header 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/core/lightweight_test.hpp" #include "boost/variant.hpp" #include #include #include using namespace boost; typedef variant > t_var1; struct int_sum : static_visitor<> { int_sum() : result_(0) { } void operator()(int t) { result_ += t; } result_type operator()(float ) { } result_type operator()(const std::string& ) { } result_type operator()(const std::vector& ) { } int result_; }; template T& check_pass(Variant& v, T value) { BOOST_TEST(get(&v)); try { T& r = get(v); BOOST_TEST(r == value); return r; } catch(boost::bad_get&) { throw; // must never reach } } template void check_fail(Variant& v) { BOOST_TEST(!relaxed_get(&v)); try { T& r = relaxed_get(v); (void)r; // suppress warning about r not being used BOOST_TEST(false && relaxed_get(&v)); // should never reach } catch(const boost::bad_get& e) { BOOST_TEST(!!e.what()); // make sure that what() is const qualified and returnes something } } int main() { int_sum acc; t_var1 v1 = 800; // check get on non-const variant { int& r1 = check_pass(v1, 800); const int& cr1 = check_pass(v1, 800); check_fail(v1); check_fail(v1); check_fail(v1); check_fail(v1); apply_visitor(acc, v1); BOOST_TEST(acc.result_ == 800); r1 = 920; // NOTE: modifies content of v1 apply_visitor(acc, v1); BOOST_TEST(cr1 == 920); BOOST_TEST(acc.result_ == 800 + 920); } // check const correctness: { const t_var1& c = v1; check_pass(c, 920); //check_fail(c); check_fail(c); //check_fail(c); check_fail(c); //check_fail(c); } return boost::report_errors(); }