rrudb 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +1 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +26 -0
  5. data/examples/example.rb +39 -0
  6. data/ext/rudb/NuDB/include/nudb/CMakeLists.txt +104 -0
  7. data/ext/rudb/NuDB/include/nudb/_experimental/basic_seconds_clock.hpp +200 -0
  8. data/ext/rudb/NuDB/include/nudb/_experimental/chrono_util.hpp +58 -0
  9. data/ext/rudb/NuDB/include/nudb/_experimental/test/fail_file.hpp +343 -0
  10. data/ext/rudb/NuDB/include/nudb/_experimental/test/temp_dir.hpp +73 -0
  11. data/ext/rudb/NuDB/include/nudb/_experimental/test/test_store.hpp +451 -0
  12. data/ext/rudb/NuDB/include/nudb/_experimental/test/xor_shift_engine.hpp +105 -0
  13. data/ext/rudb/NuDB/include/nudb/_experimental/util.hpp +288 -0
  14. data/ext/rudb/NuDB/include/nudb/basic_store.hpp +461 -0
  15. data/ext/rudb/NuDB/include/nudb/concepts.hpp +205 -0
  16. data/ext/rudb/NuDB/include/nudb/context.hpp +144 -0
  17. data/ext/rudb/NuDB/include/nudb/create.hpp +117 -0
  18. data/ext/rudb/NuDB/include/nudb/detail/arena.hpp +296 -0
  19. data/ext/rudb/NuDB/include/nudb/detail/bucket.hpp +473 -0
  20. data/ext/rudb/NuDB/include/nudb/detail/buffer.hpp +86 -0
  21. data/ext/rudb/NuDB/include/nudb/detail/bulkio.hpp +196 -0
  22. data/ext/rudb/NuDB/include/nudb/detail/cache.hpp +236 -0
  23. data/ext/rudb/NuDB/include/nudb/detail/endian.hpp +93 -0
  24. data/ext/rudb/NuDB/include/nudb/detail/field.hpp +265 -0
  25. data/ext/rudb/NuDB/include/nudb/detail/format.hpp +630 -0
  26. data/ext/rudb/NuDB/include/nudb/detail/gentex.hpp +259 -0
  27. data/ext/rudb/NuDB/include/nudb/detail/mutex.hpp +26 -0
  28. data/ext/rudb/NuDB/include/nudb/detail/pool.hpp +243 -0
  29. data/ext/rudb/NuDB/include/nudb/detail/store_base.hpp +45 -0
  30. data/ext/rudb/NuDB/include/nudb/detail/stream.hpp +149 -0
  31. data/ext/rudb/NuDB/include/nudb/detail/xxhash.hpp +328 -0
  32. data/ext/rudb/NuDB/include/nudb/error.hpp +257 -0
  33. data/ext/rudb/NuDB/include/nudb/file.hpp +55 -0
  34. data/ext/rudb/NuDB/include/nudb/impl/basic_store.ipp +785 -0
  35. data/ext/rudb/NuDB/include/nudb/impl/context.ipp +241 -0
  36. data/ext/rudb/NuDB/include/nudb/impl/create.ipp +163 -0
  37. data/ext/rudb/NuDB/include/nudb/impl/error.ipp +175 -0
  38. data/ext/rudb/NuDB/include/nudb/impl/posix_file.ipp +248 -0
  39. data/ext/rudb/NuDB/include/nudb/impl/recover.ipp +209 -0
  40. data/ext/rudb/NuDB/include/nudb/impl/rekey.ipp +248 -0
  41. data/ext/rudb/NuDB/include/nudb/impl/verify.ipp +634 -0
  42. data/ext/rudb/NuDB/include/nudb/impl/visit.ipp +96 -0
  43. data/ext/rudb/NuDB/include/nudb/impl/win32_file.ipp +264 -0
  44. data/ext/rudb/NuDB/include/nudb/native_file.hpp +76 -0
  45. data/ext/rudb/NuDB/include/nudb/nudb.hpp +27 -0
  46. data/ext/rudb/NuDB/include/nudb/posix_file.hpp +228 -0
  47. data/ext/rudb/NuDB/include/nudb/progress.hpp +32 -0
  48. data/ext/rudb/NuDB/include/nudb/recover.hpp +73 -0
  49. data/ext/rudb/NuDB/include/nudb/rekey.hpp +110 -0
  50. data/ext/rudb/NuDB/include/nudb/store.hpp +27 -0
  51. data/ext/rudb/NuDB/include/nudb/type_traits.hpp +63 -0
  52. data/ext/rudb/NuDB/include/nudb/verify.hpp +200 -0
  53. data/ext/rudb/NuDB/include/nudb/version.hpp +21 -0
  54. data/ext/rudb/NuDB/include/nudb/visit.hpp +63 -0
  55. data/ext/rudb/NuDB/include/nudb/win32_file.hpp +246 -0
  56. data/ext/rudb/NuDB/include/nudb/xxhasher.hpp +45 -0
  57. data/ext/rudb/extconf.rb +12 -0
  58. data/ext/rudb/rudb.cpp +234 -0
  59. data/lib/rudb/version.rb +3 -0
  60. data/lib/rudb.rb +1 -0
  61. metadata +104 -0
