Files
LBPM/IO/PackData.hpp

160 lines
4.5 KiB
C++
Raw Normal View History

2021-01-04 23:37:44 -05:00
// This file functions to pack/unpack data structures
#ifndef included_PackData_hpp
#define included_PackData_hpp
#include "IO/PackData.h"
2021-03-17 10:24:14 -04:00
#include <map>
#include <set>
2021-01-04 23:37:44 -05:00
#include <string.h>
#include <vector>
/********************************************************
2021-03-17 10:24:14 -04:00
* Default instantiations for std::vector *
********************************************************/
2021-01-04 23:37:44 -05:00
template<class TYPE>
2021-03-17 10:24:14 -04:00
size_t packsize( const std::vector<TYPE> &rhs )
2021-01-04 23:37:44 -05:00
{
2021-03-17 10:24:14 -04:00
size_t bytes = sizeof( size_t );
for ( size_t i = 0; i < rhs.size(); i++ )
bytes += packsize( rhs[i] );
2021-01-04 23:37:44 -05:00
return bytes;
}
template<class TYPE>
2021-03-17 10:24:14 -04:00
void pack( const std::vector<TYPE> &rhs, char *buffer )
2021-01-04 23:37:44 -05:00
{
size_t size = rhs.size();
2021-03-17 10:24:14 -04:00
memcpy( buffer, &size, sizeof( size_t ) );
size_t pos = sizeof( size_t );
for ( size_t i = 0; i < rhs.size(); i++ ) {
pack( rhs[i], &buffer[pos] );
pos += packsize( rhs[i] );
2021-01-04 23:37:44 -05:00
}
}
template<class TYPE>
2021-03-17 10:24:14 -04:00
void unpack( std::vector<TYPE> &data, const char *buffer )
2021-01-04 23:37:44 -05:00
{
size_t size;
2021-03-17 10:24:14 -04:00
memcpy( &size, buffer, sizeof( size_t ) );
2021-01-04 23:37:44 -05:00
data.clear();
2021-03-17 10:24:14 -04:00
data.resize( size );
size_t pos = sizeof( size_t );
for ( size_t i = 0; i < data.size(); i++ ) {
unpack( data[i], &buffer[pos] );
pos += packsize( data[i] );
2021-01-04 23:37:44 -05:00
}
}
/********************************************************
2021-03-17 10:24:14 -04:00
* Default instantiations for std::pair *
********************************************************/
2021-01-04 23:37:44 -05:00
template<class TYPE1, class TYPE2>
2021-03-17 10:24:14 -04:00
size_t packsize( const std::pair<TYPE1, TYPE2> &rhs )
2021-01-04 23:37:44 -05:00
{
2021-03-17 10:24:14 -04:00
return packsize( rhs.first ) + packsize( rhs.second );
2021-01-04 23:37:44 -05:00
}
template<class TYPE1, class TYPE2>
2021-03-17 10:24:14 -04:00
void pack( const std::pair<TYPE1, TYPE2> &rhs, char *buffer )
2021-01-04 23:37:44 -05:00
{
2021-03-17 10:24:14 -04:00
pack( rhs.first, buffer );
pack( rhs.second, &buffer[packsize( rhs.first )] );
2021-01-04 23:37:44 -05:00
}
template<class TYPE1, class TYPE2>
2021-03-17 10:24:14 -04:00
void unpack( std::pair<TYPE1, TYPE2> &data, const char *buffer )
2021-01-04 23:37:44 -05:00
{
2021-03-17 10:24:14 -04:00
unpack( data.first, buffer );
unpack( data.second, &buffer[packsize( data.first )] );
2021-01-04 23:37:44 -05:00
}
/********************************************************
2021-03-17 10:24:14 -04:00
* Default instantiations for std::map *
********************************************************/
2021-01-04 23:37:44 -05:00
template<class TYPE1, class TYPE2>
2021-03-17 10:24:14 -04:00
size_t packsize( const std::map<TYPE1, TYPE2> &rhs )
2021-01-04 23:37:44 -05:00
{
2021-03-17 10:24:14 -04:00
size_t bytes = sizeof( size_t );
typename std::map<TYPE1, TYPE2>::const_iterator it;
for ( it = rhs.begin(); it != rhs.end(); ++it ) {
bytes += packsize( it->first );
bytes += packsize( it->second );
2021-01-04 23:37:44 -05:00
}
return bytes;
}
template<class TYPE1, class TYPE2>
2021-03-17 10:24:14 -04:00
void pack( const std::map<TYPE1, TYPE2> &rhs, char *buffer )
2021-01-04 23:37:44 -05:00
{
size_t N = rhs.size();
2021-03-17 10:24:14 -04:00
pack( N, buffer );
size_t pos = sizeof( size_t );
typename std::map<TYPE1, TYPE2>::const_iterator it;
for ( it = rhs.begin(); it != rhs.end(); ++it ) {
pack( it->first, &buffer[pos] );
pos += packsize( it->first );
pack( it->second, &buffer[pos] );
pos += packsize( it->second );
2021-01-04 23:37:44 -05:00
}
}
template<class TYPE1, class TYPE2>
2021-03-17 10:24:14 -04:00
void unpack( std::map<TYPE1, TYPE2> &data, const char *buffer )
2021-01-04 23:37:44 -05:00
{
size_t N = 0;
2021-03-17 10:24:14 -04:00
unpack( N, buffer );
size_t pos = sizeof( size_t );
2021-01-04 23:37:44 -05:00
data.clear();
2021-03-17 10:24:14 -04:00
for ( size_t i = 0; i < N; i++ ) {
std::pair<TYPE1, TYPE2> tmp;
unpack( tmp.first, &buffer[pos] );
pos += packsize( tmp.first );
unpack( tmp.second, &buffer[pos] );
pos += packsize( tmp.second );
data.insert( tmp );
2021-01-04 23:37:44 -05:00
}
}
/********************************************************
2021-03-17 10:24:14 -04:00
* Default instantiations for std::set *
********************************************************/
2021-01-04 23:37:44 -05:00
template<class TYPE>
2021-03-17 10:24:14 -04:00
size_t packsize( const std::set<TYPE> &rhs )
2021-01-04 23:37:44 -05:00
{
2021-03-17 10:24:14 -04:00
size_t bytes = sizeof( size_t );
2021-01-04 23:37:44 -05:00
typename std::set<TYPE>::const_iterator it;
2021-03-17 10:24:14 -04:00
for ( it = rhs.begin(); it != rhs.end(); ++it ) {
bytes += packsize( *it );
2021-01-04 23:37:44 -05:00
}
return bytes;
}
template<class TYPE>
2021-03-17 10:24:14 -04:00
void pack( const std::set<TYPE> &rhs, char *buffer )
2021-01-04 23:37:44 -05:00
{
size_t N = rhs.size();
2021-03-17 10:24:14 -04:00
pack( N, buffer );
size_t pos = sizeof( size_t );
2021-01-04 23:37:44 -05:00
typename std::set<TYPE>::const_iterator it;
2021-03-17 10:24:14 -04:00
for ( it = rhs.begin(); it != rhs.end(); ++it ) {
pack( *it );
pos += packsize( *it );
2021-01-04 23:37:44 -05:00
}
}
template<class TYPE>
2021-03-17 10:24:14 -04:00
void unpack( std::set<TYPE> &data, const char *buffer )
2021-01-04 23:37:44 -05:00
{
size_t N = 0;
2021-03-17 10:24:14 -04:00
unpack( N, buffer );
size_t pos = sizeof( size_t );
2021-01-04 23:37:44 -05:00
data.clear();
2021-03-17 10:24:14 -04:00
for ( size_t i = 0; i < N; i++ ) {
2021-01-04 23:37:44 -05:00
TYPE tmp;
2021-03-17 10:24:14 -04:00
unpack( tmp, &buffer[pos] );
pos += packsize( tmp );
data.insert( tmp );
2021-01-04 23:37:44 -05:00
}
}
#endif