Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_33_1/libs/variant/test/test8.cpp @ 12

Last change on this file since 12 was 12, checked in by landauf, 17 years ago

added boost

File size: 2.4 KB
Line 
1//-----------------------------------------------------------------------------
2// boost-libs variant/test/test8.cpp header file
3// See http://www.boost.org for updates, documentation, and revision history.
4//-----------------------------------------------------------------------------
5//
6// Copyright (c) 2003
7// Eric Friedman, Itay Maman
8//
9// Distributed under the Boost Software License, Version 1.0. (See
10// accompanying file LICENSE_1_0.txt or copy at
11// http://www.boost.org/LICENSE_1_0.txt)
12
13#include "boost/test/minimal.hpp"
14#include "boost/variant.hpp"
15
16#include <iostream>
17#include <vector>
18#include <string>
19
20using namespace std;
21using namespace boost;
22
23typedef variant<float, std::string, int, std::vector<std::string> > t_var1;
24
25struct int_sum : static_visitor<>
26{
27   int_sum() : result_(0) { }
28
29   void operator()(int t) 
30   {
31      result_ += t;
32   }
33
34   result_type operator()(float ) { }
35   result_type operator()(const std::string& ) { }
36   result_type operator()(const std::vector<std::string>& ) { }
37
38   int result_;
39}; 
40
41template <typename T, typename Variant>
42T& check_pass(Variant& v, T value)
43{
44    BOOST_CHECK(get<T>(&v));
45
46    try
47    {
48        T& r = get<T>(v);
49        BOOST_CHECK(r == value);
50        return r;
51    }
52    catch(boost::bad_get&)
53    {
54        throw; // must never reach
55    }
56}
57
58template <typename T, typename Variant>
59void check_fail(Variant& v)
60{
61    BOOST_CHECK(!get<T>(&v));
62
63    try
64    {
65        T& r = get<T>(v);
66        BOOST_CHECK(false && &r); // should never reach
67    }
68    catch(boost::bad_get&)
69    {
70        // (do nothing here)
71    }
72}
73
74int test_main(int , char* [])
75{
76   int_sum acc;
77   t_var1 v1 = 800;
78
79   // check get on non-const variant
80   {
81      int& r1 = check_pass<int>(v1, 800);
82      const int& cr1 = check_pass<const int>(v1, 800);
83
84      check_fail<float>(v1);
85      check_fail<const float>(v1);
86      check_fail<short>(v1);
87      check_fail<const short>(v1);
88
89      apply_visitor(acc, v1);
90      BOOST_CHECK(acc.result_ == 800);
91
92      r1 = 920; // NOTE: modifies content of v1
93      apply_visitor(acc, v1);
94      BOOST_CHECK(cr1 == 920);
95      BOOST_CHECK(acc.result_ == 800 + 920);
96   }
97
98   // check const correctness:
99   {
100      const t_var1& c = v1;
101
102      check_pass<const int>(c, 920);
103
104      //check_fail<int>(c);
105      check_fail<const float>(c);
106      //check_fail<float>(c);
107      check_fail<const short>(c);
108      //check_fail<short>(c);
109   }
110
111   return boost::exit_success;
112}
Note: See TracBrowser for help on using the repository browser.