File: constexpr_test_arithmetic_backend.cpp

package info (click to toggle)
boost1.90 1.90.0-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 593,120 kB
  • sloc: cpp: 4,190,908; xml: 196,648; python: 34,618; ansic: 23,145; asm: 5,468; sh: 3,774; makefile: 1,161; perl: 1,020; sql: 728; ruby: 676; yacc: 478; java: 77; lisp: 24; csh: 6
file content (130 lines) | stat: -rw-r--r-- 4,490 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
//  (C) Copyright John Maddock 2019.
//  Use, modification and distribution are subject to the
//  Boost Software License, Version 1.0. (See accompanying file
//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

#include "constexpr_arithmetric_test.hpp"
#include "../performance/arithmetic_backend.hpp"

template <class T>
constexpr int expected_1()
{
#ifdef BOOST_HAS_INT128
   if constexpr (std::is_constructible<T, boost::int128_type>::value)
      return 230;
   else
#endif
      return 210;
}
template <class T>
constexpr int expected_2()
{
#ifdef BOOST_HAS_INT128
   if constexpr (std::is_constructible<T, boost::int128_type>::value)
      return 120;
   else
#endif
      return 106;
}


int main()
{
   typedef boost::multiprecision::number<boost::multiprecision::backends::arithmetic_backend<long long>, boost::multiprecision::et_off>          int_backend;
   typedef boost::multiprecision::number<boost::multiprecision::backends::arithmetic_backend<unsigned long long>, boost::multiprecision::et_off> unsigned_backend;

   typedef boost::multiprecision::number<boost::multiprecision::backends::arithmetic_backend<long long>, boost::multiprecision::et_on>          int_backend_et;
   typedef boost::multiprecision::number<boost::multiprecision::backends::arithmetic_backend<unsigned long long>, boost::multiprecision::et_on> unsigned_backend_et;

   {
      constexpr int_backend a(22);
      constexpr unsigned_backend c(22);
      constexpr int_backend b      = test_constexpr_add_subtract(a);
      constexpr unsigned_backend d = test_constexpr_add_subtract(c);

      constexpr long long llv = (long long)b;

      static_assert(b == -108);
      static_assert(llv == -108);
      static_assert(d == 554);
   }
   {
      constexpr int_backend a(22);
      constexpr unsigned_backend c(22);
      constexpr int_backend b      = test_constexpr_mul_divide(a);
      constexpr unsigned_backend d = test_constexpr_mul_divide(c);
      static_assert(b == 22);
      static_assert(d == 22);
   }
   {
      constexpr int_backend a(22);
      constexpr unsigned_backend c(22);
      constexpr int_backend b      = test_constexpr_bitwise(a);
      constexpr unsigned_backend d = test_constexpr_bitwise(c);

      static_assert(b == expected_1<int_backend>());
      static_assert(d == expected_2<unsigned_backend>());
   }
   {
      constexpr int_backend a(22);
      constexpr unsigned_backend c(22);
      constexpr int_backend b      = test_constexpr_logical(a);
      constexpr unsigned_backend d = test_constexpr_logical(c);
      static_assert(b == 82);
      static_assert(d == 82);
   }
   {
      constexpr int_backend a(22);
      constexpr unsigned_backend c(22);
      constexpr int_backend b      = test_constexpr_compare(a);
      constexpr unsigned_backend d = test_constexpr_compare(c);
      static_assert(b == 95);
      static_assert(d == 95);
   }
   //
   // Over again with expression templates turned on:
   //
   {
      constexpr int_backend_et a(22);
      constexpr unsigned_backend_et c(22);
      constexpr int_backend_et b      = test_constexpr_add_subtract(a);
      constexpr unsigned_backend_et d = test_constexpr_add_subtract(c);

      static_assert(b == -108);
      static_assert(d == 554);
   }
   {
      constexpr int_backend_et a(22);
      constexpr unsigned_backend_et c(22);
      constexpr int_backend_et b      = test_constexpr_mul_divide(a);
      constexpr unsigned_backend_et d = test_constexpr_mul_divide(c);
      static_assert(b == 22);
      static_assert(d == 22);
   }
   {
      constexpr int_backend_et a(22);
      constexpr unsigned_backend_et c(22);
      constexpr int_backend_et b      = test_constexpr_bitwise(a);
      constexpr unsigned_backend_et d = test_constexpr_bitwise(c);

      static_assert(b == expected_1<int_backend>());
      static_assert(d == expected_2<int_backend>());
   }
   {
      constexpr int_backend_et a(22);
      constexpr unsigned_backend_et c(22);
      constexpr int_backend_et b      = test_constexpr_logical(a);
      constexpr unsigned_backend_et d = test_constexpr_logical(c);
      static_assert(b == 82);
      static_assert(d == 82);
   }
   {
      constexpr int_backend_et a(22);
      constexpr unsigned_backend_et c(22);
      constexpr int_backend_et b      = test_constexpr_compare(a);
      constexpr unsigned_backend_et d = test_constexpr_compare(c);
      static_assert(b == 95);
      static_assert(d == 95);
   }
   std::cout << "Done!" << std::endl;
}