#ifndef ESORTEDARRAYOF_DEC_H
#define ESORTEDARRAYOF_DEC_H

#include "eutils.h"

#include <iostream>

#include "ebasicarray_dec.h"

#include "ebasearrayof.h"
#include <map>

//#include "estr.h"
class estr;

using namespace std;

typedef ebasicarray<int> eintarray;

template <class T, class K>
class esortedarrayof;

template <class T,class K>
ostream &operator<<(ostream &stream,const esortedarrayof<T,K> &var);

template <class T, class K>
class esortedarrayof // : public ebasearrayof
{
 protected:
  std::map<K,T> _map;
 public:
  esortedarrayof();
  esortedarrayof(const esortedarrayof<T,K> &a);
  ~esortedarrayof();
  
  T &add(const K& name,const T& value);
  T &addref(const K& name,T *value);

  esortedarrayof<T,K> operator[](const eintarray& i) const;

  T& operator[](const K& key);
  const T& operator[](const K& key) const;
  
  T& operator[](size_t i);
  const T& operator[](size_t i) const;

  inline K& keys(size_t i) { return((_map.begin()+i)->first); }
  inline const K& keys(size_t i) const  { return((_map.begin()+i)->first); }

  T& at(const K& key);
  const T& at(const K& key) const;

  inline T& values(size_t i) { return(*(_map.begin()+i)->second); }
  inline const T& values(size_t i) const { return(*(_map.begin()+i)->second); }

  inline size_t size() const { return(_map.size()); }


  void remove(size_t i);
  inline void erase(size_t i) { remove(i); }
  inline void rem(size_t i)   { remove(i); }
  inline void del(long int i,long int l=-1)   { if (i<0) i+=size(); if (l<0) l+=size()-i+1; if (i>=size() || i<0l || l<=0l) return; if (i+l>size()) l=size()-i; for (; l>0; --l) remove(i); }

  void clear();

  friend ostream &operator<< <>(ostream &stream,const esortedarrayof<T,K> &var);

/*
  void addvar(evar& key,evar& var);
  evar getvar(size_t i) const;
  evar getvarByKey(const evar& var) const;
  evar getvarkey(size_t i) const;
*/
};

#endif

