// 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