X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fregistrar.h;h=3898ec0d9833c099cee421c3331d0c6079f04ff9;hp=8c2e6d686f031840baaa39ae34818d473373038a;hb=d38a462cfa886ce662f045348c64339b0b30d99c;hpb=bd2d7351b89743eb68ce7d3bfa7ab62c331f9522 diff --git a/ginac/registrar.h b/ginac/registrar.h index 8c2e6d68..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; @@ -45,37 +43,72 @@ extern registered_class_info *first_registered_class; /** This structure stores information about a registered GiNaC class. */ struct registered_class_info { - registered_class_info(const char *n, const char *s, unsigned int k, unarch_func f) - : name(n), super(s), tinfo_key(k), unarchive(f) - { - // Add structure to list - next = first_registered_class; - first_registered_class = this; - } - - registered_class_info *next; /**< Pointer to next registered_class_info in list. */ - const char *name; /**< Class name. */ - const char *super; /**< Name of superclass. */ - unsigned int tinfo_key; /**< TINFO_* key. */ - unarch_func unarchive; /**< Pointer to unarchiving function. */ + registered_class_info(const char *n, const char *s, unsigned int k, unarch_func f) + : name(n), super(s), tinfo_key(k), unarchive(f) + { + // Add structure to list + next = first_registered_class; + first_registered_class = this; + } + + registered_class_info *next; /**< Pointer to next registered_class_info in list. */ + const char *name; /**< Class name. */ + const char *super; /**< Name of superclass. */ + unsigned int tinfo_key; /**< TINFO_* key. */ + unarch_func unarchive; /**< Pointer to unarchiving function. */ }; -/** Macro for inclusion in the declaration of each registered class. */ +/** 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); + +/** 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: \ - 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); \ + 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. */ +/** 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) \ - registered_class_info classname::reg_info(#classname, #supername, TINFO_##classname, &classname::unarchive); \ - const char *classname::class_name(void) const {return reg_info.name;} + 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. */ @@ -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__