/usr/include/pynac/registrar.h is in libpynac-dev 0.6.0-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | /** @file registrar.h
*
* GiNaC's class registrar (for class basic and all classes derived from it). */
/*
* GiNaC Copyright (C) 1999-2008 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
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef __GINAC_REGISTRAR_H__
#define __GINAC_REGISTRAR_H__
#include <string>
#include <list>
#include <vector>
#include "class_info.h"
#include "print.h"
namespace GiNaC {
class ex;
class archive_node;
template <template <class T, class = std::allocator<T> > class> class container;
typedef container<std::list> lst;
/** Definitions for the tinfo mechanism. */
typedef const void * tinfo_t;
struct tinfo_static_t {};
/** 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, tinfo_t 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; }
tinfo_t 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;
}
private:
const char *name; /**< Class name. */
const char *parent_name; /**< Name of superclass. */
tinfo_t tinfo_key; /**< Type information key. */
unarch_func unarchive; /**< Pointer to unarchiving function. */
std::vector<print_functor> print_dispatch_table; /**< Method table for print() dispatch */
};
typedef class_info<registered_class_options> registered_class_info;
/** Primary macro for inclusion in the declaration of each registered class. */
#define GINAC_DECLARE_REGISTERED_CLASS_NO_CTORS(classname, supername) \
public: \
typedef supername inherited; \
static const GiNaC::tinfo_static_t tinfo_static; \
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(); } \
\
classname(const GiNaC::archive_node &n, GiNaC::lst &sym_lst); \
virtual void archive(GiNaC::archive_node &n) const; \
static GiNaC::ex unarchive(const GiNaC::archive_node &n, GiNaC::lst &sym_lst); \
\
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 & vis) const \
{ \
if (visitor *p = dynamic_cast<visitor *>(&vis)) \
p->visit(*this); \
else \
inherited::accept(vis); \
} \
protected: \
virtual int compare_same_type(const GiNaC::basic & other) const; \
private:
/** Macro for inclusion in the implementation of each registered class. */
#define GINAC_IMPLEMENT_REGISTERED_CLASS(classname, supername) \
GiNaC::registered_class_info classname::reg_info = GiNaC::registered_class_info(GiNaC::registered_class_options(#classname, #supername, &classname::tinfo_static, &classname::unarchive)); \
const GiNaC::tinfo_static_t classname::tinfo_static = {};
/** Macro for inclusion in the implementation of each registered class.
* Additional options can be specified. */
#define GINAC_IMPLEMENT_REGISTERED_CLASS_OPT(classname, supername, options) \
GiNaC::registered_class_info classname::reg_info = GiNaC::registered_class_info(GiNaC::registered_class_options(#classname, #supername, &classname::tinfo_static, &classname::unarchive).options); \
const GiNaC::tinfo_static_t classname::tinfo_static = {};
/** Macro for inclusion in the implementation of each registered class.
* Additional options can be specified. */
#define GINAC_IMPLEMENT_REGISTERED_CLASS_OPT_T(classname, supername, options) \
GiNaC::registered_class_info classname::reg_info = GiNaC::registered_class_info(GiNaC::registered_class_options(#classname, #supername, &classname::tinfo_static, &classname::unarchive).options); \
template<> const GiNaC::tinfo_static_t classname::tinfo_static = {};
/** Find type information key by class name. */
extern tinfo_t find_tinfo_key(const std::string &class_name);
/** Find unarchiving function by class name. */
extern unarch_func find_unarch_func(const std::string &class_name);
/** Add or replace a print method. */
template <class Alg, class Ctx, class T, class C>
extern void set_print_func(void f(const T &, const C & c, unsigned))
{
Alg::get_class_info_static().options.set_print_func(Ctx::get_class_info_static().options.get_id(), f);
}
/** Add or replace a print method. */
template <class Alg, class Ctx, class T, class C>
extern void set_print_func(void (T::*f)(const C &, unsigned))
{
Alg::get_class_info_static().options.set_print_func(Ctx::get_class_info_static().options.get_id(), f);
}
} // namespace GiNaC
#endif // ndef __GINAC_REGISTRAR_H__
|