• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
7 // Copyright (c) 2014-2020 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/variant/variant.hpp"
14 #include "boost/core/lightweight_test.hpp"
15 
16 #include <iostream>
17 #include <sstream>
18 #include <string>
19 
20 #include <algorithm>
21 #include <vector>
22 
23 #include "boost/detail/workaround.hpp"
24 #if BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x0551))
25 #    pragma warn -lvc // temporary used for parameter warning
26 #endif
27 
28 template <typename T>
assert_equality_comparable(const T & x,const T & y,const T & z)29 void assert_equality_comparable(
30       const T& x, const T& y, const T& z
31     )
32 {
33     // identity check
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) );
40 
41     // reflexivity check
42     BOOST_TEST( (x == x) );
43     BOOST_TEST( (y == y) );
44     BOOST_TEST( (z == z) );
45 
46     // symmetry check
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) );
51 
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) );
56 
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) );
61 
62     // transitivity check
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) );
66 }
67 
68 template <typename T>
assert_less_than_comparable(const T & x,const T & y,const T & z)69 void assert_less_than_comparable(
70       const T& x, const T& y, const T& z
71     )
72 {
73     // irreflexivity check
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) );
87 
88     // transitivity check
89     BOOST_TEST( (x < y) );
90     BOOST_TEST( (y < z) );
91     BOOST_TEST( (x < z) );
92 
93     BOOST_TEST( (x <= y) );
94     BOOST_TEST( (y <= z) );
95     BOOST_TEST( (x <= z) );
96 
97     BOOST_TEST( (z > y) );
98     BOOST_TEST( (y > x) );
99     BOOST_TEST( (z > x) );
100 
101     BOOST_TEST( (z >= y) );
102     BOOST_TEST( (y >= x) );
103     BOOST_TEST( (z >= x) );
104 
105     // antisymmetry check
106     BOOST_TEST( !(y < x) );
107     BOOST_TEST( !(z < y) );
108     BOOST_TEST( !(z < x) );
109 }
110 
111 template <typename It>
print_range(It first,It last)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 
main()125 int main()
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()) );
149     BOOST_TEST( sort_result == "3 5 goodbye hello " );
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);
155     BOOST_TEST(v == u);
156 
157     return boost::report_errors();
158 }
159