X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fregistrar.h;h=3898ec0d9833c099cee421c3331d0c6079f04ff9;hp=ca0d4a398384c50d8e91cd4c6ea6bc2f518f02bd;hb=9f015041142625abf6645b3ea39c62b59a5f442c;hpb=19c8f943c15dcc0d946fb4d5fef11e487d34857a diff --git a/ginac/registrar.h b/ginac/registrar.h index ca0d4a39..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-2000 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,22 +59,57 @@ struct registered_class_info { }; -/** Macro for inclusion in the declaration of each registered class. */ -#define GINAC_DECLARE_REGISTERED_CLASS(classname, supername) \ +/** Primary macro for inclusion in the implementation of each registered class. */ +#define GINAC_DECLARE_REGISTERED_CLASS_NO_CTORS(classname, supername) \ public: \ typedef supername inherited; \ static registered_class_info reg_info; \ virtual const char *class_name(void) const; \ classname(const archive_node &n, const lst &sym_lst); \ virtual void archive(archive_node &n) const; \ - static ex unarchive(const archive_node &n, const lst &sym_lst); \ + static ex unarchive(const archive_node &n, const lst &sym_lst); + +/** 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() { 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: -/** Macro for inclusion in the implementation of each registered class. */ -#define GINAC_IMPLEMENT_REGISTERED_CLASS(classname, supername) \ +/** 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. + * 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(const classname & other) { copy(other); } \ +const classname & classname::operator=(const classname & other) \ +{ \ + 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); @@ -85,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__