13 #ifndef _MOOSEMODULE_H
14 #define _MOOSEMODULE_H
45 #define O32_HOST_ORDER (o32_host_order.value)
47 #if PY_MAJOR_VERSION >= 3
49 PyMODINIT_FUNC PyInit_moose();
52 #define PyInt_Check PyLong_Check
53 #define PyInt_AsLong PyLong_AsLong
54 #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask
55 #define PyInt_FromLong PyLong_FromLong
57 #define PyString_Check PyUnicode_Check
58 #define PyString_FromString PyUnicode_FromString
59 #define PyString_FromFormat PyUnicode_FromFormat
60 #define PyString_AsString(str) \
61 PyBytes_AS_STRING(PyUnicode_AsEncodedString(str, "utf-8", "Error~"))
63 #define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
67 #define GETSTATE(m) (&_state)
68 #endif // if PY_MAJOR_VERSION
71 #define RAISE_INVALID_ID(ret, msg) { \
72 PyErr_SetString(PyExc_ValueError, msg": invalid Id"); \
76 #define RAISE_TYPE_ERROR(ret, type) { \
77 PyErr_SetString(PyExc_TypeError, "require " #type); \
95 #define Id_Check(v) (Py_TYPE(v) == &IdType)
96 #define Id_SubtypeCheck(v) (PyType_IsSubtype(Py_TYPE(v),&IdType))
97 #define ObjId_Check(v) (Py_TYPE(v) == &ObjIdType)
98 #define ObjId_SubtypeCheck(v) (PyType_IsSubtype(Py_TYPE(v), &ObjIdType))
99 #define LookupField_Check(v) (Py_TYPE(v) == &moose_LookupField)
100 #define ElementField_Check(v) (Py_TYPE(v) == &moose_ElementField)
101 #define ElementField_SubtypeCheck(v) (PyType_IsSubtype(Py_TYPE(v), &moose_ElementField))
105 #define SHELLPTR (reinterpret_cast<Shell*>(getShell(0, NULL).eref().data()))
241 PyObject *
moose_copy(PyObject *
dummy, PyObject * args, PyObject * kwargs);
268 PyObject *
setDestFinfo(
ObjId obj,
string fieldName, PyObject *arg,
string argType);
269 PyObject *
setDestFinfo2(
ObjId obj,
string fieldName, PyObject * arg1,
char type1, PyObject * arg2,
char type2);
275 string getFieldType(
string className,
string fieldName);
278 int parseFinfoType(
string className,
string finfoType,
string fieldName, vector<string> & typeVec);
279 vector<string>
getFieldNames(
string className,
string finfoType);
286 void *
to_cpp(PyObject *
object,
char typecode);
291 PyObject *
to_py(
void * obj,
char typecode);
295 PyObject *
to_pytuple(
void * obj,
char typecode);
308 template <
typename T>
311 Py_ssize_t length = PySequence_Length(seq);
312 vector <T> * ret =
new vector<T>((
unsigned int)length);
314 for (
unsigned int ii = 0; ii < length; ++ii)
316 PyObject * item = PySequence_GetItem(seq, ii);
320 error <<
"Item # " << ii <<
"is NULL";
321 PyErr_SetString(PyExc_ValueError, error.str().c_str());
325 value = (T*)
to_cpp(item, typecode);
330 error <<
"Cannot handle sequence of type " << Py_TYPE(item)->tp_name;
331 PyErr_SetString(PyExc_TypeError, error.str().c_str());
335 ret->at(ii) = *
value;
341 template <
typename T>
344 Py_ssize_t outerLength = PySequence_Length(seq);
345 vector < vector <T> > * ret =
new vector < vector < T > >((
unsigned int) outerLength);
346 for (
unsigned int ii = 0; ii < outerLength; ++ii)
348 PyObject * innerSeq = PySequence_GetItem(seq, ii);
349 if (innerSeq == NULL)
352 error <<
"PySequenceToVectorOfVectors: error converting inner sequence " << ii;
353 PyErr_SetString(PyExc_ValueError, error.str().c_str());
357 vector< T > * inner = PySequenceToVector< T >(innerSeq, typecode);
364 ret->at(ii).assign(inner->begin(), inner->end());
370 template <
typename KeyType,
typename ValueType>
377 template <
typename KeyType,
typename ValueType>
381 PyObject * v =
to_py(&value, vtypecode);
385 template <
class KeyType> PyObject *
388 char value_type_code,
392 PyObject * ret = NULL;
393 KeyType * cpp_key = (KeyType *)
to_cpp(key, key_type_code);
402 switch (value_type_code)
405 ret = get_simple_lookupfield< KeyType, double>(oid, fname, *cpp_key, value_type_code);
408 ret = get_vec_lookupfield<KeyType, double>(oid, fname, *cpp_key, value_type_code);
411 ret = get_vec_lookupfield<KeyType, string>(oid, fname, *cpp_key, value_type_code);
414 ret = get_simple_lookupfield < KeyType, int >(oid, fname, *cpp_key, value_type_code);
417 ret = get_simple_lookupfield < KeyType, unsigned int >(oid, fname, *cpp_key, value_type_code);
420 ret = get_simple_lookupfield< KeyType, ObjId >(oid, fname, *cpp_key, value_type_code);
423 ret = get_simple_lookupfield<KeyType, Id>(oid, fname, *cpp_key, value_type_code);
426 ret = get_simple_lookupfield< KeyType, long >(oid, fname, *cpp_key, value_type_code);
429 ret = get_simple_lookupfield< KeyType, unsigned long >(oid, fname, *cpp_key, value_type_code);
432 ret = get_simple_lookupfield< KeyType, float >(oid, fname, *cpp_key, value_type_code);
435 ret = get_simple_lookupfield < KeyType, bool >(oid, fname, *cpp_key, value_type_code);
438 ret = get_simple_lookupfield < KeyType, char >(oid, fname, *cpp_key, value_type_code);
441 ret = get_simple_lookupfield < KeyType, short >(oid, fname, *cpp_key, value_type_code);
444 ret = get_simple_lookupfield< KeyType, unsigned short >(oid, fname, *cpp_key, value_type_code);
446 #ifdef HAVE_LONG_LONG
448 ret = get_simple_lookupfield< KeyType, long long>(oid, fname, *cpp_key, value_type_code);
451 ret = get_simple_lookupfield< KeyType, unsigned long long>(oid, fname, *cpp_key, value_type_code);
455 ret = get_vec_lookupfield<KeyType, Id>(oid, fname, *cpp_key, value_type_code);
458 ret = get_vec_lookupfield<KeyType, ObjId>(oid, fname, *cpp_key, value_type_code);
461 ret = get_vec_lookupfield<KeyType, int>(oid, fname, *cpp_key, value_type_code);
464 ret = get_vec_lookupfield<KeyType, short>(oid, fname, *cpp_key, value_type_code);
467 ret = get_vec_lookupfield<KeyType, long>(oid, fname, *cpp_key, value_type_code);
470 ret = get_vec_lookupfield<KeyType, unsigned int>(oid, fname, *cpp_key, value_type_code);
473 ret = get_vec_lookupfield<KeyType, unsigned long>(oid, fname, *cpp_key, value_type_code);
476 ret = get_vec_lookupfield<KeyType, float>(oid, fname, *cpp_key, value_type_code);
479 PyErr_SetString(PyExc_TypeError,
"invalid value type");
485 template <
class KeyType>
486 int set_lookup_value(
const ObjId& oid,
string fname,
char value_type_code,
char key_type_code, PyObject * key, PyObject * value_obj)
488 bool success =
false;
489 KeyType *cpp_key = (KeyType*)
to_cpp(key, key_type_code);
494 #define SET_LOOKUP_VALUE( TYPE ) \
496 TYPE * value = (TYPE*)to_cpp(value_obj, value_type_code); \
498 success = LookupField < KeyType, TYPE > ::set(oid, fname, *cpp_key, *value); \
505 switch (value_type_code)
523 #ifdef HAVE_LONG_LONG
563 err <<
"Value type " << value_type_code <<
" not supported yet.";
564 PyErr_SetString(PyExc_TypeError, err.str().c_str());
581 if (!PySequence_Check(value))
583 PyErr_SetString(PyExc_TypeError,
"For setting vector field, specified value must be a sequence." );
586 vector<A> * _value = (vector < A > *)
to_cpp(value, vtypecode);
611 error <<
"moose.setDestFinfo1: ";
617 double param = PyFloat_AsDouble(arg1);
630 char * param = PyString_AsString(arg1);
637 long param = PyInt_AsLong(arg1);
638 if (param == -1 && PyErr_Occurred())
655 unsigned long param =PyLong_AsUnsignedLong(arg1);
656 if (PyErr_Occurred())
677 error <<
"argument should be an vec or an melement";
678 PyErr_SetString(PyExc_TypeError, error.str().c_str());
709 error <<
"argument should be an vec or an melement";
710 PyErr_SetString(PyExc_TypeError, error.str().c_str());
720 char * param = PyString_AsString(arg1);
723 error <<
"expected argument of type char/string";
724 PyErr_SetString(PyExc_TypeError, error.str().c_str());
727 else if (strlen(param) == 0)
729 error <<
"Empty string not allowed.";
730 PyErr_SetString(PyExc_ValueError, error.str().c_str());
737 error <<
"Unhandled argument 1 type (shortType=" << type1 <<
")";
738 PyErr_SetString(PyExc_TypeError, error.str().c_str());
754 #endif // _MOOSEMODULE_H
PyObject * get_vec_lookupfield(ObjId oid, string fieldname, KeyType key, char vtypecode)
PyObject * deleteObjId(ObjId obj)
int defineElementFinfos(const Cinfo *cinfo)
PyObject * moose_Id_str(_Id *self)
int defineDestFinfos(const Cinfo *cinfo)
PyObject * moose_ObjId_get_elementField_attr(PyObject *self, void *closure)
PyObject * moose_ObjId_setDestField(_ObjId *self, PyObject *args)
PyObject * moose_Id_richCompare(_Id *self, PyObject *args, int op)
PyObject * moose_ObjId_setLookupField(_ObjId *self, PyObject *args)
int setLookupField(ObjId oid, char *fieldName, PyObject *key, PyObject *value)
PyObject * _set_vector_destFinfo(ObjId obj, string fieldName, PyObject *value, char vtypecode)
PyObject * moose_syncDataHandler(PyObject *dummy, PyObject *target)
PyObject * moose_start(PyObject *dummy, PyObject *args)
PyObject * moose_ObjId_connect(_ObjId *self, PyObject *args)
long moose_Field_hash(_Field *self)
Return the hash of the string {objectpath}.{fieldName}
static double op(double x)
PyObject * moose_Id_getValue(_Id *self)
PyObject * oid_to_element(ObjId oid)
PyObject * moose_ElementField_getName(_Field *self, void *closure)
static A get(const ObjId &dest, const string &field, L index)
int set_lookup_value(const ObjId &oid, string fname, char value_type_code, char key_type_code, PyObject *key, PyObject *value_obj)
int moose_Id_init(_Id *self, PyObject *args, PyObject *kwargs)
int moose_Field_init(_Field *self, PyObject *args, PyObject *kwds)
PyObject * moose_delete(PyObject *dummy, PyObject *args)
PyObject * moose_seed(PyObject *dummy, PyObject *args)
PyObject * moose_Id_getattro(_Id *self, PyObject *attr)
PyObject * moose_ObjId_getSlice(_ObjId *self, Py_ssize_t start, Py_ssize_t end)
PyObject * moose_ObjId_setField(_ObjId *self, PyObject *args)
vector< string > getFieldNames(string className, string finfoType)
static DestFinfo dummy("dummy","This Finfo is a dummy. If you are reading this you have used an invalid index", 0)
PyObject * moose_ObjId_getId(_ObjId *self)
PyObject * moose_Id_getSlice(_Id *self, Py_ssize_t start, Py_ssize_t end)
PyObject * moose_ElementField_getPath(_Field *self, void *closure)
const char ** getFinfoTypes()
finalize()
int moose_ElementField_setNum(_Field *self, PyObject *num, void *closure)
vector< T > * PySequenceToVector(PyObject *seq, char typecode)
PyObject * setDestFinfo2(ObjId obj, string fieldName, PyObject *arg1, char type1, PyObject *arg2, char type2)
PyObject * moose_Id_getItem(_Id *self, Py_ssize_t index)
vector< vector< T > > * PySequenceToVectorOfVectors(PyObject *seq, char typecode)
const map< string, string > & get_field_alias()
PyObject * moose_move(PyObject *dummy, PyObject *args)
int moose_ObjId_init(_ObjId *self, PyObject *args, PyObject *kwargs)
PyObject * moose_ObjId_getFieldNames(_ObjId *self, PyObject *args)
PyObject * moose_ObjId_getattro(_ObjId *self, PyObject *attr)
PyObject * moose_LookupField_getItem(_Field *self, PyObject *key)
PyObject * moose_ElementField_getOwner(_Field *self, void *closure)
PyObject * moose_ObjId_getDataIndex(_ObjId *self)
PyObject * setDestFinfo1(ObjId obj, string fieldName, PyObject *arg1, char type1, A arg2)
int moose_ElementField_setattro(_Field *self, PyObject *attr, PyObject *value)
int get_npy_typenum(const type_info &ctype)
PyObject * moose_Field_repr(_Field *self)
String representation of fields is {objectpath}.{fieldName}
PyMODINIT_FUNC init_moose()
int parseFinfoType(string className, string finfoType, string fieldName, vector< string > &typeVec)
Py_ssize_t moose_ObjId_getLength(_ObjId *self)
PyObject * moose_loadModel(PyObject *dummy, PyObject *args)
PyObject * moose_isRunning(PyObject *dummy, PyObject *args)
void * to_cpp(PyObject *object, char typecode)
PyObject * moose_ObjId_richcompare(_ObjId *self, PyObject *args, int op)
int defineAllClasses(PyObject *module_dict)
PyObject * moose_setClock(PyObject *dummy, PyObject *args)
PyObject * moose_ObjId_get_destField_attr(PyObject *self, void *closure)
PyObject * setDestFinfo(ObjId obj, string fieldName, PyObject *arg, string argType)
PyObject * moose_ElementField_getattro(_Field *self, PyObject *attr)
Id getShell(int argc, char **argv)
setup_runtime_env()
Py_ssize_t moose_Id_getLength(_Id *self)
long moose_Id_hash(_Id *self)
PyObject * moose_Id_repr(_Id *self)
int moose_Id_setattro(_Id *self, PyObject *attr, PyObject *value)
PyObject * moose_Id_getPath(_Id *self)
PyObject * moose_ElementField_getDataId(_Field *self, void *closure)
PyObject * moose_ObjId_getField(_ObjId *self, PyObject *args)
PyObject * moose_ObjId_getFieldType(_ObjId *self, PyObject *args)
PyObject * moose_getField(PyObject *dummy, PyObject *args)
PyObject * get_simple_lookupfield(ObjId oid, string fieldname, KeyType key, char vtypecode)
Id create_Id_from_path(string path, unsigned int numData, unsigned int isGlobal, string type)
int moose_ElementField_init(_Field *self, PyObject *args, PyObject *kwargs)
PyObject * moose_ElementField_getItem(_Field *self, Py_ssize_t index)
void moose_Field_dealloc(_Field *self)
int moose_LookupField_setItem(_Field *self, PyObject *key, PyObject *value)
map< string, vector< PyGetSetDef > > & get_getsetdefs()
PyTypeObject * getBaseClass(PyObject *self)
PyObject * moose_ObjId_getFieldIndex(_ObjId *self)
PyObject_HEAD char * name
PyObject * moose_ObjId_get_lookupField_attr(PyObject *self, void *closure)
PyObject * moose_ElementField_getNum(_Field *self, void *closure)
PyObject * moose_reinit(PyObject *dummy, PyObject *args)
int defineClass(PyObject *module_dict, const Cinfo *cinfo)
long moose_ObjId_hash(_ObjId *self)
PyObject * moose_getFieldDict(PyObject *dummy, PyObject *args)
PyObject * moose_Id_delete(_Id *self)
PyObject * moose_wildcardFind(PyObject *dummy, PyObject *args)
PyObject * to_pytuple(void *obj, char typecode)
PyObject * convert_and_set_tuple_entry(PyObject *tuple, unsigned int index, void *vptr, char typecode)
PyObject * moose_stop(PyObject *dummy, PyObject *args)
map< string, PyTypeObject * > & get_moose_classes()
PyObject * moose_copy(PyObject *dummy, PyObject *args, PyObject *kwargs)
PyObject * moose_setCwe(PyObject *dummy, PyObject *args)
vector< int > pysequence_to_dimvec(PyObject *dims)
PyObject * moose_exists(PyObject *dummy, PyObject *args)
const union @1 o32_host_order
PyObject * moose_Id_getShape(_Id *self)
PyObject * moose_getCwe(PyObject *dummy, PyObject *args)
PyObject * moose_Id_subscript(_Id *self, PyObject *op)
int moose_Id_contains(_Id *self, PyObject *args)
#define SET_LOOKUP_VALUE(TYPE)
PyObject * lookup_value(const ObjId &oid, string fname, char value_type_code, char key_type_code, PyObject *key)
PyObject * moose_ObjId_getLookupField(_ObjId *self, PyObject *args)
int defineLookupFinfos(const Cinfo *cinfo)
int moose_ObjId_setattro(_ObjId *self, PyObject *attr, PyObject *value)
PyObject * to_py(void *obj, char typecode)
PyObject * moose_ElementField_getId(_Field *self, void *closure)
PyObject * moose_ObjId_getItem(_ObjId *self, Py_ssize_t index)
PyObject * moose_ElementField_getSlice(_Field *self, Py_ssize_t start, Py_ssize_t end)
PyObject * getLookupField(ObjId oid, char *fieldName, PyObject *key)
string getFieldType(string className, string fieldName)
PyObject * moose_element(PyObject *dummy, PyObject *args)
PyObject * moose_Id_setField(_Id *self, PyObject *args)
PyObject * moose_connect(PyObject *dummy, PyObject *args)
Py_ssize_t moose_ElementField_getLen(_Field *self, void *closure)
PyObject * moose_useClock(PyObject *dummy, PyObject *args)
PyObject * moose_quit(PyObject *dummy)
PyObject * getObjIdAttr(_ObjId *oid, string attribute)
PyObject * moose_ObjId_repr(_ObjId *self)
static struct module_state _state
static bool set(const ObjId &dest, const string &field, A1 arg1, A2 arg2)
PyObject * moose_ObjId_getNeighbors(_ObjId *self, PyObject *args)