From 09988aee53a2bfef87fc887a434b4c78d6326c47 Mon Sep 17 00:00:00 2001 From: Alexei Sheplyakov Date: Wed, 15 Oct 2008 15:32:11 +0400 Subject: [PATCH] registered_class_info: use typeid() instead of tinfo_static. (Custom RTTI considered harmful, part 5). Since custom RTTI is going to be removed, registered_class_info needs to be re-organazied. Now tinfo_key is a (const) pointer to std::type_info. --- check/exam_archive.cpp | 3 ++- ginac/registrar.cpp | 2 +- ginac/registrar.h | 19 +++++++++++-------- ginac/structure.h | 3 +-- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/check/exam_archive.cpp b/check/exam_archive.cpp index 97962d7a..bdf69955 100644 --- a/check/exam_archive.cpp +++ b/check/exam_archive.cpp @@ -65,7 +65,8 @@ unsigned exam_archive() } f = ar.unarchive_ex(lst(x, y, mu, dim), "expr 1"); - if (!f.is_equal(e)) { + ex difference = (f - e).expand(); + if (!difference.is_zero()) { clog << "archiving/unarchiving " << e << endl << "erroneously returned " << f << endl; ++result; diff --git a/ginac/registrar.cpp b/ginac/registrar.cpp index 369b8942..5a4d8903 100644 --- a/ginac/registrar.cpp +++ b/ginac/registrar.cpp @@ -28,7 +28,7 @@ namespace GiNaC { -tinfo_t find_tinfo_key(const std::string &class_name) +std::type_info const* find_tinfo_key(const std::string &class_name) { return registered_class_info::find(class_name)->options.get_id(); } diff --git a/ginac/registrar.h b/ginac/registrar.h index d8a64db2..f7790d9e 100644 --- a/ginac/registrar.h +++ b/ginac/registrar.h @@ -26,6 +26,7 @@ #include #include #include +#include #include "class_info.h" #include "print.h" @@ -86,12 +87,14 @@ typedef ex (*unarch_func)(const archive_node &n, lst &sym_lst); /** This class stores information about a registered GiNaC class. */ class registered_class_options { public: - registered_class_options(const char *n, const char *p, tinfo_t ti, unarch_func f) - : name(n), parent_name(p), tinfo_key(ti), unarchive(f) {} + registered_class_options(const char *n, const char *p, + const std::type_info& ti, + unarch_func f) + : name(n), parent_name(p), tinfo_key(&ti), unarchive(f) {} const char *get_name() const { return name; } const char *get_parent_name() const { return parent_name; } - tinfo_t get_id() const { return tinfo_key; } + std::type_info const* get_id() const { return tinfo_key; } unarch_func get_unarch_func() const { return unarchive; } const std::vector &get_print_dispatch_table() const { return print_dispatch_table; } @@ -126,7 +129,7 @@ public: private: const char *name; /**< Class name. */ const char *parent_name; /**< Name of superclass. */ - tinfo_t tinfo_key; /**< Type information key. */ + std::type_info const* tinfo_key; /**< Type information key. */ unarch_func unarchive; /**< Pointer to unarchiving function. */ std::vector print_dispatch_table; /**< Method table for print() dispatch */ }; @@ -181,24 +184,24 @@ private: /** Macro for inclusion in the implementation of each registered class. */ #define GINAC_IMPLEMENT_REGISTERED_CLASS(classname, supername) \ - GiNaC::registered_class_info classname::reg_info = GiNaC::registered_class_info(GiNaC::registered_class_options(#classname, #supername, &classname::tinfo_static, &classname::unarchive)); \ + GiNaC::registered_class_info classname::reg_info = GiNaC::registered_class_info(GiNaC::registered_class_options(#classname, #supername, typeid(classname), &classname::unarchive)); \ const GiNaC::tinfo_static_t classname::tinfo_static = {}; /** Macro for inclusion in the implementation of each registered class. * Additional options can be specified. */ #define GINAC_IMPLEMENT_REGISTERED_CLASS_OPT(classname, supername, options) \ - GiNaC::registered_class_info classname::reg_info = GiNaC::registered_class_info(GiNaC::registered_class_options(#classname, #supername, &classname::tinfo_static, &classname::unarchive).options); \ + GiNaC::registered_class_info classname::reg_info = GiNaC::registered_class_info(GiNaC::registered_class_options(#classname, #supername, typeid(classname), &classname::unarchive).options); \ const GiNaC::tinfo_static_t classname::tinfo_static = {}; /** Macro for inclusion in the implementation of each registered class. * Additional options can be specified. */ #define GINAC_IMPLEMENT_REGISTERED_CLASS_OPT_T(classname, supername, options) \ - GiNaC::registered_class_info classname::reg_info = GiNaC::registered_class_info(GiNaC::registered_class_options(#classname, #supername, &classname::tinfo_static, &classname::unarchive).options); \ + GiNaC::registered_class_info classname::reg_info = GiNaC::registered_class_info(GiNaC::registered_class_options(#classname, #supername, typeid(classname), &classname::unarchive).options); \ template<> const GiNaC::tinfo_static_t classname::tinfo_static = {}; /** Find type information key by class name. */ -extern tinfo_t find_tinfo_key(const std::string &class_name); +extern std::type_info const* find_tinfo_key(const std::string &class_name); /** Find unarchiving function by class name. */ extern unarch_func find_unarch_func(const std::string &class_name); diff --git a/ginac/structure.h b/ginac/structure.h index cfd17c90..6c08618c 100644 --- a/ginac/structure.h +++ b/ginac/structure.h @@ -119,7 +119,6 @@ class structure : public basic, public ComparisonPolicy { // helpers static tinfo_t get_tinfo() { return reg_info.options.get_id(); } static const char *get_class_name() { return "structure"; } - static tinfo_t next_structure_tinfo_key() { return new tinfo_static_t; } // constructors public: @@ -263,7 +262,7 @@ int structure::compare_same_type(const basic & other) const } template class CP> -registered_class_info structure::reg_info = registered_class_info(registered_class_options(structure::get_class_name(), "basic", structure::next_structure_tinfo_key(), &structure::unarchive)); +registered_class_info structure::reg_info = registered_class_info(registered_class_options(structure::get_class_name(), "basic", typeid(structure), &structure::unarchive)); } // namespace GiNaC -- 2.44.0