-
Notifications
You must be signed in to change notification settings - Fork 34
/
GMPInteger.h
242 lines (225 loc) · 8.9 KB
/
GMPInteger.h
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
using std::cout; using std::cerr; using std::endl;
#ifndef __CPP__INCLUDED__RPerl__DataType__GMPInteger_h
#define __CPP__INCLUDED__RPerl__DataType__GMPInteger_h 0.006_000
// NEED FIX: remove duplicate code
// DEV NOTE, CORRELATION #rp026: can't figure out how to get GMPInteger.cpp to include HelperFunctions.cpp without redefining errors
#define SvHROKp(input_hvref) (SvROK(input_hvref) && (SvTYPE(SvRV(input_hvref)) == SVt_PVHV))
# ifndef __CPP__INCLUDED__RPerl__DataType__GMPInteger_h__typedefs
#define __CPP__INCLUDED__RPerl__DataType__GMPInteger_h__typedefs 1
// [[[ TYPEDEFS ]]]
typedef mpz_class gmp_integer_retval;
typedef mpz_t gmp_integer;
// [[[ OO SUBCLASSES ]]]
#define gmp_integer_rawptr gmp_integer*
/* UNUSED?
typedef std::unique_ptr<gmp_integer> gmp_integer_ptr;
typedef std::vector<gmp_integer_ptr> gmp_integer_arrayref;
typedef std::unordered_map<string, gmp_integer_ptr> gmp_integer_hashref;
typedef std::unordered_map<string, gmp_integer_ptr>::iterator gmp_integer_hashref_iterator;
*/
# endif
// [[[ PRE-DECLARED TYPEDEFS ]]]
# ifndef __CPP__INCLUDED__RPerl__DataType__Boolean_h__typedefs
#define __CPP__INCLUDED__RPerl__DataType__Boolean_h__typedefs 1
typedef bool boolean;
# endif
# ifndef __CPP__INCLUDED__RPerl__DataType__UnsignedInteger_h__typedefs
#define __CPP__INCLUDED__RPerl__DataType__UnsignedInteger_h__typedefs 1
typedef unsigned long int unsigned_integer;
# endif
# ifndef __CPP__INCLUDED__RPerl__DataType__Integer_h__typedefs
#define __CPP__INCLUDED__RPerl__DataType__Integer_h__typedefs 1
// DEV NOTE, CORRELATION #rp001: keep track of all these hard-coded "semi-dynamic" integer data types
# ifdef __TYPE__INTEGER__LONG
typedef long integer;
#define INTEGER "ld" // assume format code 'ld' exists if type 'long' exists
# elif defined __TYPE__INTEGER__LONG_LONG
typedef long long integer;
#define INTEGER "lld" // assume format code 'lld' exists if type 'long long' exists
# elif defined __TYPE__INTEGER____INT8
typedef __int8 integer;
# if defined(_MSC_VER) && (_MSC_VER < 1800) // MSVC older-than-2013
#define INTEGER "I8d"
# else // non-Windows, Windows w/ GCC, or MSVC 2013-or-newer
#include <inttypes.h>
#define INTEGER "PRId8"
# endif
# elif defined __TYPE__INTEGER____INT16
typedef __int16 integer;
# if defined(_MSC_VER) && (_MSC_VER < 1800) // MSVC older-than-2013
#define INTEGER "I16d"
# else // non-Windows, Windows w/ GCC, or MSVC 2013-or-newer
#include <inttypes.h>
#define INTEGER "PRId16"
# endif
# elif defined __TYPE__INTEGER____INT32
typedef __int32 integer;
# if defined(_MSC_VER) && (_MSC_VER < 1800) // MSVC older-than-2013
#define INTEGER "I32d"
# else // non-Windows, Windows w/ GCC, or MSVC 2013-or-newer
#include <inttypes.h>
#define INTEGER "PRId32"
# endif
# elif defined __TYPE__INTEGER____INT64
typedef __int64 integer;
# if defined(_MSC_VER) && (_MSC_VER < 1800) // MSVC older-than-2013
#define INTEGER "I64d"
# else // non-Windows, Windows w/ GCC, or MSVC 2013-or-newer
#include <inttypes.h>
#define INTEGER "PRId64"
# endif
# elif defined __TYPE__INTEGER____INT128
typedef __int128 integer;
# if defined(_MSC_VER) && (_MSC_VER < 1800) // MSVC older-than-2013
#define INTEGER "I128d"
# else // non-Windows, Windows w/ GCC, or MSVC 2013-or-newer
#include <inttypes.h>
#define INTEGER "PRId128"
# endif
# elif defined __TYPE__INTEGER__INT8_T
typedef int8_t integer;
# if defined(_MSC_VER) && (_MSC_VER < 1800) // MSVC older-than-2013
#define INTEGER "I8d"
# else // non-Windows, Windows w/ GCC, or MSVC 2013-or-newer
#include <inttypes.h>
#define INTEGER "PRId8"
# endif
# elif defined __TYPE__INTEGER__INT16_T
typedef int16_t integer;
# if defined(_MSC_VER) && (_MSC_VER < 1800) // MSVC older-than-2013
#define INTEGER "I16d"
# else // non-Windows, Windows w/ GCC, or MSVC 2013-or-newer
#include <inttypes.h>
#define INTEGER "PRId16"
# endif
# elif defined __TYPE__INTEGER__INT32_T
typedef int32_t integer;
# if defined(_MSC_VER) && (_MSC_VER < 1800) // MSVC older-than-2013
#define INTEGER "I32d"
# else // non-Windows, Windows w/ GCC, or MSVC 2013-or-newer
#include <inttypes.h>
#define INTEGER "PRId32"
# endif
# elif defined __TYPE__INTEGER__INT64_T
typedef int64_t integer;
# if defined(_MSC_VER) && (_MSC_VER < 1800) // MSVC older-than-2013
#define INTEGER "I64d"
# else // non-Windows, Windows w/ GCC, or MSVC 2013-or-newer
#include <inttypes.h>
#define INTEGER "PRId64"
# endif
# elif defined __TYPE__INTEGER__INT128_T
typedef int128_t integer;
# if defined(_MSC_VER) && (_MSC_VER < 1800) // MSVC older-than-2013
#define INTEGER "I128d"
# else // non-Windows, Windows w/ GCC, or MSVC 2013-or-newer
#include <inttypes.h>
#define INTEGER "PRId128"
# endif
# else
typedef long integer; // default
#define INTEGER "ld" // assume format code 'ld' exists if type 'long' exists
# endif
# endif
# ifndef __CPP__INCLUDED__RPerl__DataType__Number_h__typedefs
#define __CPP__INCLUDED__RPerl__DataType__Number_h__typedefs 1
# ifdef __TYPE__NUMBER__DOUBLE
typedef double number;
#define NUMBER "f"
# elif defined __TYPE__NUMBER__LONG__DOUBLE
typedef long double number;
#define NUMBER "Lf" // assume format code 'Lf' exists if type 'long double' exists
# else
typedef double number; // default
#define NUMBER "f"
# endif
# endif
# ifndef __CPP__INCLUDED__RPerl__DataType__Character_h__typedefs
#define __CPP__INCLUDED__RPerl__DataType__Character_h__typedefs 1
typedef char character;
# endif
# ifndef __CPP__INCLUDED__RPerl__DataType__String_h__typedefs
#define __CPP__INCLUDED__RPerl__DataType__String_h__typedefs 1
typedef std::string string;
typedef std::ostringstream ostringstream;
# endif
// [[[ INCLUDES ]]]
#include <rperltypes_mode.h> // for definitions of __PERL__TYPES or __CPP__TYPES
// [[[ OPERATIONS & DATA TYPES REPORTER ]]]
# ifdef __PERL__TYPES
SV* RPerl__DataType__GMPInteger__MODE_ID() { return(newSViv(1)); } // CPPOPS_PERLTYPES is 1
# elif defined __CPP__TYPES
int RPerl__DataType__GMPInteger__MODE_ID() { return 2; } // CPPOPS_CPPTYPES is 2
# else
Purposefully_die_from_a_compile-time_error,_due_to_neither___PERL__TYPES_nor___CPP__TYPES_being_defined.__We_need_to_define_exactly_one!
# endif
// [[[ TYPE-CHECKING SUBROUTINES ]]]
void gmp_integer_CHECK(SV* possible_gmp_integer);
void gmp_integer_CHECKTRACE(SV* possible_gmp_integer, const char* variable_name, const char* subroutine_name);
// [[[ TYPEMAP PACK/UNPACK FOR __CPP__TYPES ]]]
# ifdef __CPP__TYPES
gmp_integer_retval XS_unpack_gmp_integer_retval(SV* input_sv);
void XS_pack_gmp_integer_retval(SV* output_sv, gmp_integer_retval input_gmp_integer_retval);
# endif
// [[[ BOOLEANIFY ]]]
# ifdef __PERL__TYPES
SV* gmp_integer_to_boolean(SV* input_gmp_integer);
# elif defined __CPP__TYPES
boolean gmp_integer_to_boolean(gmp_integer_retval input_gmp_integer_retval);
# endif
// [[[ UNSIGNED INTEGERIFY ]]]
# ifdef __PERL__TYPES
SV* gmp_integer_to_unsigned_integer(SV* input_gmp_integer);
# elif defined __CPP__TYPES
unsigned_integer gmp_integer_to_unsigned_integer(gmp_integer_retval input_gmp_integer_retval);
# endif
// [[[ INTEGERIFY ]]]
# ifdef __PERL__TYPES
SV* gmp_integer_to_integer(SV* input_gmp_integer);
# elif defined __CPP__TYPES
integer gmp_integer_to_integer(gmp_integer_retval input_gmp_integer_retval);
# endif
// [[[ NUMBERIFY ]]]
# ifdef __PERL__TYPES
SV* gmp_integer_to_number(SV* input_gmp_integer);
# elif defined __CPP__TYPES
number gmp_integer_to_number(gmp_integer_retval input_gmp_integer_retval);
# endif
// [[[ CHARACTERIFY ]]]
# ifdef __PERL__TYPES
SV* gmp_integer_to_character(SV* input_gmp_integer);
# elif defined __CPP__TYPES
character gmp_integer_to_character(gmp_integer_retval input_gmp_integer_retval);
# endif
// [[[ STRINGIFY ]]]
# ifdef __PERL__TYPES
SV* gmp_integer_to_string(SV* input_gmp_integer);
# elif defined __CPP__TYPES
string gmp_integer_to_string(gmp_integer_retval input_gmp_integer_retval);
# endif
string gmp_integer_to_string_CPPTYPES(gmp_integer_retval input_gmp_integer_retval);
// [[[ GMP INTEGERIFY ]]]
# ifdef __PERL__TYPES
SV* boolean_to_gmp_integer(SV* input_boolean);
SV* unsigned_integer_to_gmp_integer(SV* input_unsigned_integer);
SV* integer_to_gmp_integer(SV* input_integer);
SV* number_to_gmp_integer(SV* input_number);
SV* character_to_gmp_integer(SV* input_character);
SV* string_to_gmp_integer(SV* input_string);
# elif defined __CPP__TYPES
gmp_integer_retval boolean_to_gmp_integer(boolean input_boolean);
gmp_integer_retval unsigned_integer_to_gmp_integer(unsigned_integer input_unsigned_integer);
gmp_integer_retval integer_to_gmp_integer(integer input_integer);
gmp_integer_retval number_to_gmp_integer(number input_number);
gmp_integer_retval character_to_gmp_integer(character input_character);
gmp_integer_retval string_to_gmp_integer(string input_string);
# endif
// [[[ TYPE TESTING ]]]
# ifdef __PERL__TYPES
SV* gmp_integer_typetest0();
SV* gmp_integer_typetest1(SV* lucky_gmp_integer);
# elif defined __CPP__TYPES
gmp_integer_retval gmp_integer_typetest0();
gmp_integer_retval gmp_integer_typetest1(gmp_integer_retval lucky_gmp_integer_retval);
# endif
#endif