]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/safe_numerics/test/test_checked_divide.cpp
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / boost / libs / safe_numerics / test / test_checked_divide.cpp
CommitLineData
92f5a8d4
TL
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
14template<class T>
15bool test_checked_divide(
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 << v1 << " / " << v2 << " -> " << result
24 << std::endl;
25
26 switch(expected_result){
27 case '.':
28 case '0':
29 if(result.exception()){
30 std::cout
31 << "*** erroneously detected error in division"
32 << std::endl;
33 v1 / v2;
34 return false;
35 }
36 if(expected_result == '0'
37 && result != T(0)
38 ){
39 std::cout
40 << "*** failed to get expected zero result "
41 << std::endl;
42 v1 / v2;
43 return false;
44 }
45 return true;
46 case '-':
47 if(safe_numerics_error::negative_overflow_error == result.m_e)
48 return true;
f67539c2 49 break;
92f5a8d4
TL
50 case '+':
51 if(safe_numerics_error::positive_overflow_error == result.m_e)
52 return true;
f67539c2 53 break;
92f5a8d4
TL
54 case '!':
55 if(safe_numerics_error::range_error == result.m_e)
56 return true;
f67539c2 57 break;
92f5a8d4
TL
58 }
59 std::cout
60 << "*** failed to detect error in division "
61 << std::hex << result << "(" << std::dec << result << ")"
62 << " != "<< v1 << " / " << v2
63 << std::endl;
64 v1 / v2;
65 return false;
66}
67
68#include "test_checked_divide.hpp"
69
70template<typename T, typename First, typename Second>
71struct test_signed_pair {
72 bool operator()() const {
73 std::size_t i = First();
74 std::size_t j = Second();
75 std::cout << std::dec << i << ',' << j << ','
76 << "testing " << boost::core::demangle(typeid(T).name()) << ' ';
77 return test_checked_divide(
78 signed_values<T>[i],
79 signed_values<T>[j],
80 signed_division_results[i][j]
81 );
82 };
83};
84
85template<typename T, typename First, typename Second>
86struct test_unsigned_pair {
87 bool operator()() const {
88 std::size_t i = First();
89 std::size_t j = Second();
90 std::cout << std::dec << i << ',' << j << ','
91 << "testing " << boost::core::demangle(typeid(T).name()) << ' ';
92 return test_checked_divide(
93 unsigned_values<T>[i],
94 unsigned_values<T>[j],
95 unsigned_division_results[i][j]
96 );
97 };
98};
99
100#include <boost/mp11/algorithm.hpp>
101
102int main(){
103 using namespace boost::mp11;
104
105 bool rval = true;
106
107 std::cout << "*** testing signed values\n";
108 mp_for_each<
109 mp_product<
110 test_signed_pair,
111 signed_test_types,
112 signed_value_indices,
113 signed_value_indices
114 >
115 >([&](auto I){
116 rval &= I();
117 });
118
119 std::cout << "*** testing unsigned values\n";
120 mp_for_each<
121 mp_product<
122 test_unsigned_pair,
123 unsigned_test_types,
124 unsigned_value_indices, unsigned_value_indices
125 >
126 >([&](auto I){
127 rval &= I();
128 });
129
130 std::cout << (rval ? "success!" : "failure") << std::endl;
131 return rval ? 0 : 1;
132}