#pragma once
#ifndef TSTRINGID_INCLUDED
#define TSTRINGID_INCLUDED
#include <tcommon.h>
#include <string>
#include <vector>
#include <map>
#undef DVAPI
#undef DVVAR
#ifdef TSTRINGID_EXPORTS
#define DVAPI DV_EXPORT_API
#define DVVAR DV_EXPORT_VAR
#else
#define DVAPI DV_IMPORT_API
#define DVVAR DV_IMPORT_VAR
#endif
//-------------------------------------------------------------------
class DVAPI TStringId {
public:
typedef std::map<std::string, int> Map;
typedef Map::iterator Iterator;
struct StaticData;
static const Iterator& none();
static Iterator genIter(const std::string &str);
static Iterator findIter(int id);
static Iterator findIter(const std::string &str);
private:
Iterator iter;
inline explicit TStringId(const Iterator &iter):
iter(iter) { }
public:
inline TStringId():
iter(none()) { }
inline explicit TStringId(const std::string &str):
iter(genIter(str)) { }
inline void reset()
{ iter = none(); }
inline void set(const std::string &str)
{ if (iter->first != str) iter = genIter(str); }
inline int id() const
{ return iter->second; }
inline const std::string& str() const
{ return iter->first; }
inline operator bool () const
{ return id() != 0; }
inline bool operator== (const TStringId &other) const
{ return id() == other.id(); }
inline bool operator!= (const TStringId &other) const
{ return id() != other.id(); }
inline bool operator< (const TStringId &other) const
{ return id() < other.id(); }
inline static TStringId find(int id)
{ return TStringId(findIter(id)); }
inline static TStringId find(const std::string &str)
{ return TStringId(findIter(str)); }
};
#endif