16 #ifndef H_FB_STRINGIDMAP
17 #define H_FB_STRINGIDMAP
32 template <
class IDTYPE>
36 class compare_variants {
44 class compare_numerics {
46 bool operator()(
const IDTYPE &x,
const IDTYPE &y)
const
48 long long x2 = (
long long)(x);
49 long long y2 = (
long long)(y);
59 typedef std::map<IDTYPE, FB::variant, compare_numerics>
IdVariantMap;
66 typedef std::map<FB::variant, IDTYPE, compare_variants>
VariantIdMap;
77 TypeIDMap(IDTYPE startValue) : nextId((unsigned long)startValue) { }
92 if (m_idVariant.find(idt) != m_idVariant.end()
93 || m_variantId.find(val) != m_variantId.end()) {
94 throw std::runtime_error(
"ID or value already defined");
96 m_variantId[val] = idt;
97 m_idVariant[idt] = val;
112 typename VariantIdMap::iterator it = m_variantId.find(val);
114 if (it != m_variantId.end()) {
117 IDTYPE newId = (IDTYPE)nextId++;
118 m_variantId[val] = newId;
119 m_idVariant[newId] = val;
135 typename IdVariantMap::iterator it = m_idVariant.find(idt);
137 if (it != m_idVariant.end()) {
138 return it->second.get_type();
155 return m_idVariant.find(idt) != m_idVariant.end();
175 typename IdVariantMap::iterator it = m_idVariant.find(idt);
177 if (it != m_idVariant.end()) {
178 return it->second.get_type() ==
typeid(T);
199 typename IdVariantMap::iterator it = m_idVariant.find(idt);
201 if (it != m_idVariant.end()) {
202 T retVal = (*it).second.template convert_cast<T>();
212 unsigned long nextId;
218 #endif // H_FB_STRINGIDMAP
Bidirectional map between an identifier and a variant.
Accepts any datatype, used in all interactions with javascript. Provides tools for getting back out t...
std::map< IDTYPE, FB::variant, compare_numerics > IdVariantMap
Defines an alias representing the map from the id type to a variant.
Thrown when variant::cast<type> or variant::convert_cast<type> fails because the type of the value st...
IDTYPE getIdForValue(const variant &val)
Gets the identifier assigned to the given value; if none is yet assigned, assigns a sequential identi...
bool idIsType(IDTYPE idt)
Queries if the provided identifier is assigned to a value of the given type.
std::map< FB::variant, IDTYPE, compare_variants > VariantIdMap
Defines an alias representing the map from a variant to the id.
const std::type_info & idGetType(IDTYPE idt)
Returns the type of the value the given identifier is assigned to.
TypeIDMap(IDTYPE startValue)
Constructor.
void setIdForValue(IDTYPE idt, const variant &val)
Sets an identifier for value.
T getValueForId(IDTYPE idt)
Gets the value assigned to the identifier.
bool idExists(IDTYPE idt)
Queries if a given identifier has been assigned to anything.