76 std::cout <<
"int8 -> int8\n";
80 assert(kv.find(1).value() == 100);
84 std::cout <<
"int8 -> int64\n";
88 assert(kv.find(2).value() == 1234567890123456LL);
92 std::cout <<
"int32 -> string\n";
96 assert(kv.find(3).value() ==
"hello");
100 std::cout <<
"string -> string\n";
104 assert(kv.find(
"key").value() ==
"value");
108 std::cout <<
"string -> POD\n";
113 assert(kv.find(
"obj").value() == s);
117 std::cout <<
"int64 -> vector<byte>\n";
120 std::vector<uint8_t> data{1, 2, 3, 4};
122 assert(kv.find(9).value() == data);
126 std::cout <<
"string -> vector<SimpleStruct>\n";
129 std::vector<SimpleStruct> vec{{1, 1.0f}, {2, 2.0f}};
131 assert(kv.find(
"many").value() == vec);
135 std::cout <<
"string -> list<string>\n";
138 std::list<std::string> lst{
"a",
"b",
"c"};
140 assert(kv.find(
"letters").value() == lst);
144 std::cout <<
"string -> vector<string>\n";
147 std::vector<std::string> lst{
"a",
"b",
"c"};
149 assert(kv.find(
"letters").value() == lst);
153 std::cout <<
"string -> set<string>\n";
156 std::set<std::string> s{
"a",
"b",
"c"};
158 assert(kv.find(
"letters").value() == s);
162 std::cout <<
"string -> set<int>\n";
165 std::set<int> s{1, 2, 3};
167 assert(kv.find(
"digits").value() == s);
171 std::cout <<
"string -> self-serializable struct\n";
173 struct Serializable {
178 Serializable(
int a_,
const std::string& b_) : a(a_), b(b_) {}
180 std::vector<uint8_t> to_bytes()
const {
181 std::vector<uint8_t> result(
sizeof(
int) + b.size());
182 std::memcpy(result.data(), &a,
sizeof(
int));
183 std::memcpy(result.data() +
sizeof(
int), b.data(), b.size());
187 static Serializable from_bytes(
const void* data,
size_t size) {
188 if (size <
sizeof(
int))
189 throw std::runtime_error(
"Invalid data size for Serializable");
190 const uint8_t* ptr =
static_cast<const uint8_t*
>(data);
192 std::memcpy(&s.a, ptr,
sizeof(
int));
193 s.b = std::string(
reinterpret_cast<const char*
>(ptr +
sizeof(
int)), size -
sizeof(
int));
197 bool operator==(
const Serializable& other)
const {
198 return a == other.a && b == other.b;
203 Serializable s{7,
"seven"};
205 assert(kv.find(
"ser").value() == s);
212 std::condition_variable cv;
213 std::atomic<bool> ready(
false);
214 std::atomic<bool> failed(
false);
217 std::thread writer([&kv, &ready, &written, &cv, &mtx] {
218 for (
int i = 0; i < 100; ++i) {
220 std::lock_guard<std::mutex> lock(mtx);
226 std::this_thread::sleep_for(std::chrono::milliseconds(1));
230 std::thread reader([&kv, &ready, &failed, &written, &cv, &mtx] {
231 for (
int i = 0; i < 100; ++i) {
232 std::unique_lock<std::mutex> lock(mtx);
233 cv.wait(lock, [&] {
return ready.load(); });
235# if __cplusplus >= 201703L
236 auto val = kv.find(1);
237 if (!val.has_value() || val.value() != written) {
238 std::cerr <<
"Mismatch at iteration " << i <<
": got " << val.value().value <<
", expected " << written.
value << std::endl;
244 if (!val.first || val.second != written) {
245 std::cerr <<
"Mismatch at iteration " << i <<
": got " << val.second.value <<
", expected " << written.
value << std::endl;
259 std::cerr <<
"Concurrent test failed." << std::endl;
263 std::cout <<
"Concurrent test passed." << std::endl;
267 std::cout <<
"All tests passed.\n";
268 std::cin.ignore(std::numeric_limits<std::streamsize>::max(),
'\n');