]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/multiprecision/test/test_mixed_move_cpp_int.cpp
1 ///////////////////////////////////////////////////////////////
2 // Copyright 2020 John Maddock. Distributed under the Boost
3 // Software License, Version 1.0. (See accompanying file
4 // LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt
7 // Compare arithmetic results using fixed_int to GMP results.
11 #define _SCL_SECURE_NO_WARNINGS
14 #include <boost/multiprecision/cpp_int.hpp>
18 #if __has_feature(address_sanitizer) || __has_feature(memory_sanitizer)
19 // memory sanitizer is incompatible with this test:
20 # define DISABLE_THIS_TEST
23 #ifdef BOOST_CI_ASAN_BUILD
24 #define DISABLE_THIS_TEST
27 #ifndef DISABLE_THIS_TEST
29 unsigned alloc_count
= 0;
30 void* operator new(std::size_t count
)
33 return std::malloc(count
);
35 void* operator new[](std::size_t count
)
38 return std::malloc(count
);
40 void operator delete(void * p
)noexcept
44 void operator delete[](void* p
)noexcept
50 template <class From
, class To
>
51 void test_one(From val
)
56 To
moved(std::move(copy
));
57 BOOST_CHECK_EQUAL(alloc_count
, 0);
58 BOOST_CHECK_EQUAL(moved
, target
);
61 BOOST_CHECK_EQUAL(copy
, val
);
62 BOOST_CHECK_EQUAL(moved
, 0);
64 moved
= std::move(copy
);
65 BOOST_CHECK_EQUAL(alloc_count
, 0);
66 BOOST_CHECK_EQUAL(moved
, target
);
69 template <class From
, class To
>
73 From limit
= pow(From(2), 1000);
77 test_one
<From
, To
>(val
);
78 test_one
<From
, To
>(-val
);
84 template <class From
, class To
>
85 void test_operations()
87 From a
= From(1) << 150;
88 From b
= From(1) << 149;
92 BOOST_CHECK_EQUAL(alloc_count
, 0);
93 BOOST_CHECK_EQUAL(c
, a
* b
);
99 BOOST_CHECK_EQUAL(alloc_count
, 0);
100 BOOST_CHECK_EQUAL(c
, a
* b
);
105 BOOST_CHECK_EQUAL(alloc_count
, 0);
106 BOOST_CHECK_EQUAL(c
, a
+ b
);
112 BOOST_CHECK_EQUAL(alloc_count
, 0);
113 BOOST_CHECK_EQUAL(c
, a
+ b
);
118 BOOST_CHECK_EQUAL(alloc_count
, 0);
119 BOOST_CHECK_EQUAL(c
, -a
);
124 BOOST_CHECK_EQUAL(alloc_count
, 0);
125 BOOST_CHECK_EQUAL(c
, a
- b
);
131 BOOST_CHECK_EQUAL(alloc_count
, 0);
132 BOOST_CHECK_EQUAL(c
, a
- b
);
137 BOOST_CHECK_EQUAL(alloc_count
, 0);
138 BOOST_CHECK_EQUAL(c
, a
/ b
);
143 BOOST_CHECK_EQUAL(alloc_count
, 0);
144 BOOST_CHECK_EQUAL(c
, a
% b
);
149 BOOST_CHECK_EQUAL(alloc_count
, 0);
150 BOOST_CHECK_EQUAL(c
, a
<< 1);
155 BOOST_CHECK_EQUAL(alloc_count
, 0);
156 BOOST_CHECK_EQUAL(c
, a
>> 1);
161 BOOST_CHECK_EQUAL(alloc_count
, 0);
162 BOOST_CHECK_EQUAL(c
, a
| b
);
167 BOOST_CHECK_EQUAL(alloc_count
, 0);
168 BOOST_CHECK_EQUAL(c
, a
& b
);
173 BOOST_CHECK_EQUAL(alloc_count
, 0);
174 BOOST_CHECK_EQUAL(c
, a
^ b
);
179 BOOST_CHECK_EQUAL(c
, gcd(a
, b
));
184 BOOST_CHECK_EQUAL(c
, lcm(a
, b
));
189 BOOST_CHECK_EQUAL(c
, pow(a
, 2));
193 To c
= powm(a
, b
, 2);
194 BOOST_CHECK_EQUAL(c
, powm(a
, b
, 2));
199 BOOST_CHECK_EQUAL(c
, sqrt(a
));
205 using namespace boost::multiprecision
;
207 // Our "From" type has the MinBits argument as small as possible,
208 // should it be larger than the default used in cpp_int then we
209 // may get allocations causing the tests above to fail since the
210 // internal cache in type From is larger than that of cpp_int and so
211 // allocation may be needed even on a move.
213 test
<number
<cpp_int_backend
<sizeof(limb_type
) * CHAR_BIT
* 2> >, cpp_int
>();
215 typedef boost::multiprecision::number
<boost::multiprecision::cpp_int_backend
<512> > To
;
216 test_operations
<cpp_int
, To
>();
218 return boost::report_errors();
222 int main(){ return 0; }