summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKunoiSayami <[email protected]>2023-05-23 02:28:40 +0800
committerKunoiSayami <[email protected]>2023-05-23 02:28:40 +0800
commitf0d3437f2e1fc9612e5a926d048a1ae3cd1e7a75 (patch)
treedc2707b6e6e5f8c693d2ae11b55d625771ccd008
parent70af7c287739bc45089af9c36e6a41a2a317d61a (diff)
feat: Add read_helper.h
Signed-off-by: KunoiSayami <[email protected]>
-rw-r--r--read_helper.h76
1 files changed, 76 insertions, 0 deletions
diff --git a/read_helper.h b/read_helper.h
new file mode 100644
index 0000000..311ebbb
--- /dev/null
+++ b/read_helper.h
@@ -0,0 +1,76 @@
+
+#ifndef LOCKFREE_READ_HELPER_H
+#define LOCKFREE_READ_HELPER_H
+
+#include <cassert>
+#include <cstdio>
+#include <random>
+#include <vector>
+#ifndef P_EFF
+#ifndef NDEBUG
+#define P_ERR(...) fprintf(stderr, __VA_ARGS__)
+#else
+#define P_ERR(...)
+#endif
+#endif
+
+class ReadHelper {
+ unsigned long long max_value = 0, min_value = 0x7fffffffff;
+
+ char const *filename;
+
+public:
+ ReadHelper(char const *filename) : filename(filename) {}
+ unsigned long long maxValue() const { return max_value; }
+ unsigned long long minValue() const { return min_value; }
+
+ std::vector<unsigned long long> population_vector;
+ inline void store_into_vector(unsigned long long value) {
+ if (max_value < value) {
+ max_value = value;
+ }
+ if (min_value > value) {
+ min_value = value;
+ }
+ population_vector.push_back(value);
+ }
+
+ static unsigned long randomRow(unsigned long max_value_) {
+ std::random_device randomDevice;
+ std::mt19937 mt19937(randomDevice());
+ std::uniform_int_distribution<std::mt19937::result_type> dst(0, max_value_);
+ return dst(mt19937);
+ }
+
+ void readFile(long sample_length, unsigned long &total_row,
+ unsigned long max_number) {
+ auto read_number = 0UL;
+ FILE *file = fopen(filename, "r");
+ assert(file);
+ P_ERR("Reading sample");
+ for (long long i;
+ read_number < max_number && fscanf(file, "%lld ", &i) != EOF;
+ store_into_vector(i))
+ read_number++;
+
+ if (total_row > 0) {
+ P_ERR("\rReading skip");
+ read_number = randomRow(total_row - sample_length - max_number - 256);
+ total_row = read_number;
+ // fprintf(stderr, "Skip %lu\n", read_number);
+ for (long long i; read_number > 0 && fscanf(file, "%lld ", &i) != EOF;)
+ read_number--;
+ }
+
+ P_ERR("\rReading population");
+ read_number = 0;
+
+ auto remain = sample_length + 256;
+ for (long long i; read_number < remain && fscanf(file, "%lld ", &i) != EOF;
+ store_into_vector(i))
+ read_number++;
+ fclose(file);
+ P_ERR("\r");
+ }
+};
+#endif \ No newline at end of file