41 #ifndef __USE_STD_IOSTREAM
42 # define __USE_STD_IOSTREAM
53 #if defined(_MSC_VER) && _MSC_VER >= 1400 // Secure versions for VC++
54 # define GMM_SECURE_CRT
55 # define SECURE_NONCHAR_SSCANF sscanf_s
56 # define SECURE_NONCHAR_FSCANF fscanf_s
57 # define SECURE_STRNCPY(a, la, b, lb) strncpy_s(a, la, b, lb)
58 # define SECURE_FOPEN(F, filename, mode) (*(F) = 0, fopen_s(F, filename, mode))
59 # define SECURE_SPRINTF1(S, l, st, p1) sprintf_s(S, l, st, p1)
60 # define SECURE_SPRINTF2(S, l, st, p1, p2) sprintf_s(S, l, st, p1, p2)
61 # define SECURE_SPRINTF4(S, l, st, p1, p2, p3, p4) sprintf_s(S, l, st, p1, p2, p3, p4)
62 # define SECURE_STRDUP(s) _strdup(s)
63 # ifndef _SCL_SECURE_NO_DEPRECATE
64 # error Add the option /D_SCL_SECURE_NO_DEPRECATE to the compilation command
67 # define SECURE_NONCHAR_SSCANF sscanf
68 # define SECURE_NONCHAR_FSCANF fscanf
69 # define SECURE_STRNCPY(a, la, b, lb) strncpy(a, b, lb)
70 # define SECURE_FOPEN(F, filename, mode) ((*(F)) = fopen(filename, mode))
71 # define SECURE_SPRINTF1(S, l, st, p1) sprintf(S, st, p1)
72 # define SECURE_SPRINTF2(S, l, st, p1, p2) sprintf(S, st, p1, p2)
73 # define SECURE_SPRINTF4(S, l, st, p1, p2, p3, p4) sprintf(S, st, p1, p2, p3, p4)
74 # define SECURE_STRDUP(s) strdup(s)
77 inline void GMM_NOPERATION_(
int) { }
78 #define GMM_NOPERATION(a) { GMM_NOPERATION_(abs(&(a) != &(a))); }
92 # error : PLEASE UPDATE g++ TO AT LEAST 4.8 VERSION
127 #include <gmm/gmm_arch_config.h>
130 #if defined(__GNUC__) && (__cplusplus <= 201103L)
131 template<
typename _Tp>
133 {
typedef unique_ptr<_Tp> __single_object; };
134 template<
typename _Tp>
135 struct _MakeUniq<_Tp[]>
136 {
typedef unique_ptr<_Tp[]> __array; };
137 template<
typename _Tp,
size_t _Bound>
138 struct _MakeUniq<_Tp[_Bound]>
139 {
struct __invalid_type { }; };
141 template<
typename _Tp,
typename... _Args>
142 inline typename _MakeUniq<_Tp>::__single_object
143 make_unique(_Args&&... __args)
144 {
return unique_ptr<_Tp>(
new _Tp(std::forward<_Args>(__args)...)); }
146 template<
typename _Tp>
147 inline typename _MakeUniq<_Tp>::__array
148 make_unique(
size_t __num)
149 {
return unique_ptr<_Tp>(
new typename remove_extent<_Tp>::type[__num]()); }
151 template<
typename _Tp,
typename... _Args>
152 inline typename _MakeUniq<_Tp>::__invalid_type
153 make_unique(_Args&&...) =
delete;
159 template <
typename T>
class shared_array_ptr : shared_ptr<T> {
161 shared_array_ptr() {}
162 shared_array_ptr(T *q) : std::shared_ptr<T>(q, default_delete<T[]>()) {}
163 template <
typename Y> shared_array_ptr(
const std::shared_ptr<Y> &p, T *q)
164 : std::shared_ptr<T>(p, q) {}
165 T *get()
const {
return shared_ptr<T>::get(); }
166 T& operator*()
const {
return shared_ptr<T>::operator*(); }
167 T* operator->()
const {
return shared_ptr<T>::operator->(); }
170 template <
typename T> shared_array_ptr<T> make_shared_array(
size_t num)
171 {
return shared_array_ptr<T>(
new T[num]); }
176 using std::endl;
using std::cout;
using std::cerr;
177 using std::ends;
using std::cin;
using std::isnan;
179 class standard_locale {
184 inline standard_locale(
void)
185 : cloc(setlocale(LC_NUMERIC, 0)), cinloc(cin.getloc())
186 { setlocale(LC_NUMERIC,
"C"); cin.imbue(std::locale(
"C")); }
187 inline ~standard_locale()
188 { setlocale(LC_NUMERIC, cloc.c_str()); cin.imbue(cinloc); }
191 class stream_standard_locale {
196 inline stream_standard_locale(std::ios &i)
197 : cloc(i.getloc()), io(i) { io.imbue(std::locale(
"C")); }
198 inline ~stream_standard_locale() { io.imbue(cloc); }
205 # if defined(HAVE_SYS_TIMES)
206 inline double uclock_sec(
void) {
207 static double ttclk = 0.;
208 if (ttclk == 0.) ttclk = sysconf(_SC_CLK_TCK);
209 tms t; times(&t);
return double(t.tms_utime) / ttclk;
212 inline double uclock_sec(
void)
213 {
return double(clock())/double(CLOCKS_PER_SEC); }
222 template <
size_t s>
struct fixed_size_integer_generator {
223 typedef void int_base_type;
224 typedef void uint_base_type;
227 template <>
struct fixed_size_integer_generator<sizeof(char)> {
228 typedef signed char int_base_type;
229 typedef unsigned char uint_base_type;
232 template <>
struct fixed_size_integer_generator<sizeof(short int)
233 - ((sizeof(short int) ==
sizeof(char)) ? 78 : 0)> {
234 typedef signed short int int_base_type;
235 typedef unsigned short int uint_base_type;
238 template <>
struct fixed_size_integer_generator<sizeof(int)
239 - ((sizeof(int) ==
sizeof(
short int)) ? 59 : 0)> {
240 typedef signed int int_base_type;
241 typedef unsigned int uint_base_type;
244 template <>
struct fixed_size_integer_generator<sizeof(long)
245 - ((sizeof(int) ==
sizeof(long)) ? 93 : 0)> {
246 typedef signed long int_base_type;
247 typedef unsigned long uint_base_type;
250 template <>
struct fixed_size_integer_generator<sizeof(long long)
251 - ((sizeof(long long) ==
sizeof(long)) ? 99 : 0)> {
252 typedef signed long long int_base_type;
253 typedef unsigned long long uint_base_type;
256 typedef fixed_size_integer_generator<1>::int_base_type int8_type;
257 typedef fixed_size_integer_generator<1>::uint_base_type uint8_type;
258 typedef fixed_size_integer_generator<2>::int_base_type int16_type;
259 typedef fixed_size_integer_generator<2>::uint_base_type uint16_type;
260 typedef fixed_size_integer_generator<4>::int_base_type int32_type;
261 typedef fixed_size_integer_generator<4>::uint_base_type uint32_type;
262 typedef fixed_size_integer_generator<8>::int_base_type int64_type;
263 typedef fixed_size_integer_generator<8>::uint_base_type uint64_type;
301 #if defined(__GNUC__) && !defined(__ICC)
306 # define IS_DEPRECATED __attribute__ ((__deprecated__))
310 # define ALWAYS_INLINE __attribute__((always_inline))
312 # define IS_DEPRECATED
313 # define ALWAYS_INLINE
322 #if defined(EXPORTED_TO_SHARED_LIB)
323 # if defined(_MSC_VER) || defined(__INTEL_COMPILER)
324 # define APIDECL __declspec(dllexport)
325 # elif defined(__GNUC__)
326 # define __attribute__((visibility("default")))
330 # if defined(IMPORTED_FROM_SHARED_LIB)
331 # error INTENTIONAL COMPILCATION ERROR, DLL IMPORT AND EXPORT ARE INCOMPITABLE
335 #if defined(IMPORTED_FROM_SHARED_LIB)
336 # if defined(_MSC_VER) || defined(__INTEL_COMPILER)
337 # define APIDECL __declspec(dllimport)
341 # if defined(EXPORTED_TO_SHARED_LIB)
342 # error INTENTIONAL COMPILCATION ERROR, DLL IMPORT AND EXPORT ARE INCOMPITABLE
346 #ifndef EXPORTED_TO_SHARED_LIB
347 # ifndef IMPORTED_FROM_SHARED_LIB
348 # define APIDECL //empty, used during static linking