#include <include/pyhrol_type_base.h>

Граф наследования:pyhrol::TypeBase< T >:
pyhrol::TypeIterable< T, I > pyhrol::TypeMap< T > pyhrol::TypeNumberCommon< T > pyhrol::TypeSequence< T > pyhrol::TypeSpecial< T > pyhrol::TypeWrapper< T, I > pyhrol::TypeWrapper< T > pyhrol::TypeNumber< T > pyhrol::TypeNumberAny< T > pyhrol::TypeSmart< T, E, C, I > PyTypeCommon< T >

Классы

struct  argObject
 
struct  call_constructor
 
struct  call_destructor
 
struct  call_print
 
struct  call_repr
 
struct  call_str
 
struct  T_struct
 

Открытые типы

typedef T endosome_t
 

Открытые члены

const char * name () const
 
 operator PyTypeObject & ()
 
 operator const PyTypeObject & () const
 
const PyTypeObject * operator-> () const
 
T_structallocate ()
 
void free (T_struct *) const throw ()
 
virtual ~TypeBase ()
 

Открытые статические члены

static T_structallocate_static ()
 
static void free_static (T_struct *) throw ()
 

Открытые атрибуты

const size_t id
 

Статические открытые данные

static const size_t endosome_offset = offsetof(struct TypeBase<T>::T_struct, endosome)
 

Защищенные члены

 TypeBase (const char *, const char *=NULL)
 
 TypeBase ()
 
virtual const void * address (const T &) const =0
 
virtual void constructor (T &, Tuples &) const
 
virtual void destructor (T &) const =0
 
virtual void print (std::ostream &, const T &) const =0
 
virtual const std::string repr (const T &) const =0
 
virtual void str (std::ostream &, const T &) const =0
 
void m_add_method (const char *, const PyCFunction &, const char *, const int=0)
 
void m_add_method (const char *, const PyCFunctionWithKeywords &, const char *, const int=0)
 
void m_add_method (const char *, const PyNoArgsFunction &, const char *, const int=0)
 
void m_add_getseter (const char *, const getter &, const setter &, const char *)
 

Защищенные статические члены

static TypeBasem_get (TypeBase *=NULL)
 

Защищенные данные

PyTypeObject m_type_object
 

Закрытые типы

typedef std::vector< PyMethodDef > methods_t
 
typedef std::vector< PyGetSetDef > getseters_t
 

Закрытые члены

 TypeBase (const TypeBase &)
 
TypeBaseoperator= (const TypeBase &)
 
void m_init (const char *, const char *)
 

Закрытые статические члены

static PyObjectmediator_constructor (PyTypeObject *, PyObject *, PyObject *)
 
static void mediator_destructor (PyObject *self)
 
static int mediator_print (PyObject *self, FILE *fp, int)
 
static PyObjectmediator_repr (PyObject *self)
 
static PyObjectmediator_str (PyObject *self)
 

Закрытые данные

methods_t m_methods
 
getseters_t m_getseters
 

Подробное описание

template<class T>
class pyhrol::TypeBase< T >

См. определение в файле pyhrol_type_base.h строка 24

Определения типов

template<class T>
typedef T pyhrol::TypeBase< T >::endosome_t

См. определение в файле pyhrol_type_base.h строка 27

template<class T>
typedef std::vector<PyGetSetDef> pyhrol::TypeBase< T >::getseters_t
private

См. определение в файле pyhrol_type_base.h строка 171

template<class T>
typedef std::vector<PyMethodDef> pyhrol::TypeBase< T >::methods_t
private

См. определение в файле pyhrol_type_base.h строка 170

Конструктор(ы)

template<class T >
pyhrol::TypeBase< T >::~TypeBase ( )
virtual

См. определение в файле pyhrol_type_base.hpp строка 49

