Example #1
0
vector<char> Serialization::serialize(const Transformable &tr_data)
{
	vector<char> buf;
	unsigned long buf_sz = 0;
	unsigned long names_buf_sz = 0;;
	unsigned long data_buf_sz = 0;
	// calculate buffer size
 	for(auto &b : tr_data) 
	{
		names_buf_sz += b.first.size() + 1;
	}
	data_buf_sz = sizeof(double)*tr_data.size();
	buf_sz = sizeof(unsigned long) + names_buf_sz + sizeof(unsigned long) + data_buf_sz;
	// allocate space
	buf.resize(buf_sz,'\0');
	// build string with space deliminated names and array of numbers
	vector<char> names;
    names.reserve(names_buf_sz);
	vector<double> values;
	for (auto &b : tr_data)
	{
		names.insert(names.end(), b.first.begin(), b.first.end());
        names.push_back(' ');
		values.push_back(b.second);
	}
	unsigned long n_rec = values.size();
	//write information to buffer
	size_t i_start = 0;
	w_memcpy_s(&buf[i_start], buf_sz-i_start, &names_buf_sz, sizeof(names_buf_sz));
	i_start += sizeof(names_buf_sz);
	w_memcpy_s(&buf[i_start], buf_sz-i_start, names.data(), names_buf_sz);
	i_start +=names_buf_sz;
	w_memcpy_s(&buf[i_start], buf_sz-i_start, &n_rec, sizeof(n_rec));
	i_start +=sizeof(n_rec);
	w_memcpy_s(&buf[i_start], buf_sz-i_start, &values[0], data_buf_sz);
	return buf;
}