1 #include <iostream>
2 #include <cassert>
3 #include <limits>
4
5 #include <boost/safe_numerics/utility.hpp>
6 #include <boost/safe_numerics/safe_integer_range.hpp>
7
8 template<typename T>
display_log(T Max)9 void display_log(T Max){
10 std::cout
11 << "ilog2(" << Max << ") = "
12 << boost::safe_numerics::utility::ilog2(Max) << std::endl;
13 }
14
test_significant_bits()15 bool test_significant_bits(){
16 using namespace boost::safe_numerics;
17 assert(utility::significant_bits(127u) == 7); // 7 bits
18 assert(utility::significant_bits(127u) == 7); // 7 bits
19 assert(utility::significant_bits(128u) == 8); // 8 bits
20 assert(utility::significant_bits(129u) == 8); // 8 bits
21 assert(utility::significant_bits(255u) == 8); // 8 bits
22 assert(utility::significant_bits(256u) == 9); // 9 bits
23 return true;
24 }
25
test1()26 bool test1(){
27 using namespace boost::safe_numerics;
28 using t2 = safe_unsigned_range<0u, 1000u>;
29 static_assert(
30 std::numeric_limits<t2>::is_signed == false,
31 "this range should be unsigned"
32 );
33 return true;
34 }
35
36 #include <boost/safe_numerics/automatic.hpp>
37
38 template <
39 std::intmax_t Min,
40 std::intmax_t Max
41 >
42 using safe_t = boost::safe_numerics::safe_signed_range<
43 Min,
44 Max,
45 boost::safe_numerics::automatic,
46 boost::safe_numerics::default_exception_policy
47 >;
48
test2()49 bool test2(){
50 std::cout << "test1" << std::endl;
51 try{
52 const safe_t<-64, 63> x(1);
53 safe_t<-64, 63> y;
54 y = 2;
55 std::cout << "x = " << x << std::endl;
56 std::cout << "y = " << y << std::endl;
57 auto z = x + y;
58 std::cout << "x + y = ["
59 << std::numeric_limits<decltype(z)>::min() << ","
60 << std::numeric_limits<decltype(z)>::max() << "] = "
61 << z << std::endl;
62
63 auto z2 = x - y;
64 std::cout << "x - y = ["
65 << std::numeric_limits<decltype(z2)>::min() << ","
66 << std::numeric_limits<decltype(z2)>::max() << "] = "
67 << z2 << std::endl;
68
69 short int yi, zi;
70 yi = y;
71 zi = x + yi;
72 }
73 catch(const std::exception & e){
74 // none of the above should trap. Mark failure if they do
75 std::cout << e.what() << std::endl;
76 return false;
77 }
78 return true;
79 }
80
main()81 int main(){
82 //using namespace boost::safe_numerics;
83 //safe_signed_literal2<100> one_hundred;
84 //one_hundred = 200;
85
86 bool rval =
87 test_significant_bits() &&
88 test1() &&
89 test2() /* &&
90 test3() &&
91 test4()
92 */
93 ;
94 std::cout << (rval ? "success!" : "failure") << std::endl;
95 return rval ? EXIT_SUCCESS : EXIT_FAILURE;
96 }
97