#if     !defined(_ENUMMAP_HPP)

#include <map>
#include <limits>

#include <alma/Enumtcl/enum_par.hpp>

template<typename enum_type, typename val_type>
class enum_map_traits : public std::map<enum_type,EnumPar<val_type> > {
public:
  enum_map_traits(){}
  static bool init_;
  static std::string typeName_;
  static std::string enumerationDesc_;
  static std::string order_;
  static std::string xsdBaseType_;
  static std::map<enum_type,EnumPar<val_type> > m_;
};


template<typename type, typename val_type>
class enum_map_traiter : public std::map<type,EnumPar<val_type> >, std::map<type,EnumPar<val_type> >::iterator
{
public:
  typedef type enum_type;
  static bool init_;
  static std::string typeName_;
  static std::string enumerationDesc_;
  static std::string order_;
  static std::string xsdBaseType_;

  static std::set<std::string> enumMemberSet(){
    std::set<std::string> s;
    typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(m_.begin()), ite(m_.end());
    for(it=itb; it!=ite; ++it)s.insert(it->second.str());
    return s;
  }

  static std::vector<std::string> enumMemberList(){
    std::vector<std::string> v;
    typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(m_.begin()), ite(m_.end());
    for(it=itb; it!=ite; ++it)v.push_back(it->second.str());
    return v;
  }

  static std::vector<val_type> enumValues(){
    std::vector<val_type> v;
    typename std::map<enum_type,EnumPar<val_type> >::iterator it, itb(m_.begin()), ite(m_.end());
    for(it=itb; it!=ite; ++it)v.push_back(it->second.val());
    return v;
  }

  static unsigned int enumNum(){
    return m_.size();
  }

  static std::map<type,EnumPar<val_type> > m_;
  // ne doit pas etre static! Je n'arrive plus a trouver la raison...
  int fromStringToInt(std::string s){
    typename 
    std::map<enum_type,EnumPar<val_type> >::iterator it, itb(m_.begin()), ite(m_.end());
    for(it=itb;it!=ite;++it)
      if(it->second.str()==s)return (int) it->first;
    return std::numeric_limits<int>::max();
  }

};

#define _ENUMMAP_HPP
#endif