Created
April 6, 2017 11:06
-
-
Save kaityo256/eb6a49cb40f99b97898f5e464c2c208f to your computer and use it in GitHub Desktop.
Serializable std::map
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
# Copyright H. Watanabe 2017 | |
# Distributed under the Boost Software License, Version 1.0. | |
# (See accompanying file LICENSE_1_0.txt or copy at | |
# http://www.boost.org/LICENSE_1_0.txt) | |
*/ | |
#include <iostream> | |
#include <vector> | |
#include <map> | |
#include <sstream> | |
template<class Key, class Value> | |
class serializable_map : public std::map<Key, Value> { | |
private: | |
size_t offset; | |
template<class T> | |
void write(std::stringstream &ss, T &t) { | |
ss.write((char*)(&t), sizeof(t)); | |
} | |
void write(std::stringstream &ss, std::string &str) { | |
size_t size = str.size(); | |
ss.write((char*)(&size), sizeof(size)); | |
ss.write((char*)(str.data()), str.length()); | |
} | |
template<class T> | |
void read(std::vector<char> &buffer, T &t) { | |
t = (T)(*(buffer.data() + offset)); | |
offset += sizeof(T); | |
} | |
void read(std::vector<char> &buffer, std::string &str) { | |
size_t size = (int)(*(buffer.data() + offset)); | |
offset += sizeof(size_t); | |
std::string str2(buffer.data() + offset, buffer.data() + offset + size); | |
str = str2; | |
offset += size; | |
} | |
public: | |
std::vector<char> serialize() { | |
std::vector<char> buffer; | |
std::stringstream ss; | |
for (auto &i : (*this)) { | |
Key str = i.first; | |
Value value = i.second; | |
write(ss, str); | |
write(ss, value); | |
} | |
size_t size = ss.str().size(); | |
buffer.resize(size); | |
ss.read(buffer.data(), size); | |
return buffer; | |
} | |
void deserialize(std::vector<char> &buffer) { | |
offset = 0; | |
while (offset < buffer.size()) { | |
Key key; | |
Value value; | |
read(buffer, key); | |
read(buffer, value); | |
(*this)[key] = value; | |
} | |
} | |
void show(void) { | |
for (auto &i : (*this)) { | |
std::cout << i.first << ":" << i.second << std::endl; | |
} | |
std::cout << std::endl; | |
} | |
}; | |
void | |
test1(void) { | |
std::cout << "string->int" << std::endl; | |
serializable_map<std::string, int> m; | |
m["test1"] = 1; | |
m["test2"] = 2; | |
m["test3"] = 3; | |
std::vector<char> buffer = m.serialize(); | |
serializable_map<std::string, int> m2; | |
m2.deserialize(buffer); | |
m2.show(); | |
} | |
void | |
test2(void) { | |
std::cout << "int->string" << std::endl; | |
serializable_map<int, std::string> m; | |
m[1] = "test1"; | |
m[2] = "test2"; | |
m[3] = "test3"; | |
std::vector<char> buffer = m.serialize(); | |
serializable_map<int, std::string> m2; | |
m2.deserialize(buffer); | |
m2.show(); | |
} | |
void | |
test3(void) { | |
std::cout << "int->int" << std::endl; | |
serializable_map<int, int> m; | |
m[1] = 1; | |
m[2] = 2; | |
m[3] = 3; | |
std::vector<char> buffer = m.serialize(); | |
serializable_map<int, int> m2; | |
m2.deserialize(buffer); | |
m2.show(); | |
} | |
int | |
main(void) { | |
test1(); | |
test2(); | |
test3(); | |
} |
Author
kaityo256
commented
Apr 6, 2017
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment