]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/safe_numerics/test/test_checked_add.cpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / libs / safe_numerics / test / test_checked_add.cpp
1 // Copyright (c) 2012 Robert Ramey
2 //
3 // Distributed under the Boost Software License, Version 1.0. (See
4 // accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
6
7 #include <iostream>
8
9 #include <boost/core/demangle.hpp>
10 #include <boost/safe_numerics/checked_result_operations.hpp>
11 #include <boost/safe_numerics/checked_integer.hpp>
12
13 // note: T should be of type checked_result<R> for some integer type R
14 template<class T>
15 bool test_checked_add(
16 T v1,
17 T v2,
18 char expected_result
19 ){
20 using namespace boost::safe_numerics;
21 const T result = v1 + v2;
22 std::cout
23 << "testing " << boost::core::demangle(typeid(T).name()) << ' '
24 << v1 << " + " << v2 << " -> " << result
25 << std::endl;
26
27 switch(expected_result){
28 case '.':
29 if(result.exception()){
30 std::cout
31 << "erroneously detected error in addition "
32 << std::endl;
33 v1 + v2;
34 return false;
35 }
36 return true;
37 case '-':
38 if(safe_numerics_error::negative_overflow_error == result.m_e)
39 return true;
40 break;
41 case '+':
42 if(safe_numerics_error::positive_overflow_error == result.m_e)
43 return true;
44 break;
45 case '!':
46 if(safe_numerics_error::range_error == result.m_e)
47 return true;
48 break;
49 }
50 std::cout
51 << "failed to detect error in addition "
52 << std::hex << result << "(" << std::dec << result << ")"
53 << " != "<< v1 << " + " << v2
54 << std::endl;
55 v1 + v2;
56 return false;
57 }
58
59 #include "test_checked_add.hpp"
60
61 template<typename T, typename First, typename Second>
62 struct test_signed_pair {
63 bool operator()() const {
64 std::size_t i = First();
65 std::size_t j = Second();
66 std::cout << std::dec << i << ',' << j << ','
67 << "testing " << boost::core::demangle(typeid(T).name()) << ' ';
68 return test_checked_add(
69 signed_values<T>[i],
70 signed_values<T>[j],
71 signed_addition_results[i][j]
72 );
73 };
74 };
75
76 template<typename T, typename First, typename Second>
77 struct test_unsigned_pair {
78 bool operator()() const {
79 std::size_t i = First();
80 std::size_t j = Second();
81 std::cout << std::dec << i << ',' << j << ','
82 << "testing " << boost::core::demangle(typeid(T).name()) << ' ';
83 return test_checked_add(
84 unsigned_values<T>[i],
85 unsigned_values<T>[j],
86 unsigned_addition_results[i][j]
87 );
88 };
89 };
90
91 #include "check_symmetry.hpp"
92
93 #include <boost/mp11/algorithm.hpp>
94
95 int main(){
96 // sanity check on test matrix - should be symetrical
97 check_symmetry(signed_addition_results);
98 check_symmetry(unsigned_addition_results);
99
100 using namespace boost::mp11;
101 bool rval = true;
102
103 mp_for_each<
104 mp_product<
105 test_signed_pair,
106 signed_test_types,
107 signed_value_indices,
108 signed_value_indices
109 >
110 >([&](auto I){
111 rval &= I();
112 });
113
114 mp_for_each<
115 mp_product<
116 test_unsigned_pair,
117 unsigned_test_types,
118 unsigned_value_indices, unsigned_value_indices
119 >
120 >([&](auto I){
121 rval &= I();
122 });
123
124 std::cout << (rval ? "success!" : "failure") << std::endl;
125 return rval ? 0 : 1;
126 }