Skip to content

Instantly share code, notes, and snippets.

@kaityo256
Created April 6, 2017 11:06
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kaityo256/eb6a49cb40f99b97898f5e464c2c208f to your computer and use it in GitHub Desktop.
Save kaityo256/eb6a49cb40f99b97898f5e464c2c208f to your computer and use it in GitHub Desktop.
Serializable std::map
/*
# 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();
}
@kaityo256
Copy link
Author

$ g++ -std=c++11 serializablemap.cpp -o a.out
$ ./a.out
string->int
test1:1
test2:2
test3:3

int->string
1:test1
2:test2
3:test3

int->int
1:1
2:2
3:3

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment