• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 ///////////////////////////////////////////////////////////////
2 //  Copyright 2012 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
5 //
6 // Comparison operators for cpp_int_backend:
7 //
8 #ifndef BOOST_MP_CPP_INT_COMPARISON_HPP
9 #define BOOST_MP_CPP_INT_COMPARISON_HPP
10 
11 #include <boost/type_traits/make_unsigned.hpp>
12 #include <boost/multiprecision/detail/constexpr.hpp>
13 
14 namespace boost { namespace multiprecision { namespace backends {
15 
16 #ifdef BOOST_MSVC
17 #pragma warning(push)
18 #pragma warning(disable : 4018 4389 4996)
19 #endif
20 
21 //
22 // Start with non-trivial cpp_int's:
23 //
24 template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
25 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
26     !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> >::value,
27     bool>::type
eval_eq(const cpp_int_backend<MinBits,MaxBits,SignType,Checked,Allocator> & a,const cpp_int_backend<MinBits,MaxBits,SignType,Checked,Allocator> & b)28 eval_eq(const cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>& a, const cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>& b) BOOST_NOEXCEPT
29 {
30    return (a.sign() == b.sign()) && (a.size() == b.size()) && std_constexpr::equal(a.limbs(), a.limbs() + a.size(), b.limbs());
31 }
32 template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
33 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
34     !is_trivial_cpp_int<cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1> >::value && !is_trivial_cpp_int<cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2> >::value,
35     bool>::type
eval_eq(const cpp_int_backend<MinBits1,MaxBits1,SignType1,Checked1,Allocator1> & a,const cpp_int_backend<MinBits2,MaxBits2,SignType2,Checked2,Allocator2> & b)36 eval_eq(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& a, const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& b) BOOST_NOEXCEPT
37 {
38    return (a.sign() == b.sign()) && (a.size() == b.size()) && std_constexpr::equal(a.limbs(), a.limbs() + a.size(), b.limbs());
39 }
40 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
41 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
42     !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator> >::value,
43     bool>::type
eval_eq(const cpp_int_backend<MinBits,MaxBits,signed_magnitude,Checked,Allocator> & a,limb_type b)44 eval_eq(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator>& a, limb_type b) BOOST_NOEXCEPT
45 {
46    return (a.sign() == false) && (a.size() == 1) && (*a.limbs() == b);
47 }
48 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
49 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
50     !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator> >::value,
51     bool>::type
eval_eq(const cpp_int_backend<MinBits,MaxBits,signed_magnitude,Checked,Allocator> & a,signed_limb_type b)52 eval_eq(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator>& a, signed_limb_type b) BOOST_NOEXCEPT
53 {
54    return (a.sign() == (b < 0)) && (a.size() == 1) && (*a.limbs() == boost::multiprecision::detail::unsigned_abs(b));
55 }
56 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
57 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
58     !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator> >::value,
59     bool>::type
eval_eq(const cpp_int_backend<MinBits,MaxBits,unsigned_magnitude,Checked,Allocator> & a,limb_type b)60 eval_eq(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator>& a, limb_type b) BOOST_NOEXCEPT
61 {
62    return (a.size() == 1) && (*a.limbs() == b);
63 }
64 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
65 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
66     !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator> >::value,
67     bool>::type
eval_eq(const cpp_int_backend<MinBits,MaxBits,unsigned_magnitude,Checked,Allocator> & a,signed_limb_type b)68 eval_eq(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator>& a, signed_limb_type b) BOOST_NOEXCEPT
69 {
70    return (b < 0) ? eval_eq(a, cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator>(b)) : eval_eq(a, static_cast<limb_type>(b)); // Use bit pattern of b for comparison
71 }
72 
73 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
74 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
75     !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator> >::value,
76     bool>::type
eval_lt(const cpp_int_backend<MinBits,MaxBits,signed_magnitude,Checked,Allocator> & a,limb_type b)77 eval_lt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator>& a, limb_type b) BOOST_NOEXCEPT
78 {
79    if (a.sign())
80       return true;
81    if (a.size() > 1)
82       return false;
83    return *a.limbs() < b;
84 }
85 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
86 inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
87     !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator> >::value,
88     bool>::type
eval_lt(const cpp_int_backend<MinBits,MaxBits,signed_magnitude,Checked,Allocator> & a,signed_limb_type b)89 eval_lt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator>& a, signed_limb_type b) BOOST_NOEXCEPT
90 {
91    if ((b == 0) || (a.sign() != (b < 0)))
92       return a.sign();
93    if (a.sign())
94    {
95       if (a.size() > 1)
96          return true;
97       return *a.limbs() > boost::multiprecision::detail::unsigned_abs(b);
98    }
99    else
100    {
101       if (a.size() > 1)
102          return false;
103       return *a.limbs() < boost::multiprecision::detail::unsigned_abs(b);
104    }
105 }
106 
107 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
108 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
109     !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator> >::value,
110     bool>::type
eval_lt(const cpp_int_backend<MinBits,MaxBits,unsigned_magnitude,Checked,Allocator> & a,limb_type b)111 eval_lt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator>& a, limb_type b) BOOST_NOEXCEPT
112 {
113    if (a.size() > 1)
114       return false;
115    return *a.limbs() < b;
116 }
117 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
118 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
119     !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator> >::value,
120     bool>::type
eval_lt(const cpp_int_backend<MinBits,MaxBits,unsigned_magnitude,Checked,Allocator> & a,signed_limb_type b)121 eval_lt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator>& a, signed_limb_type b) BOOST_NOEXCEPT
122 {
123    return (b < 0) ? a.compare(b) < 0 : eval_lt(a, static_cast<limb_type>(b)); // Use bit pattern of b for comparison
124 }
125 
126 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
127 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
128     !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator> >::value,
129     bool>::type
eval_gt(const cpp_int_backend<MinBits,MaxBits,signed_magnitude,Checked,Allocator> & a,limb_type b)130 eval_gt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator>& a, limb_type b) BOOST_NOEXCEPT
131 {
132    if (a.sign())
133       return false;
134    if (a.size() > 1)
135       return true;
136    return *a.limbs() > b;
137 }
138 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
139 inline BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
140     !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator> >::value,
141     bool>::type
eval_gt(const cpp_int_backend<MinBits,MaxBits,signed_magnitude,Checked,Allocator> & a,signed_limb_type b)142 eval_gt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, Allocator>& a, signed_limb_type b) BOOST_NOEXCEPT
143 {
144    if (b == 0)
145       return !a.sign() && ((a.size() > 1) || *a.limbs());
146    if (a.sign() != (b < 0))
147       return !a.sign();
148    if (a.sign())
149    {
150       if (a.size() > 1)
151          return false;
152       return *a.limbs() < boost::multiprecision::detail::unsigned_abs(b);
153    }
154    else
155    {
156       if (a.size() > 1)
157          return true;
158       return *a.limbs() > boost::multiprecision::detail::unsigned_abs(b);
159    }
160 }
161 
162 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
163 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
164     !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator> >::value,
165     bool>::type
eval_gt(const cpp_int_backend<MinBits,MaxBits,unsigned_magnitude,Checked,Allocator> & a,limb_type b)166 eval_gt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator>& a, limb_type b) BOOST_NOEXCEPT
167 {
168    if (a.size() > 1)
169       return true;
170    return *a.limbs() > b;
171 }
172 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class Allocator>
173 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
174     !is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator> >::value,
175     bool>::type
eval_gt(const cpp_int_backend<MinBits,MaxBits,unsigned_magnitude,Checked,Allocator> & a,signed_limb_type b)176 eval_gt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, Allocator>& a, signed_limb_type b) BOOST_NOEXCEPT
177 {
178    return (b < 0) ? a.compare(b) > 0 : eval_gt(a, static_cast<limb_type>(b)); // Use bit pattern of b for comparison.
179 }
180 //
181 // And again for trivial cpp_ints:
182 //
183 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked>
184 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
185     is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,
186     bool>::value
eval_eq(const cpp_int_backend<MinBits,MaxBits,signed_magnitude,Checked,void> & a,const cpp_int_backend<MinBits,MaxBits,signed_magnitude,Checked,void> & b)187 eval_eq(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>& a, const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>& b) BOOST_NOEXCEPT
188 {
189    return (a.sign() == b.sign()) && (*a.limbs() == *b.limbs());
190 }
191 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked>
192 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
193     is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,
194     bool>::value
eval_eq(const cpp_int_backend<MinBits,MaxBits,unsigned_magnitude,Checked,void> & a,const cpp_int_backend<MinBits,MaxBits,unsigned_magnitude,Checked,void> & b)195 eval_eq(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& a, const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& b) BOOST_NOEXCEPT
196 {
197    return *a.limbs() == *b.limbs();
198 }
199 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class U>
200 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
201     is_unsigned<U>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,
202     bool>::type
eval_eq(const cpp_int_backend<MinBits,MaxBits,signed_magnitude,Checked,void> & a,U b)203 eval_eq(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>& a, U b) BOOST_NOEXCEPT
204 {
205    return !a.sign() && (*a.limbs() == b);
206 }
207 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class S>
208 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
209     is_signed<S>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,
210     bool>::type
eval_eq(const cpp_int_backend<MinBits,MaxBits,signed_magnitude,Checked,void> & a,S b)211 eval_eq(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>& a, S b) BOOST_NOEXCEPT
212 {
213    return (a.sign() == (b < 0)) && (*a.limbs() == boost::multiprecision::detail::unsigned_abs(b));
214 }
215 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class U>
216 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
217     is_unsigned<U>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,
218     bool>::type
eval_eq(const cpp_int_backend<MinBits,MaxBits,unsigned_magnitude,Checked,void> & a,U b)219 eval_eq(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& a, U b) BOOST_NOEXCEPT
220 {
221    return *a.limbs() == b;
222 }
223 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class S>
224 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
225     is_signed<S>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,
226     bool>::type
eval_eq(const cpp_int_backend<MinBits,MaxBits,unsigned_magnitude,Checked,void> & a,S b)227 eval_eq(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& a, S b) BOOST_NOEXCEPT
228 {
229    typedef typename make_unsigned<S>::type ui_type;
230    if (b < 0)
231    {
232       cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> t(b);
233       return *a.limbs() == *t.limbs();
234    }
235    else
236    {
237       return *a.limbs() == static_cast<ui_type>(b);
238    }
239 }
240 
241 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked>
242 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
243     is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,
244     bool>::type
eval_lt(const cpp_int_backend<MinBits,MaxBits,signed_magnitude,Checked,void> & a,const cpp_int_backend<MinBits,MaxBits,unsigned_magnitude,Checked,void> & b)245 eval_lt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>& a, const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& b) BOOST_NOEXCEPT
246 {
247    if (a.sign() != b.sign())
248       return a.sign();
249    return a.sign() ? *a.limbs() > *b.limbs() : *a.limbs() < *b.limbs();
250 }
251 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked>
252 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
253     is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,
254     bool>::type
eval_lt(const cpp_int_backend<MinBits,MaxBits,unsigned_magnitude,Checked,void> & a,const cpp_int_backend<MinBits,MaxBits,unsigned_magnitude,Checked,void> & b)255 eval_lt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& a, const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& b) BOOST_NOEXCEPT
256 {
257    return *a.limbs() < *b.limbs();
258 }
259 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class U>
260 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
261     is_unsigned<U>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,
262     bool>::type
eval_lt(const cpp_int_backend<MinBits,MaxBits,signed_magnitude,Checked,void> & a,U b)263 eval_lt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>& a, U b) BOOST_NOEXCEPT
264 {
265    if (a.sign())
266       return true;
267    return *a.limbs() < b;
268 }
269 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class S>
270 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
271     is_signed<S>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,
272     bool>::type
eval_lt(const cpp_int_backend<MinBits,MaxBits,signed_magnitude,Checked,void> & a,S b)273 eval_lt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>& a, S b) BOOST_NOEXCEPT
274 {
275    if (a.sign() != (b < 0))
276       return a.sign();
277    return a.sign() ? (*a.limbs() > boost::multiprecision::detail::unsigned_abs(b)) : (*a.limbs() < boost::multiprecision::detail::unsigned_abs(b));
278 }
279 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class U>
280 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
281     is_unsigned<U>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,
282     bool>::type
eval_lt(const cpp_int_backend<MinBits,MaxBits,unsigned_magnitude,Checked,void> & a,U b)283 eval_lt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& a, U b) BOOST_NOEXCEPT
284 {
285    return *a.limbs() < b;
286 }
287 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class S>
288 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
289     is_signed<S>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,
290     bool>::type
eval_lt(const cpp_int_backend<MinBits,MaxBits,unsigned_magnitude,Checked,void> & a,S b)291 eval_lt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& a, S b) BOOST_NOEXCEPT
292 {
293    typedef typename make_unsigned<S>::type ui_type;
294    if (b < 0)
295    {
296       cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> t(b);
297       return *a.limbs() < *t.limbs();
298    }
299    else
300    {
301       return *a.limbs() < static_cast<ui_type>(b);
302    }
303 }
304 
305 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked>
306 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
307     is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,
308     bool>::type
eval_gt(const cpp_int_backend<MinBits,MaxBits,signed_magnitude,Checked,void> & a,const cpp_int_backend<MinBits,MaxBits,signed_magnitude,Checked,void> & b)309 eval_gt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>& a, const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>& b) BOOST_NOEXCEPT
310 {
311    if (a.sign() != b.sign())
312       return !a.sign();
313    return a.sign() ? *a.limbs() < *b.limbs() : *a.limbs() > *b.limbs();
314 }
315 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked>
316 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
317     is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,
318     bool>::type
eval_gt(const cpp_int_backend<MinBits,MaxBits,unsigned_magnitude,Checked,void> & a,const cpp_int_backend<MinBits,MaxBits,unsigned_magnitude,Checked,void> & b)319 eval_gt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& a, const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& b) BOOST_NOEXCEPT
320 {
321    return *a.limbs() > *b.limbs();
322 }
323 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class U>
324 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
325     is_unsigned<U>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,
326     bool>::type
eval_gt(const cpp_int_backend<MinBits,MaxBits,signed_magnitude,Checked,void> & a,U b)327 eval_gt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>& a, U b) BOOST_NOEXCEPT
328 {
329    if (a.sign())
330       return false;
331    return *a.limbs() > b;
332 }
333 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class S>
334 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
335     is_signed<S>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void> >::value,
336     bool>::type
eval_gt(const cpp_int_backend<MinBits,MaxBits,signed_magnitude,Checked,void> & a,S b)337 eval_gt(const cpp_int_backend<MinBits, MaxBits, signed_magnitude, Checked, void>& a, S b) BOOST_NOEXCEPT
338 {
339    if (a.sign() != (b < 0))
340       return !a.sign();
341    return a.sign() ? (*a.limbs() < boost::multiprecision::detail::unsigned_abs(b)) : (*a.limbs() > boost::multiprecision::detail::unsigned_abs(b));
342 }
343 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class U>
344 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
345     is_unsigned<U>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,
346     bool>::type
eval_gt(const cpp_int_backend<MinBits,MaxBits,unsigned_magnitude,Checked,void> & a,U b)347 eval_gt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& a, U b) BOOST_NOEXCEPT
348 {
349    return *a.limbs() > b;
350 }
351 template <unsigned MinBits, unsigned MaxBits, cpp_int_check_type Checked, class S>
352 BOOST_MP_FORCEINLINE BOOST_MP_CXX14_CONSTEXPR typename enable_if_c<
353     is_signed<S>::value && is_trivial_cpp_int<cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> >::value,
354     bool>::type
eval_gt(const cpp_int_backend<MinBits,MaxBits,unsigned_magnitude,Checked,void> & a,S b)355 eval_gt(const cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void>& a, S b) BOOST_NOEXCEPT
356 {
357    typedef typename make_unsigned<S>::type ui_type;
358    if (b < 0)
359    {
360       cpp_int_backend<MinBits, MaxBits, unsigned_magnitude, Checked, void> t(b);
361       return *a.limbs() > *t.limbs();
362    }
363    else
364    {
365       return *a.limbs() > static_cast<ui_type>(b);
366    }
367 }
368 
369 #ifdef BOOST_MSVC
370 #pragma warning(pop)
371 #endif
372 
373 }}} // namespace boost::multiprecision::backends
374 
375 #endif
376