diff options
author | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2014-12-20 15:51:00 +0100 |
---|---|---|
committer | Andreas Stöckel <andreas@somweyr.de> | 2014-12-20 15:51:00 +0100 |
commit | a7567d08e4d5869833069ec7211785af350aea88 (patch) | |
tree | 120971129563f9e5f054ea5bb740fcbf8f473936 /src/core/managed/Rtti.cpp | |
parent | 87233da76c01ebead18a26f01ffb4e20dffe3214 (diff) |
Renamed ManagedType class to Rtti to make naming less confusing, implemented easier to use Rtti clas
Diffstat (limited to 'src/core/managed/Rtti.cpp')
-rw-r--r-- | src/core/managed/Rtti.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/core/managed/Rtti.cpp b/src/core/managed/Rtti.cpp new file mode 100644 index 0000000..eade524 --- /dev/null +++ b/src/core/managed/Rtti.cpp @@ -0,0 +1,66 @@ +/* + 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 RttiBase::None; + } else { + return *(it->second); + } +} + +/* Class RttiBase */ + +const RttiBase RttiBase::None; + +bool RttiBase::isa(const RttiBase &other) const +{ + if (&other == this) { + return true; + } + for (auto t : parents) { + if (t->isa(other)) { + return true; + } + } + return false; +} + + +} + |