]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | //----------------------------------------------------------------------------- |
2 | // boost-libs variant/test/variant_comparison_test.cpp source file | |
3 | // See http://www.boost.org for updates, documentation, and revision history. | |
4 | //----------------------------------------------------------------------------- | |
5 | // | |
6 | // Copyright (c) 2003 Eric Friedman, Itay Maman | |
1e59de90 | 7 | // Copyright (c) 2014-2022 Antony Polukhin |
7c673cae FG |
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/variant/variant.hpp" | |
92f5a8d4 | 14 | #include "boost/core/lightweight_test.hpp" |
7c673cae FG |
15 | |
16 | #include <iostream> | |
17 | #include <sstream> | |
18 | #include <string> | |
19 | ||
20 | #include <algorithm> | |
21 | #include <vector> | |
22 | ||
23 | #include "boost/detail/workaround.hpp" | |
20effc67 | 24 | #if BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x0551)) |
7c673cae FG |
25 | # pragma warn -lvc // temporary used for parameter warning |
26 | #endif | |
27 | ||
28 | template <typename T> | |
29 | void assert_equality_comparable( | |
30 | const T& x, const T& y, const T& z | |
31 | ) | |
32 | { | |
33 | // identity check | |
92f5a8d4 TL |
34 | BOOST_TEST( !(&x == &y) || (x == y) ); |
35 | BOOST_TEST( !(&x == &z) || (x == z) ); | |
36 | BOOST_TEST( !(&y == &z) || (y == z) ); | |
37 | BOOST_TEST( !(&x == &y) || !(x != y) ); | |
38 | BOOST_TEST( !(&x == &z) || !(x != z) ); | |
39 | BOOST_TEST( !(&y == &z) || !(y != z) ); | |
7c673cae FG |
40 | |
41 | // reflexivity check | |
92f5a8d4 TL |
42 | BOOST_TEST( (x == x) ); |
43 | BOOST_TEST( (y == y) ); | |
44 | BOOST_TEST( (z == z) ); | |
7c673cae FG |
45 | |
46 | // symmetry check | |
92f5a8d4 TL |
47 | BOOST_TEST( !(x == y) || (y == x) ); |
48 | BOOST_TEST( !(y == x) || (x == y) ); | |
49 | BOOST_TEST( (x != y) || (y == x) ); | |
50 | BOOST_TEST( (y != x) || (x == y) ); | |
7c673cae | 51 | |
92f5a8d4 TL |
52 | BOOST_TEST( !(x == z) || (z == x) ); |
53 | BOOST_TEST( !(z == x) || (x == z) ); | |
54 | BOOST_TEST( (x != z) || (z == x) ); | |
55 | BOOST_TEST( (z != x) || (x == z) ); | |
7c673cae | 56 | |
92f5a8d4 TL |
57 | BOOST_TEST( !(y == z) || (z == y) ); |
58 | BOOST_TEST( !(z == y) || (y == z) ); | |
59 | BOOST_TEST( (y != z) || (z == y) ); | |
60 | BOOST_TEST( (z != y) || (y == z) ); | |
7c673cae FG |
61 | |
62 | // transitivity check | |
92f5a8d4 TL |
63 | BOOST_TEST( !(x == y && y == z) || (x == z) ); |
64 | BOOST_TEST( !(x == z && z == y) || (x == y) ); | |
65 | BOOST_TEST( !(y == z && z == x) || (y == x) ); | |
7c673cae FG |
66 | } |
67 | ||
68 | template <typename T> | |
69 | void assert_less_than_comparable( | |
70 | const T& x, const T& y, const T& z | |
71 | ) | |
72 | { | |
73 | // irreflexivity check | |
92f5a8d4 TL |
74 | BOOST_TEST( !(x < x) ); |
75 | BOOST_TEST( !(y < y) ); | |
76 | BOOST_TEST( !(z < z) ); | |
77 | BOOST_TEST( !(x > x) ); | |
78 | BOOST_TEST( !(y > y) ); | |
79 | BOOST_TEST( !(z > z) ); | |
80 | ||
81 | BOOST_TEST( (x <= x) ); | |
82 | BOOST_TEST( (y <= y) ); | |
83 | BOOST_TEST( (z <= z) ); | |
84 | BOOST_TEST( (x >= x) ); | |
85 | BOOST_TEST( (y >= y) ); | |
86 | BOOST_TEST( (z >= z) ); | |
7c673cae FG |
87 | |
88 | // transitivity check | |
92f5a8d4 TL |
89 | BOOST_TEST( (x < y) ); |
90 | BOOST_TEST( (y < z) ); | |
91 | BOOST_TEST( (x < z) ); | |
7c673cae | 92 | |
92f5a8d4 TL |
93 | BOOST_TEST( (x <= y) ); |
94 | BOOST_TEST( (y <= z) ); | |
95 | BOOST_TEST( (x <= z) ); | |
7c673cae | 96 | |
92f5a8d4 TL |
97 | BOOST_TEST( (z > y) ); |
98 | BOOST_TEST( (y > x) ); | |
99 | BOOST_TEST( (z > x) ); | |
7c673cae | 100 | |
92f5a8d4 TL |
101 | BOOST_TEST( (z >= y) ); |
102 | BOOST_TEST( (y >= x) ); | |
103 | BOOST_TEST( (z >= x) ); | |
7c673cae FG |
104 | |
105 | // antisymmetry check | |
92f5a8d4 TL |
106 | BOOST_TEST( !(y < x) ); |
107 | BOOST_TEST( !(z < y) ); | |
108 | BOOST_TEST( !(z < x) ); | |
7c673cae FG |
109 | } |
110 | ||
111 | template <typename It> | |
112 | std::string print_range(It first, It last) | |
113 | { | |
114 | std::ostringstream result; | |
115 | ||
116 | while (first != last) | |
117 | { | |
118 | result << *first << ' '; | |
119 | ++first; | |
120 | } | |
121 | ||
122 | return result.str(); | |
123 | } | |
124 | ||
92f5a8d4 | 125 | int main() |
7c673cae FG |
126 | { |
127 | typedef boost::variant<int, std::string> var_t; | |
128 | ||
129 | var_t var1(3); | |
130 | var_t var2(5); | |
131 | var_t var3("goodbye"); | |
132 | var_t var4("hello"); | |
133 | ||
134 | assert_equality_comparable(var1, var1, var1); | |
135 | assert_equality_comparable(var_t(var1), var_t(var1), var_t(var1)); | |
136 | assert_equality_comparable(var1, var2, var3); | |
137 | ||
138 | assert_less_than_comparable(var1, var2, var3); | |
139 | assert_less_than_comparable(var2, var3, var4); | |
140 | ||
141 | std::vector<var_t> vec; | |
142 | vec.push_back( var3 ); | |
143 | vec.push_back( var2 ); | |
144 | vec.push_back( var4 ); | |
145 | vec.push_back( var1 ); | |
146 | std::sort(vec.begin(), vec.end()); | |
147 | ||
148 | std::string sort_result( print_range(vec.begin(), vec.end()) ); | |
92f5a8d4 | 149 | BOOST_TEST( sort_result == "3 5 goodbye hello " ); |
7c673cae FG |
150 | |
151 | // https://svn.boost.org/trac/boost/ticket/11751 | |
152 | int a = 0, b = 0; | |
153 | ||
154 | boost::variant< int& > v (a), u (b); | |
92f5a8d4 | 155 | BOOST_TEST(v == u); |
7c673cae | 156 | |
92f5a8d4 | 157 | return boost::report_errors(); |
7c673cae | 158 | } |