8#include <unordered_map>
9#include <unordered_set>
19#ifndef DEJAVU_UTILITY_H
20#define DEJAVU_UTILITY_H
22#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__))
34#define PRINT_NO_NEWLINE(str) std::cout << str << std::flush;
35#define PRINT(str) std::cout << str << std::endl;
38#define dej_assert(expr) (assert(expr))
40#define dej_assert(expr) (void)0
43#if ((defined(_MSVC_LANG) && _MSVC_LANG > 201402L) || __cplusplus > 201402L)
44#define dej_nodiscard [[nodiscard]]
60static inline unsigned int hash(
unsigned int x) {
61 x = ((x >> 16) ^ x) * 0x45d9f3b;
62 x = ((x >> 16) ^ x) * 0x45d9f3b;
74static inline unsigned long add_to_hash(
unsigned long hash,
const int d) {
75 const unsigned long ho = hash & 0xff00000000000000;
77 hash = hash ^ (ho >> 56);
89static inline bool file_exists(
const std::string& name) {
90 std::ifstream f(name.c_str());
95typedef std::function<void(
int,
const int*,
int,
const int*)>
dejavu_hook;
105 bool true_random =
false;
106 std::mt19937 pseudo_random_device;
107 std::random_device true_random_device;
116 true_random = set_true_random;
117 pseudo_random_device.seed(set_seed);
125 return true_random?
static_cast<int>(true_random_device()&INT32_MAX):
126 static_cast<int>(pseudo_random_device()&INT32_MAX);
155 void set(
long double set_mantissa,
int set_exponent) {
186 void multiply(
long double other_mantissa,
int other_exponent) {
187 if(std::fpclassify(other_mantissa) == FP_INFINITE || std::fpclassify(other_mantissa) == FP_NAN) {
190 while (other_mantissa >= 10.0) {
192 other_mantissa = other_mantissa / 10;
201 if(std::fpclassify(
mantissa) == FP_INFINITE || std::fpclassify(
mantissa) == FP_NAN) {
218 static void progress_print_split() {
219 PRINT(
"\r______________________________________________________________");
225 static void progress_print_header() {
226 progress_print_split();
227 PRINT(std::setw(11) << std::left <<
"T (ms)" << std::setw(11) <<
"delta(ms)" << std::setw(12) <<
"proc"
228 << std::setw(16) <<
"p1" << std::setw(16) <<
"p2");
229 progress_print_split();
238 std::chrono::high_resolution_clock::time_point first;
239 std::chrono::high_resolution_clock::time_point previous;
245 first = std::chrono::high_resolution_clock::now();
251 progress_print_header();
256 progress_print_split();
259 void print(
const std::string& str)
const {
264 void timer_print(
const std::string& proc,
const std::string& p1,
const std::string& p2) {
266 auto now = std::chrono::high_resolution_clock::now();
267 PRINT(
"\r" << std::fixed << std::setprecision(2) << std::setw(11) << std::left
268 << (std::chrono::duration_cast<std::chrono::nanoseconds>(now - first).count()) / 1000000.0
270 << (std::chrono::duration_cast<std::chrono::nanoseconds>(now - previous).count()) / 1000000.0
271 << std::setw(12) << proc << std::setw(16) << p1 << std::setw(16) << p2);
276 previous = std::chrono::high_resolution_clock::now();
279 void timer_print(
const std::string& proc,
const int p1,
const int p2) {
281 auto now = std::chrono::high_resolution_clock::now();
282 PRINT(
"\r" << std::fixed << std::setprecision(2) << std::setw(11) << std::left
283 << (std::chrono::duration_cast<std::chrono::nanoseconds>(now - first).count()) / 1000000.0
285 << (std::chrono::duration_cast<std::chrono::nanoseconds>(now - previous).count()) / 1000000.0
286 << std::setw(12) << proc << std::setw(16) << p1 << std::setw(16) << p2);
290 void timer_print(
const std::string& proc,
const int p1,
const double p2) {
292 auto now = std::chrono::high_resolution_clock::now();
293 PRINT(
"\r" << std::fixed << std::setprecision(2) << std::setw(11) << std::left
294 << (std::chrono::duration_cast<std::chrono::nanoseconds>(now - first).count()) / 1000000.0
296 << (std::chrono::duration_cast<std::chrono::nanoseconds>(now - previous).count()) / 1000000.0
297 << std::setw(12) << proc << std::setw(16) << p1 << std::setw(16) << p2);
306 const std::string& var2,
double var2_val)
const {
308 PRINT_NO_NEWLINE(
"\r>" << method_name <<
" " << var1 <<
"=" << var1_val <<
", " << var2 <<
"=" << var2_val);
311 const std::string& var2,
int var2_val,
312 const std::string& var3,
double var3_val)
const {
314 PRINT_NO_NEWLINE(
"\r>" << method_name <<
" " << var1 <<
"=" << var1_val <<
", " << var2 <<
"=" << var2_val
315 <<
", " << var3 <<
"=" << var3_val);
319 const std::string& var2,
int var2_val,
320 const std::string& var3,
int var3_val,
321 const std::string& var4,
int var4_val)
const {
323 PRINT_NO_NEWLINE(
"\r>" << method_name <<
" " << var1 <<
"=" << var1_val <<
", " << var2 <<
"=" << var2_val
324 <<
", " << var3 <<
"=" << var3_val <<
", " << var4 <<
"=" << var4_val);
void multiply(big_number number)
friend bool operator==(const big_number &l, const big_number &r)
friend bool operator<(const big_number &l, const big_number &r)
void set(long double set_mantissa, int set_exponent)
void multiply(long double other_mantissa, int other_exponent)
void multiply(int number)
Random number generation.
random_source(bool set_true_random, int set_seed)
Prints information to the console.
void print(const std::string &str) const
void progress_current_method(const std::string &method_name, const std::string &var1, int var1_val, const std::string &var2, int var2_val, const std::string &var3, double var3_val) const
void progress_current_method(const std::string &method_name, const std::string &var1, double var1_val, const std::string &var2, double var2_val) const
void timer_print(const std::string &proc, const std::string &p1, const std::string &p2)
void timer_print(const std::string &proc, const int p1, const int p2)
void timer_print(const std::string &proc, const int p1, const double p2)
void print_header() const
void progress_current_method(const std::string &method_name, const std::string &var1, double var1_val, const std::string &var2, int var2_val, const std::string &var3, int var3_val, const std::string &var4, int var4_val) const
void progress_current_method(const std::string &print) const
std::ostream & operator<<(std::ostream &out, big_number number)
void type_dejavu_hook(int, const int *, int, const int *)
#define PRINT_NO_NEWLINE(str)
std::function< void(int, const int *, int, const int *)> dejavu_hook