summaryrefslogtreecommitdiff
path: root/src/core/managed/Rtti.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/managed/Rtti.hpp')
-rw-r--r--src/core/managed/Rtti.hpp220
1 files changed, 0 insertions, 220 deletions
diff --git a/src/core/managed/Rtti.hpp b/src/core/managed/Rtti.hpp
deleted file mode 100644
index 4a754a7..0000000
--- a/src/core/managed/Rtti.hpp
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- 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/>.
-*/
-
-/**
- * @file Rtti.hpp
- *
- * Classes used for storing runtime type information (RTTI). RTTI is used to
- * resolve objects of a certain type in the object graph and to attach
- * information that should be accessible to the script engine.
- *
- * <b>Why is this needed?</b> C++ provides the <tt>typeid</tt> operator to
- * retrieve a reference at an internal table associated with type information
- * for the given class. However, there is no native way for attaching additonal
- * information to this type information table. Additional information we need to
- * store is the inheritance graph (which cannot easily be extracted from C++)
- * and information relevant for script engines (such as a list of methods and
- * properties). One could of course store information about the type within each
- * instance of this type, however when managing thousands of objects
- * this would create a significant overhead.
- *
- * <b>How to use:</b> The Rtti class allows to attach information to a certain
- * C++ class. To do so, create a global constant of the type Rtti<T> in the
- * source file associated with the type declaration, where T is the type you
- * want to register. As the type must only be registered once, you must not
- * declare the variable as "static" in the header file (this would register it
- * whever the header is included). If you want to access the global constant
- * from other Rtti definitions (as parent), create a forward declaration
- * in the header file. If you want to access the RTTI of a certain object or
- * type, use the global typeOf() function (however, don't use it
- * within global variable initializations).
- *
- * <b>Example:</b>
- * In the header file:
- * \code{.hpp}
- * // Only needed if the type needs to be accessed
- * // from other compilation units!
- * const Rtti<MyType> MyType_Rtti;
- * \endcode
- * In the source file:
- * \code{.cpp}
- * const Rtti<MyType> MyType_Rtti{"MyType", {&MyOtherType_Rtti}, [...]};
- * \endcode
- *
- * @author Andreas Stöckel (astoecke@techfak.uni-bielefeld.de)
- */
-
-#ifndef _OUSIA_MANAGED_RTTI_HPP_
-#define _OUSIA_MANAGED_RTTI_HPP_
-
-#include <typeinfo>
-#include <typeindex>
-#include <unordered_map>
-#include <vector>
-
-namespace ousia {
-
-class RttiBase;
-
-/**
- * Helper class used to globally store and access the runtime type information.
- */
-class RttiStore {
-private:
- /**
- * Function used internally to access the static map storing all registered
- * native types and their corresponding type information.
- */
- static std::unordered_map<std::type_index, const RttiBase *> &table();
-
-public:
- /**
- * Registers the given pointer to the RttiBase class in the RTTI table. Does
- * not override information for already registered types.
- *
- * @param native is a reference at the native type information provided
- * by the compiler.
- * @param rtti is a pointer pointing at the type information that should be
- * stored for this type.
- */
- static void store(const std::type_info &native, const RttiBase *rtti);
-
- /**
- * Looks up the type information stored for the given native type
- * information.
- */
- static const RttiBase &lookup(const std::type_info &native);
-};
-
-/**
- * The Rtti class allows for attaching data to native types that can be accessed
- * at runtime. This type information can e.g. be retrieved using the "type"
- * method of the Managed class. This system is used for attaching human readable
- * names, parent types and script engine functionality. Use the Rtti class for
- * convenient registration of type information.
- */
-class RttiBase {
-private:
- /**
- * Set containing references to the parent types.
- */
- const std::vector<const RttiBase *> parents;
-
-public:
- /**
- * Rtti of no particular type.
- */
- static const RttiBase None;
-
- /**
- * Human readable name associated with the type.
- */
- const std::string name;
-
- /**
- * Default constructor. Creates a Rtti instance with name "unknown"
- * and no parents.
- */
- RttiBase() : name("unknown") {}
-
- /**
- * Creates a new RttiBase instance and registers it in the global type
- * table. Use the Rtti class for more convinient registration of type
- * information.
- *
- * @param name is the name of the type.
- * @param native is a reference at the native type information provided by
- * the compiler.
- * @param parents is a list of parent types.
- */
- RttiBase(
- std::string name, const std::type_info &native,
- std::vector<const RttiBase *> parents = std::vector<const RttiBase *>{})
- : parents(std::move(parents)), name(std::move(name))
- {
- RttiStore::store(native, this);
- }
-
- /**
- * Returns true if this Rtti instance is the given type or has the
- * given type as one of its parents.
- *
- * @param other is the other type for which the relation to this type
- * should be checked.
- */
- bool isa(const RttiBase &other) const;
-};
-
-/**
- * The Rtti class allows for attaching data to native types that can be accessed
- * at runtime. This type information can e.g. be retrieved using the "type"
- * method of the Managed class. This system is used for attaching human
- * readable names, parent types and script engine functionality.
- *
- * @tparam T is the class for which the type information should be registered.
- */
-template <class T>
-class Rtti : public RttiBase {
-public:
- /**
- * Creates a new RttiBase instance and registers it in the global type
- * table.
- *
- * @param name is the name of the type.
- * @param parents is a list of parent types.
- */
- Rtti(std::string name, const std::vector<const RttiBase *> &parents =
- std::vector<const RttiBase *>{})
- : RttiBase(name, typeid(T), parents)
- {
- }
-};
-
-/**
- * Function that can be used to retrieve the RTTI information of a Managed
- * object. Do not use this function in the initialization of global Rtti
- * variables, use pointers at the other global variable instead (as the
- * initialization order is not well defined).
- *
- * @tparam T is the C++ type for which the type information should be returned.
- */
-template <typename T>
-inline const RttiBase &typeOf()
-{
- return RttiStore::lookup(typeid(T));
-}
-
-/**
- * Function that can be used to retrieve the RTTI information of a Managed
- * object. Do not use this function in the initialization of global Rtti
- * variables, use pointers at the other global variable instead (as the
- * initialization order is not well defined).
- *
- * @tparam T is the C++ type for which the type information should be returned.
- * @param obj is a dummy object for which the type information should be
- * returned.
- */
-template <typename T>
-inline const RttiBase &typeOf(const T &obj)
-{
- return RttiStore::lookup(typeid(obj));
-}
-}
-
-#endif /* _OUSIA_MANAGED_RTTI_HPP_ */
-