- 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); \
+private: \
+ static GiNaC::registered_class_info reg_info; \
+public: \
+ static GiNaC::registered_class_info &get_class_info_static() { return reg_info; } \
+ virtual const GiNaC::registered_class_info &get_class_info() const { return classname::get_class_info_static(); } \
+ virtual GiNaC::registered_class_info &get_class_info() { return classname::get_class_info_static(); } \
+ virtual const char *class_name() const { return classname::get_class_info_static().options.get_name(); } \
+ class visitor { \
+ public: \
+ virtual void visit(const classname &) = 0; \
+ virtual ~visitor() {}; \
+ };
+
+/** 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(); \
+ virtual classname * duplicate() const { return new classname(*this); } \
+ \
+ virtual void accept(GiNaC::visitor & v) const \
+ { \
+ if (visitor *p = dynamic_cast<visitor *>(&v)) \
+ p->visit(*this); \
+ else \
+ inherited::accept(v); \
+ } \
+protected: \
+ virtual int compare_same_type(const GiNaC::basic & other) const; \