X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fregistrar.h;h=3898ec0d9833c099cee421c3331d0c6079f04ff9;hp=f665ccd87cd830969479262469a659fdb7e87148;hb=9f015041142625abf6645b3ea39c62b59a5f442c;hpb=e5362a33f72613b324b3714524a8c2e5f7b7f46f diff --git a/ginac/registrar.h b/ginac/registrar.h index f665ccd8..3898ec0d 100644 --- a/ginac/registrar.h +++ b/ginac/registrar.h @@ -3,7 +3,7 @@ * GiNaC's class registrar (for class basic and all classes derived from it). */ /* - * GiNaC Copyright (C) 1999-2001 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2002 Johannes Gutenberg University Mainz, Germany * * 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 @@ -25,9 +25,7 @@ #include -#ifndef NO_NAMESPACE_GINAC namespace GiNaC { -#endif // ndef NO_NAMESPACE_GINAC class registered_class_info; class ex; @@ -61,6 +59,7 @@ struct registered_class_info { }; +/** Primary macro for inclusion in the implementation of each registered class. */ #define GINAC_DECLARE_REGISTERED_CLASS_NO_CTORS(classname, supername) \ public: \ typedef supername inherited; \ @@ -70,46 +69,48 @@ public: \ virtual void archive(archive_node &n) const; \ static ex unarchive(const archive_node &n, const lst &sym_lst); -/** Macro for inclusion in the declaration of each registered class. */ +/** Macro for inclusion in the declaration of each registered class. + * It declares some functions that are common to all classes derived + * from 'basic' as well as all required stuff for the GiNaC class + * registry (mainly needed for archiving). */ #define GINAC_DECLARE_REGISTERED_CLASS(classname, supername) \ GINAC_DECLARE_REGISTERED_CLASS_NO_CTORS(classname, supername) \ public: \ classname(); \ - ~classname(); \ + ~classname() { destroy(false); } \ classname(const classname & other); \ const classname & operator=(const classname & other); \ + basic * duplicate() const; \ protected: \ void copy(const classname & other); \ void destroy(bool call_parent); \ + int compare_same_type(const basic & other) const; \ private: +/** Primary macro for inclusion in the implementation of each registered class. */ #define GINAC_IMPLEMENT_REGISTERED_CLASS_NO_CTORS(classname, supername) \ registered_class_info classname::reg_info(#classname, #supername, TINFO_##classname, &classname::unarchive); \ const char *classname::class_name(void) const {return reg_info.name;} -/** Macro for inclusion in the implementation of each registered class. */ +/** Macro for inclusion in the implementation of each registered class. + * It implements some functions that are the same in all classes derived + * from 'basic' (such as the assignment operator). */ #define GINAC_IMPLEMENT_REGISTERED_CLASS(classname, supername) \ GINAC_IMPLEMENT_REGISTERED_CLASS_NO_CTORS(classname, supername) \ -classname::~classname() \ -{ \ - debugmsg(#classname " destructor", LOGLEVEL_DESTRUCT); \ - destroy(false); \ -} \ -classname::classname(const classname & other) \ -{ \ - debugmsg(#classname " copy constructor", LOGLEVEL_CONSTRUCT); \ - copy(other); \ -} \ +classname::classname(const classname & other) { copy(other); } \ const classname & classname::operator=(const classname & other) \ { \ - debugmsg(#classname " operator=", LOGLEVEL_ASSIGNMENT); \ if (this != &other) { \ destroy(true); \ copy(other); \ } \ return *this; \ +} \ +basic * classname::duplicate() const { \ + return new classname(*this); \ } + /** Find TINFO_* key by class name. */ extern unsigned int find_tinfo_key(const std::string &class_name); @@ -117,8 +118,6 @@ extern unsigned int find_tinfo_key(const std::string &class_name); extern unarch_func find_unarch_func(const std::string &class_name); -#ifndef NO_NAMESPACE_GINAC } // namespace GiNaC -#endif // ndef NO_NAMESPACE_GINAC #endif // ndef __GINAC_REGISTRAR_H__