Ticket #8459: variant_multivisit_test.cpp

File variant_multivisit_test.cpp, 3.8 KB (added by Antony Polukhin, 10 years ago)

Test for multivisitation

Line 
1//-----------------------------------------------------------------------------
2// boost-libs variant/test/variant_multivisit_test.cpp source file
3// See http://www.boost.org for updates, documentation, and revision history.
4//-----------------------------------------------------------------------------
5//
6// Copyright (c) 2013
7// Antony Polukhin
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/config.hpp"
14#define BOOST_VARAINT_MAX_MULTIVIZITOR_PARAMS 6
15#include "../../../margot/applications/common/functions/multivisitors.hpp"
16
17#include "boost/test/minimal.hpp"
18
19typedef boost::variant<char, unsigned char, signed char> variant3_t;
20typedef boost::variant<char, unsigned char, signed char, unsigned short> variant4_t;
21typedef boost::variant<char, unsigned char, signed char, unsigned short, int> variant5_t;
22typedef boost::variant<char, unsigned char, signed char, unsigned short, int, unsigned int> variant6_t;
23
24struct test_visitor: boost::static_visitor<> {
25 // operators that shall not be called
26 template <class T1, class T2, class T3>
27 void operator()(T1, T2, T3) const
28 {
29 BOOST_CHECK(false);
30 }
31
32 template <class T1, class T2, class T3, class T4>
33 void operator()(T1, T2, T3, T4) const
34 {
35 BOOST_CHECK(false);
36 }
37
38 template <class T1, class T2, class T3, class T4, class T5>
39 void operator()(T1, T2, T3, T4, T5) const
40 {
41 BOOST_CHECK(false);
42 }
43
44 template <class T1, class T2, class T3, class T4, class T5, class T6>
45 void operator()(T1, T2, T3, T4, T5, T6) const
46 {
47 BOOST_CHECK(false);
48 }
49
50 // operators that are OK to call
51 void operator()(char, unsigned char, signed char) const
52 {
53 BOOST_CHECK(true);
54 }
55
56 void operator()(char, unsigned char, signed char, unsigned short) const
57 {
58 BOOST_CHECK(true);
59 }
60
61 void operator()(char, unsigned char, signed char, unsigned short, int) const
62 {
63 BOOST_CHECK(true);
64 }
65
66 void operator()(char, unsigned char, signed char, unsigned short, int, unsigned int) const
67 {
68 BOOST_CHECK(true);
69 }
70};
71
72int test_main(int , char* [])
73{
74 test_visitor v;
75
76 variant3_t v_array3[] = {
77 char(), unsigned char(), signed char()
78 };
79 boost::apply_visitor(v, v_array3[0], v_array3[1], v_array3[2]);
80 boost::apply_visitor(test_visitor(), v_array3[0], v_array3[1], v_array3[2]);
81
82 variant4_t v_array4[] = {
83 char(), unsigned char(), signed char(), unsigned short()
84 };
85 boost::apply_visitor(v, v_array4[0], v_array4[1], v_array4[2], v_array4[3]);
86 boost::apply_visitor(test_visitor(), v_array4[0], v_array4[1], v_array4[2], v_array4[3]);
87
88// Following test also pass, but requires many Gigabytes of RAM for compilation and compile for about 45 minutes
89//#define BOOST_VARIANT_MULTIVISITORS_TEST_VERY_EXTREME
90#ifdef BOOST_VARIANT_MULTIVISITORS_TEST_VERY_EXTREME
91 variant5_t v_array5[] = {
92 char(), unsigned char(), signed char(), unsigned short(), int()
93 };
94 boost::apply_visitor(v, v_array5[0], v_array5[1], v_array5[2], v_array5[3], v_array5[4]);
95 boost::apply_visitor(test_visitor(), v_array5[0], v_array5[1], v_array5[2], v_array5[3], v_array5[4]);
96
97 variant6_t v_array6[] = {
98 char(), unsigned char(), signed char(), unsigned short(), int(), unsigned int()
99 };
100 boost::apply_visitor(v, v_array6[0], v_array6[1], v_array6[2], v_array6[3], v_array6[4], v_array6[5]);
101 boost::apply_visitor(test_visitor(), v_array6[0], v_array6[1], v_array6[2], v_array6[3], v_array6[4], v_array6[5]);
102#endif
103
104 return boost::exit_success;
105}