DGtal 1.3.0
Loading...
Searching...
No Matches
IntegerConverter.h
1
17#pragma once
18
31#if defined(IntegerConverter_RECURSES)
32#error Recursive header files inclusion detected in IntegerConverter.h
33#else // defined(IntegerConverter_RECURSES)
35#define IntegerConverter_RECURSES
36
37#if !defined IntegerConverter_h
39#define IntegerConverter_h
40
42// Inclusions
43#include <iostream>
44#include <string>
45#include <vector>
46#include <array>
47#include "DGtal/base/Common.h"
48#include "DGtal/kernel/CInteger.h"
49#include "DGtal/kernel/NumberTraits.h"
50#include "DGtal/kernel/PointVector.h"
51
52namespace DGtal
53{
54#ifdef WITH_BIGINTEGER
55 namespace detail {
57
60 static void mpz_set_sll(mpz_t n, long long sll)
61 {
62 mpz_set_si(n, (int)(sll >> 32)); /* n = (int)sll >> 32 */
63 mpz_mul_2exp(n, n, 32 ); /* n <<= 32 */
64 mpz_add_ui(n, n, (unsigned int)sll); /* n += (unsigned int)sll */
65 }
66
69 static void mpz_set_ull(mpz_t n, unsigned long long ull)
70 {
71 mpz_set_ui(n, (unsigned int)(ull >> 32)); /* n = (unsigned int)(ull >> 32) */
72 mpz_mul_2exp(n, n, 32); /* n <<= 32 */
73 mpz_add_ui(n, n, (unsigned int)ull); /* n += (unsigned int)ull */
74 }
75
79 static unsigned long long mpz_get_ull(mpz_t n)
80 {
81 unsigned int lo, hi;
82 mpz_t tmp;
83 mpz_init( tmp );
84 mpz_mod_2exp( tmp, n, 64 ); /* tmp = (lower 64 bits of n) */
85 lo = mpz_get_ui( tmp ); /* lo = tmp & 0xffffffff */
86 mpz_div_2exp( tmp, tmp, 32 ); /* tmp >>= 32 */
87 hi = mpz_get_ui( tmp ); /* hi = tmp & 0xffffffff */
88 mpz_clear( tmp );
89 return (((unsigned long long)hi) << 32) + lo;
90 }
91
95 static long long mpz_get_sll(mpz_t n)
96 {
97 return (long long)mpz_get_ull(n); /* just use unsigned version */
98 }
99 }
100#endif
101
103
115 template < DGtal::Dimension dim,
116 typename TInteger >
119 typedef TInteger Integer;
120
123 static Integer cast( Integer i )
124 {
125 return i;
126 }
127
132 static
135 {
136 return p;
137 }
138 };
139
149 template < DGtal::Dimension dim >
152
156 {
157 return i;
158 }
159
164 static
167 {
168 return p;
169 }
170
174 {
176 if ( DGtal::int64_t( r ) != i )
177 trace.warning() << "Bad integer conversion: " << i << " -> " << r
178 << std::endl;
179 return r;
180 }
181
186 static
189 {
191 for ( DGtal::Dimension i = 0; i < dim; i++ )
192 q[ i ] = cast( p[ i ] );
193 return q;
194 }
195
196#ifdef WITH_BIGINTEGER
200 {
201 DGtal::int32_t r = i.get_si();
202 if ( DGtal::BigInteger( r ) != i )
203 trace.warning() << "Bad integer conversion: " << i << " -> " << r
204 << std::endl;
205 return r;
206 }
207
212 static
215 {
217 for ( DGtal::Dimension i = 0; i < dim; i++ )
218 q[ i ] = cast( p[ i ] );
219 return q;
220 }
221
222#endif
223 };
224
225
235 template < DGtal::Dimension dim >
238
242 {
243 return i;
244 }
245
250 static
253 {
255 for ( DGtal::Dimension i = 0; i < dim; i++ )
256 q[ i ] = cast( p[ i ] );
257 return q;
258 }
259
263 {
264 return i;
265 }
266
271 static
274 {
275 return p;
276 }
277
278#ifdef WITH_BIGINTEGER
282 {
283 DGtal::int64_t r = detail::mpz_get_sll( i.get_mpz_t() );
285 detail::mpz_set_sll( tmp.get_mpz_t(), r );
286 if ( tmp != i )
287 trace.warning() << "Bad integer conversion: " << i << " -> " << r
288 << std::endl;
289 return r;
290 }
291
296 static
299 {
301 for ( DGtal::Dimension i = 0; i < dim; i++ )
302 q[ i ] = cast( p[ i ] );
303 return q;
304 }
305
306#endif
307 };
308
309
310#ifdef WITH_BIGINTEGER
320 template < DGtal::Dimension dim >
323
327 {
328 return DGtal::BigInteger( i );
329 }
330
335 static
338 {
340 for ( DGtal::Dimension i = 0; i < dim; i++ )
341 q[ i ] = cast( p[ i ] );
342 return q;
343 }
344
348 {
350 detail::mpz_set_sll( tmp.get_mpz_t(), i );
351 return tmp;
352 }
353
358 static
361 {
363 for ( DGtal::Dimension i = 0; i < dim; i++ )
364 q[ i ] = cast( p[ i ] );
365 return q;
366 }
367
371 {
372 return i;
373 }
374
379 static
382 {
383 return p;
384 }
385
386 };
387#endif
388
389
390} // namespace DGtal {
391
392#endif // !defined IntegerConverter_h
393
394#undef IntegerConverter_RECURSES
395#endif // else defined(IntegerConverter_RECURSES)
std::ostream & warning()
static void mpz_set_sll(mpz_t n, long long sll)
----------— GMP SPECIALIZED SERVICES -------------------------—
static long long mpz_get_sll(mpz_t n)
static unsigned long long mpz_get_ull(mpz_t n)
static void mpz_set_ull(mpz_t n, unsigned long long ull)
DGtal is the top-level namespace which contains all DGtal functions and types.
boost::int64_t int64_t
signed 94-bit integer.
Definition: BasicTypes.h:74
DGtal::uint32_t Dimension
Definition: Common.h:137
Trace trace
Definition: Common.h:154
boost::int32_t int32_t
signed 32-bit integer.
Definition: BasicTypes.h:72
mpz_class BigInteger
Multi-precision integer with GMP implementation.
Definition: BasicTypes.h:79
static PointVector< dim, DGtal::BigInteger > cast(PointVector< dim, DGtal::BigInteger > p)
static DGtal::BigInteger cast(DGtal::int32_t i)
static PointVector< dim, DGtal::BigInteger > cast(PointVector< dim, DGtal::int32_t > p)
static PointVector< dim, DGtal::BigInteger > cast(PointVector< dim, DGtal::int64_t > p)
static DGtal::BigInteger cast(DGtal::BigInteger i)
static DGtal::BigInteger cast(DGtal::int64_t i)
static DGtal::int32_t cast(DGtal::int32_t i)
static PointVector< dim, DGtal::int32_t > cast(PointVector< dim, DGtal::int64_t > p)
static PointVector< dim, DGtal::int32_t > cast(PointVector< dim, DGtal::BigInteger > p)
static DGtal::int32_t cast(DGtal::BigInteger i)
static PointVector< dim, DGtal::int32_t > cast(PointVector< dim, DGtal::int32_t > p)
static DGtal::int32_t cast(DGtal::int64_t i)
static DGtal::int64_t cast(DGtal::int32_t i)
static PointVector< dim, DGtal::int64_t > cast(PointVector< dim, DGtal::int64_t > p)
static DGtal::int64_t cast(DGtal::int64_t i)
static PointVector< dim, DGtal::int64_t > cast(PointVector< dim, DGtal::BigInteger > p)
static PointVector< dim, DGtal::int64_t > cast(PointVector< dim, DGtal::int32_t > p)
static DGtal::int64_t cast(DGtal::BigInteger i)
----------— INTEGER/POINT CONVERSION SERVICES -----------------—
BOOST_CONCEPT_ASSERT((concepts::CInteger< TInteger >))
static PointVector< dim, Integer > cast(PointVector< dim, Integer > p)
static Integer cast(Integer i)
Aim: Concept checking for Integer Numbers. More precisely, this concept is a refinement of both CEucl...
Definition: CInteger.h:88