+/** Unarchiving function (static member function of every GiNaC class). */
+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, unsigned 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; }
+ unsigned get_id() const { return tinfo_key; }
+ unarch_func get_unarch_func() const { return unarchive; }
+ const std::vector<print_functor> &get_print_dispatch_table() const { return print_dispatch_table; }
+
+ template <class Ctx, class T, class C>
+ registered_class_options & print_func(void f(const T &, const C & c, unsigned))
+ {
+ set_print_func(Ctx::get_class_info_static().options.get_id(), f);
+ return *this;
+ }
+
+ template <class Ctx, class T, class C>
+ registered_class_options & print_func(void (T::*f)(const C &, unsigned))
+ {
+ set_print_func(Ctx::get_class_info_static().options.get_id(), f);
+ return *this;
+ }
+
+ template <class Ctx>
+ registered_class_options & print_func(const print_functor & f)
+ {
+ set_print_func(Ctx::get_class_info_static().options.get_id(), f);
+ return *this;
+ }
+
+ void set_print_func(unsigned id, const print_functor & f)
+ {
+ if (id >= print_dispatch_table.size())
+ print_dispatch_table.resize(id + 1);
+ print_dispatch_table[id] = f;
+ }