#ifndef Chimera_NameMapImpl_h # define Chimera_NameMapImpl_h # if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once # endif # ifndef WrapPy # include "Symbol.h" # include "NameMap.h" namespace chimera { template typename Name::NameMap Name::all; template typename Name::BackMap Name::back; template klass* Name::lookup(Symbol name) { if (name.empty()) return NULL; typename NameMap::iterator i = all.find(name); if (i == all.end()) return NULL; return dynamic_cast(i->second); } template void Name::remove(Symbol name) throw () { typename NameMap::iterator i = all.find(name); if (i == all.end()) return; typename BackMap::iterator j = back.find(i->second); all.erase(i); back.erase(j); } template typename Name::NameMapRange Name::list() throw () { return std::make_pair(all.begin(), all.end()); } template Name::~Name() { remove(); } template void Name::save(Symbol name) throw (std::logic_error) { if (name.empty()) throw std::invalid_argument("empty name"); typename NameMap::iterator i = all.find(name); if (i != all.end()) throw std::invalid_argument("name already defined"); all[name] = this; back[this] = name; } template Symbol Name::name() const throw () { Name* k = const_cast*>(this); typename BackMap::const_iterator i = back.find(k); if (i == back.end()) return Symbol(); return i->second; } template void Name::remove() throw () { typename BackMap::iterator i = back.find(this); if (i == back.end()) return; typename NameMap::iterator j = all.find(i->second); back.erase(i); all.erase(j); } } // namespace chimera # endif /* WrapPy */ #endif