@@ -0,0 +1,288 @@
1
+ //
2
+ // Copyright (c) 2015-2016 Vinnie Falco (vinnie dot falco at gmail dot com)
3
+ //
4
+ // Distributed under the Boost Software License, Version 1.0. (See accompanying
5
+ // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6
+ //
7
+
8
+ #ifndef NUDB_UTIL_HPP
9
+ #define NUDB_UTIL_HPP
10
+
11
+ #include "basic_seconds_clock.hpp"
12
+
13
+ #include <chrono>
14
+ #include <iomanip>
15
+ #include <iostream>
16
+ #include <sstream>
17
+
18
+ namespace nudb {
19
+
20
+ template<class = void>
21
+ int
22
+ log2(std::uint64_t n)
23
+ {
24
+ int i = -(n == 0);
25
+
26
+ auto const S =
27
+ [&](int k)
28
+ {
29
+ if(n >=(std::uint64_t{1} << k))
30
+ {
31
+ i += k;
32
+ n >>= k;
33
+ }
34
+ };
35
+ S(32); S(16); S(8); S(4); S(2); S(1);
36
+ return i;
37
+ }
38
+
39
+ // Format a decimal integer with comma separators
40
+ template<class T>
41
+ std::string
42
+ fdec(T t)
43
+ {
44
+ std::string s = std::to_string(t);
45
+ std::reverse(s.begin(), s.end());
46
+ std::string s2;
47
+ s2.reserve(s.size() +(s.size()+2)/3);
48
+ int n = 0;
49
+ for(auto c : s)
50
+ {
51
+ if(n == 3)
52
+ {
53
+ n = 0;
54
+ s2.insert(s2.begin(), ',');
55
+ }
56
+ ++n;
57
+ s2.insert(s2.begin(), c);
58
+ }
59
+ return s2;
60
+ }
61
+
62
+ // format 64-bit unsigned as fixed width, 0 padded hex
63
+ template<class T>
64
+ std::string
65
+ fhex(T v)
66
+ {
67
+ std::string s{"0x0000000000000000"};
68
+ auto it = s.end();
69
+ for(it = s.end(); v; v >>= 4)
70
+ *--it = "0123456789abcdef"[v & 0xf];
71
+ return s;
72
+ }
73
+
74
+ // Format an array of integers as a comma separated list
75
+ template<class T, std::size_t N>
76
+ static
77
+ std::string
78
+ fhist(std::array<T, N> const& hist)
79
+ {
80
+ std::size_t n;
81
+ for(n = hist.size() - 1; n > 0; --n)
82
+ if(hist[n])
83
+ break;
84
+ std::string s = std::to_string(hist[0]);
85
+ for(std::size_t i = 1; i <= n; ++i)
86
+ s += ", " + std::to_string(hist[i]);
87
+ return s;
88
+ }
89
+
90
+ class save_stream_state
91
+ {
92
+ std::ostream& os_;
93
+ std::streamsize precision_;
94
+ std::ios::fmtflags flags_;
95
+ std::ios::char_type fill_;
96
+
97
+ public:
98
+ ~save_stream_state()
99
+ {
100
+ os_.precision(precision_);
101
+ os_.flags(flags_);
102
+ os_.fill(fill_);
103
+ }
104
+ save_stream_state(save_stream_state const&) = delete;
105
+ save_stream_state& operator=(save_stream_state const&) = delete;
106
+ explicit save_stream_state(std::ostream& os)
107
+ : os_(os)
108
+ , precision_(os.precision())
109
+ , flags_(os.flags())
110
+ , fill_(os.fill())
111
+ {
112
+ }
113
+ };
114
+
115
+ template<class Rep, class Period>
116
+ std::ostream&
117
+ pretty_time(std::ostream& os, std::chrono::duration<Rep, Period> d)
118
+ {
119
+ save_stream_state _(os);
120
+ using namespace std::chrono;
121
+ if(d < microseconds{1})
122
+ {
123
+ // use nanoseconds
124
+ if(d < nanoseconds{100})
125
+ {
126
+ // use floating
127
+ using ns = duration<float, std::nano>;
128
+ os << std::fixed << std::setprecision(1) << ns(d).count();
129
+ }
130
+ else
131
+ {
132
+ // use integral
133
+ os << round<nanoseconds>(d).count();
134
+ }
135
+ os << "ns";
136
+ }
137
+ else if(d < milliseconds{1})
138
+ {
139
+ // use microseconds
140
+ if(d < microseconds{100})
141
+ {
142
+ // use floating
143
+ using ms = duration<float, std::micro>;
144
+ os << std::fixed << std::setprecision(1) << ms(d).count();
145
+ }
146
+ else
147
+ {
148
+ // use integral
149
+ os << round<microseconds>(d).count();
150
+ }
151
+ os << "us";
152
+ }
153
+ else if(d < seconds{1})
154
+ {
155
+ // use milliseconds
156
+ if(d < milliseconds{100})
157
+ {
158
+ // use floating
159
+ using ms = duration<float, std::milli>;
160
+ os << std::fixed << std::setprecision(1) << ms(d).count();
161
+ }
162
+ else
163
+ {
164
+ // use integral
165
+ os << round<milliseconds>(d).count();
166
+ }
167
+ os << "ms";
168
+ }
169
+ else if(d < minutes{1})
170
+ {
171
+ // use seconds
172
+ if(d < seconds{100})
173
+ {
174
+ // use floating
175
+ using s = duration<float>;
176
+ os << std::fixed << std::setprecision(1) << s(d).count();
177
+ }
178
+ else
179
+ {
180
+ // use integral
181
+ os << round<seconds>(d).count();
182
+ }
183
+ os << "s";
184
+ }
185
+ else
186
+ {
187
+ // use minutes
188
+ if(d < minutes{100})
189
+ {
190
+ // use floating
191
+ using m = duration<float, std::ratio<60>>;
192
+ os << std::fixed << std::setprecision(1) << m(d).count();
193
+ }
194
+ else
195
+ {
196
+ // use integral
197
+ os << round<minutes>(d).count();
198
+ }
199
+ os << "min";
200
+ }
201
+ return os;
202
+ }
203
+
204
+ template<class Period, class Rep>
205
+ std::string
206
+ fmtdur(std::chrono::duration<Period, Rep> const& d)
207
+ {
208
+ std::stringstream ss;
209
+ pretty_time(ss, d);
210
+ return ss.str();
211
+ }
212
+
213
+ //------------------------------------------------------------------------------
214
+
215
+ class progress
216
+ {
217
+ using clock_type = basic_seconds_clock<std::chrono::steady_clock>;
218
+
219
+ std::ostream& os_;
220
+ clock_type::time_point start_;
221
+ clock_type::time_point now_;
222
+ clock_type::time_point report_;
223
+ std::uint64_t prev_;
224
+ bool estimate_;
225
+
226
+ public:
227
+ explicit
228
+ progress(std::ostream& os)
229
+ : os_(os)
230
+ {
231
+ }
232
+
233
+ void
234
+ operator()(std::uint64_t amount, std::uint64_t total)
235
+ {
236
+ using namespace std::chrono;
237
+ auto const now = clock_type::now();
238
+ if(amount == 0)
239
+ {
240
+ now_ = clock_type::now();
241
+ start_ = now_;
242
+ report_ = now_;
243
+ prev_ = 0;
244
+ estimate_ = false;
245
+ return;
246
+ }
247
+ if(now == now_)
248
+ return;
249
+ now_ = now;
250
+ auto const elapsed = now - start_;
251
+ if(! estimate_)
252
+ {
253
+ // Wait a bit before showing the first estimate
254
+ if(elapsed < seconds{30})
255
+ return;
256
+ estimate_ = true;
257
+ }
258
+ else if(now - report_ < seconds{60})
259
+ {
260
+ // Only show estimates periodically
261
+ return;
262
+ }
263
+ auto const rate = double(amount) / elapsed.count();
264
+ auto const remain = clock_type::duration{
265
+ static_cast<clock_type::duration::rep>(
266
+ (total - amount) / rate)};
267
+ os_ <<
268
+ "Remaining: " << fmtdur(remain) <<
269
+ " (" << fdec(amount) << " of " << fdec(total) <<
270
+ " in " << fmtdur(elapsed) <<
271
+ ", " << fdec(amount - prev_) <<
272
+ " in " << fmtdur(now - report_) <<
273
+ ")\n";
274
+ report_ = now;
275
+ prev_ = amount;
276
+ }
277
+
278
+ clock_type::duration
279
+ elapsed() const
280
+ {
281
+ using namespace std::chrono;
282
+ return now_ - start_;
283
+ }
284
+ };
285
+
286
+ } // nudb
287
+
288
+ #endif