50 {
51  PYHROL_TRACE(pyhrol::tpInternal, this, __PRETTY_FUNCTION__);
52 
53  for (methods_t::const_iterator iter = m_methods.begin(); iter != m_methods.end(); iter ++)
54  {
55  if (iter->ml_doc)
56  {
57  delete TupleDescriber::from_string(iter->ml_doc);
58  }
59  }
60  for (getseters_t::const_iterator iter = m_getseters.begin(); iter != m_getseters.end(); iter ++)
61  {
62  if (iter->doc)
63  {
64  delete TupleDescriber::from_string(iter->doc);
65  }
66  }
68  if (m_type_object.tp_doc)
69  {
71  }
72 
73  unregister_type(id);
74 }
PyTypeObject m_type_object
static SelfAddressedCstring * construct(const char *data)
#define PYHROL_TRACE(part, address, signature)
Definition: pyhrol_trace.h:51
void unregister_type(size_t)
getseters_t m_getseters
static TupleDescriber * from_string(const char *)
template<class T >
pyhrol::TypeBase< T >::TypeBase ( const char *  name,
const char *  doc = NULL 
)
protected

См. определение в файле pyhrol_type_base.hpp строка 35

37 {
38  PYHROL_TRACE(pyhrol::tpInternal, this, __PRETTY_FUNCTION__);
39 
40  m_init(name, doc);
41 }
PyTypeObject m_type_object
const size_t register_type(PyTypeObject &type)
const char * name() const
#define PYHROL_TRACE(part, address, signature)
Definition: pyhrol_trace.h:51
void m_init(const char *, const char *)
template<class T >
pyhrol::TypeBase< T >::TypeBase ( )
protected

См. определение в файле pyhrol_type_base.hpp строка 43

44  : id (-1)
45 {
46  throw std::logic_error("Default constructor for \"TypeBase<" + demangle(typeid(T)) + ">\" should never called");
47 }
const std::string demangle(const std::type_info &ti)
template<class T>
pyhrol::TypeBase< T >::TypeBase ( const TypeBase< T > &  )
private

Методы

template<class T >
TypeBase< T >::T_struct * pyhrol::TypeBase< T >::allocate ( )

См. определение в файле pyhrol_type_base.hpp строка 213

214 {
215  T_struct *pstruct = PyObject_New(T_struct, &m_type_object);
216 
217  if (!pstruct)
218  {
219  throw std::bad_alloc();
220  }
221 
222  PYHROL_TRACE(pyhrol::tpInternal, address(pstruct->endosome), __PRETTY_FUNCTION__);
223 
224  return pstruct;
225 }
PyTypeObject m_type_object
#define PYHROL_TRACE(part, address, signature)
Definition: pyhrol_trace.h:51
virtual const void * address(const T &) const =0
template<class T >
TypeBase< T >::T_struct * pyhrol::TypeBase< T >::allocate_static ( )
static

См. определение в файле pyhrol_type_base.hpp строка 237

238 {
239  TypeBase &type = m_get();
240  T_struct *pstruct = PyObject_New(T_struct, &type.m_type_object);
241 
242  if (!pstruct)
243  {
244  throw std::bad_alloc();
245  }
246 
247  PYHROL_TRACE(pyhrol::tpInternal, type.address(pstruct->endosome), __PRETTY_FUNCTION__);
248 
249  return pstruct;
250 }
#define PYHROL_TRACE(part, address, signature)
Definition: pyhrol_trace.h:51
static TypeBase & m_get(TypeBase *=NULL)
template<class T>
void pyhrol::TypeBase< T >::constructor ( T &  ,
Tuples _args 
) const
protectedvirtual

Переопределяется в PyTypeAny, PyType, Iterator, pyhrol::Methods, PyType, pyhrol::Functions, pyhrol::Types, pyhrol::Modules, PyType, Container, PyType, PyType, PyType, PyType, PyType, PyTypeString, PyType, PyType, PyType, PyType, PyType, PyType, PyType, PyTypeCommon< T >, PyType, PyType и PyType.

См. определение в файле pyhrol_type_base.hpp строка 96

97 {
100 
101  throw ImplementationException(ImplementationException::cpntConstructor);
102 
104 }
#define PYHROL_AFTER_BUILD_VALUE(container)
Definition: pyhrol_macro.h:18
#define PYHROL_AFTER_EXECUTE_DEFAULT(container)
Definition: pyhrol_macro.h:26
#define PYHROL_AFTER_PARSE_TUPLE(container)
Definition: pyhrol_macro.h:9
template<class T >
void pyhrol::TypeBase< T >::free ( T_struct pstruct) const
throw (
)

См. определение в файле pyhrol_type_base.hpp строка 227

