#include "ebasearrayof.h"

#include "evar.h"

ebasearrayof::~ebasearrayof() {}

long ebasearrayof::findvarkey(const evar& key,long i) const
{
  for (; i<size(); ++i){
    if (key==getvarkey(i))
      return(i);
  }
  return(-1);
}

void ebasearrayof::json_serial(estr& data) const
{
  data+="{\"length\":";
  json_serialuint(size(),data);
  data+=",\"keys\":[";
  size_t i;
  for (i=0; i<size(); ++i){
    getvarkey(i).json_serial(data);
    if (i+1<size()) data+=",";
  }
  data+="],\"values\":[";
  for (i=0; i<size(); ++i){
    getvar(i).json_serial(data);
    if (i+1<size()) data+=",";
  }
  data+="]}";
}
/*
size_t ebasearrayof::json_unserial(const estr& data,size_t i)
{
  unsigned int count;
  evar keyvar,var;
  i=json_unserialint(count,data,i);
  if (i==-1) return(-1);
  while(count && i<data.len()){
    keyvar.clear(); var.clear();
    i=keyvar.unserial(data,i);
    if (i==-1) return(-1);
    i=var.unserial(data,i);
    if (i==-1) return(-1);
    addvar(keyvar,var);
    --count;
  }
  if (count) return(-1);
  return(i);
}
*/

void ebasearrayof::serial(estr& data) const
{
  serialuint(size(),data);
  size_t i;
  for (i=0; i<size(); ++i){
    getvarkey(i).serial(data);
    getvar(i).serial(data);
  }
}

size_t ebasearrayof::unserial(const estr& data,size_t i)
{
  if (i==-1) return(i);

  unsigned int count;
  evar keyvar,var;
  i=unserialuint(count,data,i);
  if (i==-1) return(-1);
  while(count && i<data.len()){
    keyvar.clear(); var.clear();
    i=keyvar.unserial(data,i);
    if (i==-1) return(-1);
    i=var.unserial(data,i);
    if (i==-1) return(-1);
    addvar(keyvar,var);
    --count;
  }
  if (count) return(-1);
  return(i);
}

void ebasearrayof::serial(const efile& f) const
{
  serialuint(size(),f);
  size_t i;
  for (i=0; i<size(); ++i){
    getvarkey(i).serial(f);
    getvar(i).serial(f);
  }
}

bool ebasearrayof::unserial(const efile& f)
{
  unsigned int count;
  evar keyvar,var;
  if (!unserialuint(count,f)) return(false);

  while(count){
    keyvar.clear(); var.clear();
    if (!keyvar.unserial(f)) return(false);
    if (!var.unserial(f)) return(false);
    addvar(keyvar,var);
    --count;
  }
  if (count) return(false);
  return(true);
}

ostream& operator<<(ostream& stream,const ebasearrayof& arr)
{
  size_t i;
  stream << "[";
  if (arr.size()==0){ stream << "]"; return(stream); }

  for (i=0; i<arr.size()-1; ++i)
    stream << arr.getvarkey(i) << "=" << arr.getvar(i) << ",";
  stream << arr.getvarkey(i) << "=" << arr.getvar(i);
  stream << "]";
  return(stream);
}

