diff options
author | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2014-12-21 00:40:52 +0100 |
---|---|---|
committer | Andreas Stöckel <andreas@somweyr.de> | 2014-12-21 00:40:52 +0100 |
commit | 989cc6d8064a95426962588f806bb987a6896e7f (patch) | |
tree | 9e8b4b923dff3305396fba8414fc46c2a9d59c07 /src/core/common/Rtti.cpp | |
parent | 30c60d9317c7f56b17dce82a4a02fd50c3a7dfc2 (diff) |
moved Rtti from managed to common folder, added Function header
Diffstat (limited to 'src/core/common/Rtti.cpp')
-rw-r--r-- | src/core/common/Rtti.cpp | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/core/common/Rtti.cpp b/src/core/common/Rtti.cpp new file mode 100644 index 0000000..eeae41f --- /dev/null +++ b/src/core/common/Rtti.cpp @@ -0,0 +1,72 @@ +/* + Ousía + Copyright (C) 2014, 2015 Benjamin Paaßen, Andreas Stöckel + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "Rtti.hpp" + +namespace ousia { + +/* Class RttiStore */ + +std::unordered_map<std::type_index, const RttiBase *> &RttiStore::table() +{ + static std::unordered_map<std::type_index, const RttiBase *> table; + return table; +} + +void RttiStore::store(const std::type_info &native, const RttiBase *rtti) +{ + table().emplace(std::type_index{native}, rtti); +} + +const RttiBase &RttiStore::lookup(const std::type_info &native) +{ + const auto &tbl = table(); + auto it = tbl.find(std::type_index{native}); + if (it == tbl.end()) { + return RttiTypes::None; + } else { + return *(it->second); + } +} + +/* Class RttiBase */ + +bool RttiBase::isa(const RttiBase &other) const +{ + if (&other == this) { + return true; + } + for (auto t : parents) { + if (t->isa(other)) { + return true; + } + } + return false; +} + +/* Constant initialization */ + +const RttiBase RttiTypes::None; +const RttiBase RttiTypes::Int; +const RttiBase RttiTypes::Double; +const RttiBase RttiTypes::String; +const RttiBase RttiTypes::Array; +const RttiBase RttiTypes::Map; + +} + |