228 {
229  if (pstruct)
230  {
231  PYHROL_TRACE(pyhrol::tpInternal, address(pstruct->endosome), __PRETTY_FUNCTION__);
232  PyObject *pobj = *pstruct;
233  pobj->ob_type->tp_free(pobj);
234  }
235 }
struct _object PyObject
#define PYHROL_TRACE(part, address, signature)
Definition: pyhrol_trace.h:51
virtual const void * address(const T &) const =0
template<class T >
void pyhrol::TypeBase< T >::free_static ( T_struct pstruct)
throw (
)
static

См. определение в файле pyhrol_type_base.hpp строка 252

253 {
254  if (pstruct)
255  {
256  PYHROL_TRACE(pyhrol::tpInternal, m_get().address(pstruct->endosome), __PRETTY_FUNCTION__);
257  PyObject *pobj = *pstruct;
258  pobj->ob_type->tp_free(pobj);
259  }
260 }
struct _object PyObject
#define PYHROL_TRACE(part, address, signature)
Definition: pyhrol_trace.h:51
static TypeBase & m_get(TypeBase *=NULL)
virtual const void * address(const T &) const =0
template<class T >
void pyhrol::TypeBase< T >::m_add_getseter ( const char *  name,
const getter &  _get,
const setter &  _set,
const char *  doc 
)
protected

См. определение в файле pyhrol_type_base.hpp строка 172

173 {
174  PyGetSetDef gsd;
175  gsd.name = const_cast<char *>(name);
176  gsd.get = _get;
177  gsd.set = _set;
178  gsd.doc = NULL;
179  if (doc)
180  {
181  TupleDescriber *pdescr = TupleDescriber::factory();
182  if (pdescr)
183  {
184  pdescr->help(doc);
185  gsd.doc = const_cast<char *>(pdescr->to_string());
186  }
187  }
188  gsd.closure = NULL;
189 
190  m_getseters.insert(-- m_getseters.end(), gsd);
191  m_type_object.tp_getset = &m_getseters[0];
192 }
PyTypeObject m_type_object
const char * name() const
static TupleDescriber * factory()
getseters_t m_getseters
template<class T >
void pyhrol::TypeBase< T >::m_add_method ( const char *  name,
const PyCFunction &  _method,
const char *  help,
const int  flags = 0 
)
protected

См. определение в файле pyhrol_type_base.hpp строка 106

107 {
108  PyMethodDef md;
109 
110  md.ml_name = name;
111  md.ml_meth = _method;
112  md.ml_flags = METH_VARARGS | flags;
113  md.ml_doc = NULL;
114  if (help)
115  {
116  TupleDescriber *pdescr = TupleDescriber::factory();
117  if (pdescr)
118  {
119  pdescr->help(help);
120  md.ml_doc = pdescr->to_string();
121  }
122  }
123 
124  m_methods.insert(-- m_methods.end(), md);
125  m_type_object.tp_methods = &m_methods[0];
126 }
PyTypeObject m_type_object
const char * name() const
static TupleDescriber * factory()
template<class T >
void pyhrol::TypeBase< T >::m_add_method ( const char *  name,
const PyCFunctionWithKeywords &  _method,
const char *  help,
const int  flags = 0 
)
protected

См. определение в файле pyhrol_type_base.hpp строка 128

129 {
130  PyMethodDef md;
131 
132  md.ml_name = name;
133  md.ml_meth = reinterpret_cast<PyCFunction>(_method);
134  md.ml_flags = METH_VARARGS | METH_KEYWORDS | flags;
135  md.ml_doc = NULL;
136  if (help)
137  {
138  TupleDescriber *pdescr = TupleDescriber::factory();
139  if (pdescr)
140  {
141  pdescr->help(help);
142  md.ml_doc = pdescr->to_string();
143  }
144  }
145 
146  m_methods.insert(-- m_methods.end(), md);
147  m_type_object.tp_methods = &m_methods[0];
148 }
PyTypeObject m_type_object
const char * name() const
static TupleDescriber * factory()
template<class T >
void pyhrol::TypeBase< T >::m_add_method ( const char *  name,
const PyNoArgsFunction &  _method,
const char *  help,
const int  flags = 0 
)
protected

