// Common, group Encoding
// Copyright Alexander Liss
#ifndef __CODESTL_H__
#define __CODESTL_H__
#include <string>
#include <vector>
#include <deque>
#include "datacoder.h"
using namespace std;
// faster variant
int pack(CommBuffer& d,const string& z);
template<class E, class T = char_traits<E>,class A = allocator<T> >
int pack(CommBuffer& d,const basic_string<E,T,A>& z)
{
int g=0;
g=pack(d,z.size());
if(g) return 1;
for(int i=0;i<z.size();++i)
{
g=pack(d,z[i]);
if(g) break;
}
return g;
}
template<class E,class T = char_traits<E>,class A = allocator<T> >
int unpack(basic_string<E,T,A>& z,const CommBuffer& s,ReadControl& c)
{
int g=0;
int sz=0;
g=unpack(sz,s,c);
if(g) return 1;
z.reserve(sz);
for(int i=0;i<sz;++i)
{
g=unpack(z[i],s,c);
if(g) break;
}
return g;
}
template<class T,class A = allocator<T> >
int pack(CommBuffer& d,const vector<T,A>& z)
{
int g=0;
g=pack(d,z.size());
if(g) return 1;
for(int i=0;i<z.size();++i)
{
g=pack(d,z[i]);
if(g) break;
}
return g;
}
template<class T,class A = allocator<T> >
int unpack(vector<T,A>& z,const CommBuffer& s,ReadControl& c)
{
int g=0;
int sz=0;
g=unpack(sz,s,c);
if(g) return 1;
z.reserve(sz);
for(int i=0;i<sz;++i)
{
g=unpack(z[i],s,c);
if(g) break;
}
return g;
}
template<class T,class A = allocator<T> >
int pack(CommBuffer& d,const deque<T,A>& z)
{
int g=0;
g=pack(d,z.size());
if(g) return 1;
for(int i=0;i<z.size();++i)
{
g=pack(d,z[i]);
if(g) break;
}
return g;
}
template<class T,class A = allocator<T> >
int unpack(deque<T,A>& z,const CommBuffer& s,ReadControl& c)
{
int g=0;
int sz=0;
g=unpack(sz,s,c);
if(g) return 1;
for(int i=0;i<sz;++i)
{
T t;
g=unpack(t,s,c);
if(g) break;
z.push_back(t);
}
return g;
}
#endif