См. определение в файле pyhrol_type_base.hpp строка 150

151 {
152  PyMethodDef md;
153 
154  md.ml_name = name;
155  md.ml_meth = reinterpret_cast<PyCFunction>(_method);
156  md.ml_flags = METH_NOARGS | flags;
157  md.ml_doc = NULL;
158  if (help)
159  {
160  TupleDescriber *pdescr = TupleDescriber::factory();
161  if (pdescr)
162  {
163  pdescr->help(help);
164  md.ml_doc = pdescr->to_string();
165  }
166  }
167 
168  m_methods.insert(-- m_methods.end(), md);
169  m_type_object.tp_methods = &m_methods[0];
170 }
PyTypeObject m_type_object
const char * name() const
static TupleDescriber * factory()
template<class T >
TypeBase< T > & pyhrol::TypeBase< T >::m_get ( TypeBase< T > *  arg = NULL)
staticprotected

См. определение в файле pyhrol_type_base.hpp строка 194

195 {
196  static std::auto_ptr<TypeBase<T> > t;
197  if (arg)
198  {
199  if (t.get())
200  {
201  throw TypeInitException(t.get()->m_type_object.tp_name);
202  }
203  t.reset(arg);
204  }
205  TypeBase<T> *retval = t.get();
206  if (!retval)
207  {
208  throw TypeInitException(typeid(T));
209  }
210  return *retval;
211 }
template<class T >
void pyhrol::TypeBase< T >::m_init ( const char *  name,
const char *  doc 
)
private

См. определение в файле pyhrol_type_base.hpp строка 262

263 {
264  bzero(&m_type_object, sizeof(m_type_object));
265  PyTypeObject _t_template = {PyObject_HEAD_INIT(NULL)};
266  memcpy(&m_type_object, &_t_template, sizeof(PyVarObject));
267 
269  const size_t len_name = strlen(name);
270  char *ptr = pstr->allocate(len_name + 1);
271  memcpy(ptr, name, len_name + 1);
272 
273  /* NOTE
274  Pointer to PyTypeObject::tp_name points to SelfAddressedCstring member
275  This fact used by:
276  -- Container while prepending module name (m_qualify_types_with_module_name)
277  -- destructor of this object (~TypeBase)
278  */
279  pstr->get(m_type_object.tp_name);
280  m_type_object.tp_basicsize = sizeof(T_struct);
281  m_type_object.tp_dealloc = mediator_destructor;
282  m_type_object.tp_print = mediator_print;
283  m_type_object.tp_repr = mediator_repr;
284  m_type_object.tp_str = mediator_str;
285  m_type_object.tp_flags = Py_TPFLAGS_DEFAULT;
286  if (doc)
287  {
288  TupleDescriber *pdescr = TupleDescriber::factory();
289  if (pdescr)
290  {
291  pdescr->help(doc);
292  m_type_object.tp_doc = pdescr->to_string();
293  }
294  }
296 
297  PyMethodDef md_sentinel;
298  PyGetSetDef gs_sentinel;
299 
300  bzero(&md_sentinel, sizeof(PyMethodDef));
301  bzero(&gs_sentinel, sizeof(PyGetSetDef));
302  m_methods.push_back(md_sentinel);
303  m_getseters.push_back(gs_sentinel);
304 }
PyTypeObject m_type_object
char * allocate(const size_t)
const char * get() const
static PyObject * mediator_repr(PyObject *self)
const char * name() const
static PyObject * mediator_str(PyObject *self)
static TupleDescriber * factory()
getseters_t m_getseters
static void mediator_destructor(PyObject *self)
static PyObject * mediator_constructor(PyTypeObject *, PyObject *, PyObject *)
static int mediator_print(PyObject *self, FILE *fp, int)
template<class T >
PyObject * pyhrol::TypeBase< T >::mediator_constructor ( PyTypeObject *  type,
PyObject args,
PyObject kwds 
)
staticprivate

См. определение в файле pyhrol_type_base.hpp строка 307

308 {
309  static std::auto_ptr<TuplesData> data(TuplesData::factory(v_ctor, reinterpret_cast<size_t>(mediator_constructor)));
310  std::auto_ptr<Tuples> tuples(Tuples::factory(*data));
311  call_constructor c(*tuples, type, __PRETTY_FUNCTION__, !type);
312  tuples->ubiquitous_caller(c, args, kwds, !type);
313  return clear_on_error(c.retval);
314 }
PyObject * clear_on_error(PyObject *)
TuplesData & data(const size_t address)
Definition: pyhrol_type.hpp:26
static PyObject * mediator_constructor(PyTypeObject *, PyObject *, PyObject *)
static TuplesData * factory(const callVariants cv, const size_t)
static Tuples * factory(TuplesData &)
template<class T >
void pyhrol::TypeBase< T >::mediator_destructor ( PyObject self)
staticprivate

См. определение в файле pyhrol_type_base.hpp строка 425

426 {
427  call_destructor cd(self, __PRETTY_FUNCTION__);
428  exceptionHandler::call(cd, reinterpret_cast<size_t>(mediator_destructor));
429 }
virtual void call()=0
static void mediator_destructor(PyObject *self)
template<class T >
int pyhrol::TypeBase< T >::mediator_print ( PyObject self,
FILE *  fp,
int   
)
staticprivate

См. определение в файле pyhrol_type_base.hpp строка 431

432 {
433  call_print cp(self, fp, __PRETTY_FUNCTION__);
434  exceptionHandler::call(cp, reinterpret_cast<size_t>(mediator_print));
435  return cp.retval;
436 }
virtual void call()=0
static int mediator_print(PyObject *self, FILE *fp, int)
template<class T >
PyObject * pyhrol::TypeBase< T >::mediator_repr ( PyObject self)
staticprivate

См. определение в файле pyhrol_type_base.hpp строка 438

439 {
440  call_repr cr(self, __PRETTY_FUNCTION__);
441  exceptionHandler::call(cr, reinterpret_cast<size_t>(mediator_repr));
442  return cr.retval;
443 }
virtual void call()=0
static PyObject * mediator_repr(PyObject *self)
template<class T >
PyObject * pyhrol::TypeBase< T >::mediator_str ( PyObject self)
staticprivate

См. определение в файле pyhrol_type_base.hpp строка 445

446 {
447  call_str cs(self, __PRETTY_FUNCTION__);
448  exceptionHandler::call(cs, reinterpret_cast<size_t>(mediator_str));
449  return cs.retval;
450 }
virtual void call()=0
static PyObject * mediator_str(PyObject *self)
template<class T >
const char * pyhrol::TypeBase< T >::name ( ) const

См. определение в файле pyhrol_type_base.hpp строка 76

77 {
78  return m_type_object.tp_name;
79 }
PyTypeObject m_type_object
template<class T >
pyhrol::TypeBase< T >::operator const PyTypeObject & ( ) const

См. определение в файле pyhrol_type_base.hpp строка 86

87 {
88  return m_type_object;
89 }
PyTypeObject m_type_object
template<class T >
pyhrol::TypeBase< T >::operator PyTypeObject & ( )

См. определение в файле pyhrol_type_base.hpp строка 81

82 {
83  return m_type_object;
84 }
PyTypeObject m_type_object
template<class T >
const PyTypeObject * pyhrol::TypeBase< T >::operator-> ( ) const

См. определение в файле pyhrol_type_base.hpp строка 91

92 {
93  return &m_type_object;
94 }
PyTypeObject m_type_object
template<class T>
TypeBase& pyhrol::TypeBase< T >::operator= ( const TypeBase< T > &  )
private

Данные класса

template<class T>
const size_t pyhrol::TypeBase< T >::endosome_offset = offsetof(struct TypeBase<T>::T_struct, endosome)
static

См. определение в файле pyhrol_type_base.h строка 76

template<class T>
const size_t pyhrol::TypeBase< T >::id

См. определение в файле pyhrol_type_base.h строка 75

template<class T>
getseters_t pyhrol::TypeBase< T >::m_getseters
private

См. определение в файле pyhrol_type_base.h строка 174

template<class T>
methods_t pyhrol::TypeBase< T >::m_methods
private

См. определение в файле pyhrol_type_base.h строка 173

template<class T>
PyTypeObject pyhrol::TypeBase< T >::m_type_object
protected

См. определение в файле pyhrol_type_base.h строка 96


Объявления и описания членов классов находятся в файлах: