MOOSE - Multiscale Object Oriented Simulation Environment
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
moosemodule.h
Go to the documentation of this file.
1 // moosemodule.h ---
2 //
3 // Filename: moosemodule.h
4 // Description:
5 // Author: Subhasis Ray
6 // Maintainer: Dilawar Singh
7 // Copyright (C) 2010 Subhasis Ray, all rights reserved.
8 // Created: Thu Mar 10 17:11:06 2011 (+0530)
9 // Last-Updated: Mon 25 Apr 2016 11:09:02 AM IST
10 // By: Dilawar
11 // URL:
12 
13 #ifndef _MOOSEMODULE_H
14 #define _MOOSEMODULE_H
15 
16 #include <string>
17 
18 extern char shortType(string);
19 
20 // declared in utility.h, defined in utility/types.cpp
21 extern char innerType(char);
22 
23 // This had to be defined for py3k, but does not harm 2.
25 {
26  PyObject *error;
27 };
28 
29 
30 // The endianness check is from:
31 // http://stackoverflow.com/questions/2100331/c-macro-definition-to-determine-big-endian-or-little-endian-machine
32 enum
33 {
34  O32_LITTLE_ENDIAN = 0x03020100ul,
35  O32_BIG_ENDIAN = 0x00010203ul,
36  O32_PDP_ENDIAN = 0x01000302ul
37 };
38 
39 const union
40 {
41  unsigned char bytes[4];
42  uint32_t value;
43 } o32_host_order = { { 0, 1, 2, 3 } };
44 
45 #define O32_HOST_ORDER (o32_host_order.value)
46 
47 #if PY_MAJOR_VERSION >= 3
48 #define PY3K
49 PyMODINIT_FUNC PyInit_moose();
50 
51 // int has been replaced by long
52 #define PyInt_Check PyLong_Check
53 #define PyInt_AsLong PyLong_AsLong
54 #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask
55 #define PyInt_FromLong PyLong_FromLong
56 // string has been replaced by unicode
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~"))
62 // Python 3 does not like global module state
63 #define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
64 #else // Python 2
65 PyMODINIT_FUNC init_moose();
66 static struct module_state _state;
67 #define GETSTATE(m) (&_state)
68 #endif // if PY_MAJOR_VERSION
69 
70 /* Shortcut to raise an exception when a bad Id is encountered */
71 #define RAISE_INVALID_ID(ret, msg) { \
72  PyErr_SetString(PyExc_ValueError, msg": invalid Id"); \
73  return ret; \
74  } // RAISE_INVALID_ID
75 
76 #define RAISE_TYPE_ERROR(ret, type) { \
77  PyErr_SetString(PyExc_TypeError, "require " #type); \
78  return ret; \
79  }
80 
81 
82 // Minimum number of arguments for setting destFinfo - 1-st
83 // the finfo name.
84 #define minArgs 1
85 
86 // Arbitrarily setting maximum on variable argument list. Read:
87 // http://www.swig.org/Doc1.3/Varargs.html to understand why
88 #define maxArgs 10
89 
90 
92 // Python datatype checking macros
94 
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))
102 
103 
104 // Macro to create the Shell * out of shellId
105 #define SHELLPTR (reinterpret_cast<Shell*>(getShell(0, NULL).eref().data()))
106 
107 
111 typedef struct
112 {
113  PyObject_HEAD
115 } _Id;
130 typedef struct
131 {
132  PyObject_HEAD
134 } _ObjId;
135 
136 typedef struct
137 {
138  PyObject_HEAD
139  char * name;
141  ObjId myoid; // This is a placeholder for {Id, dataId} combo with fieldIndex=0, used only for fieldelements
142 } _Field;
144 // Methods for ElementField class
146 int moose_ElementField_init(_Field * self, PyObject * args, PyObject * kwargs);
147 int moose_ElementField_setNum(_Field * self, PyObject * num, void * closure);
148 PyObject* moose_ElementField_getNum(_Field * self, void * closure);
149 Py_ssize_t moose_ElementField_getLen(_Field * self, void * closure);
150 PyObject * moose_ElementField_getItem(_Field * self, Py_ssize_t index);
151 PyObject * moose_ElementField_getPath(_Field * self, void * closure);
152 PyObject * moose_ElementField_getId(_Field * self, void * closure);
153 PyObject * moose_ElementField_getName(_Field * self, void * closure);
154 PyObject * moose_ElementField_getOwner(_Field * self, void * closure);
155 PyObject * moose_ElementField_getDataId(_Field * self, void * closure);
156 PyObject * moose_ElementField_getSlice(_Field * self, Py_ssize_t start, Py_ssize_t end);
157 PyObject * moose_ElementField_getattro(_Field * self, PyObject * attr);
158 int moose_ElementField_setattro(_Field * self, PyObject * attr, PyObject * value);
159 /* PyObject * moose_ElementField_richcmp(_Field * self, void * closure); */
161 // Methods for Id class
163 int moose_Id_init(_Id * self, PyObject * args, PyObject * kwargs);
164 Id create_Id_from_path(string path, unsigned int numData, unsigned int isGlobal, string type); // inner function
165 long moose_Id_hash(_Id * self);
166 
167 PyObject * moose_Id_repr(_Id * self);
168 PyObject * moose_Id_str(_Id * self);
169 PyObject * deleteObjId(ObjId obj); // inner function
170 PyObject * moose_Id_delete(_Id * self);
171 PyObject * moose_Id_getValue(_Id * self);
172 PyObject * moose_Id_getPath(_Id * self);
173 /* Id functions to allow part of sequence protocol */
174 Py_ssize_t moose_Id_getLength(_Id * self);
175 PyObject * moose_Id_getItem(_Id * self, Py_ssize_t index);
176 #ifndef PY3K
177 PyObject * moose_Id_getSlice(_Id * self, Py_ssize_t start, Py_ssize_t end);
178 #endif
179 PyObject * moose_Id_getShape(_Id * self);
180 PyObject * moose_Id_subscript(_Id * self, PyObject * op);
181 PyObject * moose_Id_richCompare(_Id * self, PyObject * args, int op);
182 int moose_Id_contains(_Id * self, PyObject * args);
183 PyObject * moose_Id_getattro(_Id * self, PyObject * attr);
184 int moose_Id_setattro(_Id * self, PyObject * attr, PyObject * value);
185 PyObject * moose_Id_setField(_Id * self, PyObject *args);
187 // Methods for ObjId class
189 int moose_ObjId_init(_ObjId * self, PyObject * args, PyObject * kwargs);
190 long moose_ObjId_hash(_ObjId * self);
191 PyObject * moose_ObjId_repr(_ObjId * self);
192 PyObject * moose_ObjId_getattro(_ObjId * self, PyObject * attr);
193 PyObject * moose_ObjId_getField(_ObjId * self, PyObject * args);
194 int moose_ObjId_setattro(_ObjId * self, PyObject * attr, PyObject * value);
195 PyObject * moose_ObjId_setField(_ObjId * self, PyObject * args);
196 PyObject * moose_ObjId_getLookupField(_ObjId * self, PyObject * args);
197 PyObject * moose_ObjId_setLookupField(_ObjId * self, PyObject * args);
198 PyObject * moose_ObjId_setDestField(_ObjId * self, PyObject * args);
199 PyObject * moose_ObjId_getFieldNames(_ObjId * self, PyObject * args);
200 PyObject * moose_ObjId_getFieldType(_ObjId * self, PyObject * args);
201 PyObject * moose_ObjId_getDataIndex(_ObjId * self);
202 PyObject * moose_ObjId_getFieldIndex(_ObjId * self);
203 PyObject * moose_ObjId_getNeighbors(_ObjId * self, PyObject * args);
204 PyObject * moose_ObjId_getId(_ObjId * self);
205 PyObject * moose_ObjId_connect(_ObjId * self, PyObject * args);
206 PyObject * moose_ObjId_richcompare(_ObjId * self, PyObject * args, int op);
207 PyObject * moose_ObjId_getItem(_ObjId * self, Py_ssize_t index);
208 PyObject * moose_ObjId_getSlice(_ObjId * self, Py_ssize_t start, Py_ssize_t end);
209 Py_ssize_t moose_ObjId_getLength(_ObjId * self);
210 
212 // Methods for LookupField
214 int moose_Field_init(_Field * self, PyObject * args, PyObject * kwds);
215 void moose_Field_dealloc(_Field * self);
216 long moose_Field_hash(_Field * self);
217 PyObject * moose_Field_repr(_Field * self);
218 PyObject * moose_LookupField_getItem(_Field * self, PyObject * key);
219 int moose_LookupField_setItem(_Field * self, PyObject * key, PyObject * value);
220 
221 
223 // functions to be accessed from Python
225 
226 
227 // The following are global functions
228 PyObject * oid_to_element(ObjId oid);
229 PyObject * moose_element(PyObject * dummy, PyObject * args);
230 PyObject * moose_useClock(PyObject * dummy, PyObject * args);
231 PyObject * moose_setClock(PyObject * dummy, PyObject * args);
232 PyObject * moose_start(PyObject * dummy, PyObject * args);
233 PyObject * moose_reinit(PyObject * dummy, PyObject * args);
234 PyObject * moose_stop(PyObject * dummy, PyObject * args);
235 PyObject * moose_isRunning(PyObject * dummy, PyObject * args);
236 PyObject * moose_exists(PyObject * dummy, PyObject * args);
237 PyObject * moose_loadModel(PyObject * dummy, PyObject * args);
238 //PyObject * moose_saveModel(PyObject * dummy, PyObject * args);
239 PyObject * moose_setCwe(PyObject * dummy, PyObject * args);
240 PyObject * moose_getCwe(PyObject * dummy, PyObject * args);
241 PyObject * moose_copy(PyObject * dummy, PyObject * args, PyObject * kwargs);
242 PyObject * moose_move(PyObject * dummy, PyObject * args);
243 PyObject * moose_delete(PyObject * dummy, PyObject * args);
244 PyObject * moose_connect(PyObject * dummy, PyObject * args);
245 PyObject * moose_getFieldDict(PyObject * dummy, PyObject * args);
246 PyObject * moose_getField(PyObject * dummy, PyObject * args);
247 PyObject * moose_syncDataHandler(PyObject * dummy, PyObject * target);
248 PyObject * moose_seed(PyObject * dummy, PyObject * args);
249 PyObject * moose_wildcardFind(PyObject * dummy, PyObject * args);
250 // This should not be required or accessible to the user. Put here
251 // for debugging threading issue.
252 PyObject * moose_quit(PyObject * dummy);
253 
255 // These are internal functions and not exposed in Python
257 PyObject * getLookupField(ObjId oid, char * fieldName, PyObject * key);
258 int setLookupField(ObjId oid, char * fieldName, PyObject * key, PyObject * value);
259 int defineClass(PyObject * module_dict, const Cinfo * cinfo);
260 int defineDestFinfos(const Cinfo * cinfo);
261 int defineAllClasses(PyObject* module_dict);
262 int defineLookupFinfos(const Cinfo * cinfo);
263 int defineElementFinfos(const Cinfo * cinfo);
264 PyObject * moose_ObjId_get_lookupField_attr(PyObject * self, void * closure);
265 PyObject * moose_ObjId_get_elementField_attr(PyObject * self, void * closure);
266 PyObject * moose_ObjId_get_destField_attr(PyObject * self, void * closure);
267 // PyObject * _setDestField(ObjId oid, PyObject * args);
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);
270 Id getShell(int argc, char **argv);
271 vector<int> pysequence_to_dimvec(PyObject * dims);
272 map<string, vector <PyGetSetDef> >& get_getsetdefs();
273 map<string, PyTypeObject *>& get_moose_classes();
274 int get_npy_typenum(const type_info& ctype);
275 string getFieldType(string className, string fieldName);
276 const map<string, string>& get_field_alias();
277 PyTypeObject * getBaseClass(PyObject * self);
278 int parseFinfoType(string className, string finfoType, string fieldName, vector<string> & typeVec);
279 vector<string> getFieldNames(string className, string finfoType);
280 PyObject * getObjIdAttr(_ObjId * oid, string attribute);
281 const char ** getFinfoTypes();
286 void * to_cpp(PyObject * object, char typecode);
287 
291 PyObject * to_py(void * obj, char typecode);
295 PyObject * to_pytuple(void * obj, char typecode);
296 
297 /* inner fn for use in to_pytuple */
298 PyObject * convert_and_set_tuple_entry(PyObject * tuple, unsigned int index, void * vptr, char typecode);
299 
300 
301 
302 
308 template <typename T>
309 vector< T > * PySequenceToVector(PyObject * seq, char typecode)
310 {
311  Py_ssize_t length = PySequence_Length(seq);
312  vector <T> * ret = new vector<T>((unsigned int)length);
313  T * value;
314  for (unsigned int ii = 0; ii < length; ++ii)
315  {
316  PyObject * item = PySequence_GetItem(seq, ii);
317  if (item == NULL)
318  {
319  ostringstream error;
320  error << "Item # " << ii << "is NULL";
321  PyErr_SetString(PyExc_ValueError, error.str().c_str());
322  delete ret;
323  return NULL;
324  }
325  value = (T*)to_cpp(item, typecode);
326  Py_DECREF(item); // PySequence_GetItem returns a new reference. Reduce the refcount now.
327  if (value == NULL)
328  {
329  ostringstream error;
330  error << "Cannot handle sequence of type " << Py_TYPE(item)->tp_name;
331  PyErr_SetString(PyExc_TypeError, error.str().c_str());
332  delete ret;
333  return NULL;
334  }
335  ret->at(ii) = *value;
336  delete value;
337  }
338  return ret;
339 }
340 
341 template <typename T>
342 vector < vector < T > > * PySequenceToVectorOfVectors(PyObject * seq, char typecode)
343 {
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)
347  {
348  PyObject * innerSeq = PySequence_GetItem(seq, ii);
349  if (innerSeq == NULL)
350  {
351  ostringstream error;
352  error << "PySequenceToVectorOfVectors: error converting inner sequence " << ii;
353  PyErr_SetString(PyExc_ValueError, error.str().c_str());
354  delete ret;
355  return NULL;
356  }
357  vector< T > * inner = PySequenceToVector< T >(innerSeq, typecode);
358  Py_DECREF(innerSeq);
359  if (inner == NULL)
360  {
361  delete ret;
362  return NULL;
363  }
364  ret->at(ii).assign(inner->begin(), inner->end());
365  delete inner;
366  }
367  return ret;
368 }
369 
370 template <typename KeyType, typename ValueType>
371 PyObject * get_vec_lookupfield(ObjId oid, string fieldname, KeyType key, char vtypecode)
372 {
373  vector<ValueType> value = LookupField<KeyType, vector<ValueType> >::get(oid, fieldname, key);
374  return to_pytuple((void*)&value, innerType(vtypecode));
375 }
376 
377 template <typename KeyType, typename ValueType>
378 PyObject * get_simple_lookupfield(ObjId oid, string fieldname, KeyType key, char vtypecode)
379 {
380  ValueType value = LookupField<KeyType, ValueType>::get(oid, fieldname, key);
381  PyObject * v = to_py(&value, vtypecode);
382  return v;
383 }
384 
385 template <class KeyType> PyObject *
386 lookup_value(const ObjId& oid,
387  string fname,
388  char value_type_code,
389  char key_type_code,
390  PyObject * key)
391 {
392  PyObject * ret = NULL;
393  KeyType * cpp_key = (KeyType *)to_cpp(key, key_type_code);
394  if (cpp_key == NULL)
395  {
396  return NULL;
397  }
398  // The case statements are arranged roughly in order of frequency
399  // of that data type. This is an attempt to optimize. We cannot
400  // use a map of function pointers because part of the template
401  // will be unspecialized (or we need N^2 templated fn instances).
402  switch (value_type_code)
403  {
404  case 'd':
405  ret = get_simple_lookupfield< KeyType, double>(oid, fname, *cpp_key, value_type_code);
406  break;
407  case 'D':
408  ret = get_vec_lookupfield<KeyType, double>(oid, fname, *cpp_key, value_type_code);
409  break;
410  case 'S':
411  ret = get_vec_lookupfield<KeyType, string>(oid, fname, *cpp_key, value_type_code);
412  break;
413  case 'i':
414  ret = get_simple_lookupfield < KeyType, int >(oid, fname, *cpp_key, value_type_code);
415  break;
416  case 'I':
417  ret = get_simple_lookupfield < KeyType, unsigned int >(oid, fname, *cpp_key, value_type_code);
418  break;
419  case 'y':
420  ret = get_simple_lookupfield< KeyType, ObjId >(oid, fname, *cpp_key, value_type_code);
421  break;
422  case 'x':
423  ret = get_simple_lookupfield<KeyType, Id>(oid, fname, *cpp_key, value_type_code);
424  break;
425  case 'l':
426  ret = get_simple_lookupfield< KeyType, long >(oid, fname, *cpp_key, value_type_code);
427  break;
428  case 'k':
429  ret = get_simple_lookupfield< KeyType, unsigned long >(oid, fname, *cpp_key, value_type_code);
430  break;
431  case 'f':
432  ret = get_simple_lookupfield< KeyType, float >(oid, fname, *cpp_key, value_type_code);
433  break;
434  case 'b': // boolean is a special case that PyBuildValue does not handle
435  ret = get_simple_lookupfield < KeyType, bool >(oid, fname, *cpp_key, value_type_code);
436  break;
437  case 'c':
438  ret = get_simple_lookupfield < KeyType, char >(oid, fname, *cpp_key, value_type_code);
439  break;
440  case 'h':
441  ret = get_simple_lookupfield < KeyType, short >(oid, fname, *cpp_key, value_type_code);
442  break;
443  case 'H':
444  ret = get_simple_lookupfield< KeyType, unsigned short >(oid, fname, *cpp_key, value_type_code);
445  break;
446 #ifdef HAVE_LONG_LONG
447  case 'L':
448  ret = get_simple_lookupfield< KeyType, long long>(oid, fname, *cpp_key, value_type_code);
449  break;
450  case 'K':
451  ret = get_simple_lookupfield< KeyType, unsigned long long>(oid, fname, *cpp_key, value_type_code);
452  break;
453 #endif
454  case 'X':
455  ret = get_vec_lookupfield<KeyType, Id>(oid, fname, *cpp_key, value_type_code);
456  break;
457  case 'Y':
458  ret = get_vec_lookupfield<KeyType, ObjId>(oid, fname, *cpp_key, value_type_code);
459  break;
460  case 'v':
461  ret = get_vec_lookupfield<KeyType, int>(oid, fname, *cpp_key, value_type_code);
462  break;
463  case 'w':
464  ret = get_vec_lookupfield<KeyType, short>(oid, fname, *cpp_key, value_type_code);
465  break;
466  case 'M':
467  ret = get_vec_lookupfield<KeyType, long>(oid, fname, *cpp_key, value_type_code);
468  break;
469  case 'N':
470  ret = get_vec_lookupfield<KeyType, unsigned int>(oid, fname, *cpp_key, value_type_code);
471  break;
472  case 'P':
473  ret = get_vec_lookupfield<KeyType, unsigned long>(oid, fname, *cpp_key, value_type_code);
474  break;
475  case 'F':
476  ret = get_vec_lookupfield<KeyType, float>(oid, fname, *cpp_key, value_type_code);
477  break;
478  default:
479  PyErr_SetString(PyExc_TypeError, "invalid value type");
480  }
481  delete cpp_key;
482  return ret;
483 }
484 
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)
487 {
488  bool success = false;
489  KeyType *cpp_key = (KeyType*)to_cpp(key, key_type_code);
490  if (cpp_key == NULL)
491  {
492  return -1;
493  }
494 #define SET_LOOKUP_VALUE( TYPE ) \
495  { \
496  TYPE * value = (TYPE*)to_cpp(value_obj, value_type_code); \
497  if (value){ \
498  success = LookupField < KeyType, TYPE > ::set(oid, fname, *cpp_key, *value); \
499  delete value; \
500  delete cpp_key; \
501  } \
502  break; \
503  }
504 
505  switch (value_type_code)
506  {
507  case 'b':
508  SET_LOOKUP_VALUE(bool)
509  case 'c':
510  SET_LOOKUP_VALUE(char)
511  case 'h':
512  SET_LOOKUP_VALUE(short)
513  case 'H':
514  SET_LOOKUP_VALUE(unsigned short)
515  case 'i':
516  SET_LOOKUP_VALUE(int)
517  case 'I':
518  SET_LOOKUP_VALUE(unsigned int)
519  case 'l':
520  SET_LOOKUP_VALUE(long)
521  case 'k':
522  SET_LOOKUP_VALUE(unsigned long)
523 #ifdef HAVE_LONG_LONG
524  case 'L':
525  SET_LOOKUP_VALUE(long long)
526  case 'K':
527  SET_LOOKUP_VALUE(unsigned long long);
528 #endif
529  case 'd':
530  SET_LOOKUP_VALUE(double)
531  case 'f':
532  SET_LOOKUP_VALUE(float)
533  case 's':
534  SET_LOOKUP_VALUE(string)
535  case 'x':
537  case 'y':
539  case 'D':
540  SET_LOOKUP_VALUE( vector <double> )
541  case 'S':
542  SET_LOOKUP_VALUE( vector <string> )
543  case 'X':
544  SET_LOOKUP_VALUE( vector <Id> )
545  case 'Y':
546  SET_LOOKUP_VALUE( vector <ObjId> )
547  case 'v':
548  SET_LOOKUP_VALUE( vector <int> )
549  case 'M':
550  SET_LOOKUP_VALUE( vector <long> )
551  case 'N':
552  SET_LOOKUP_VALUE( vector <unsigned int> )
553  case 'P':
554  SET_LOOKUP_VALUE( vector <unsigned long> )
555  case 'F':
556  SET_LOOKUP_VALUE( vector <float> )
557  case 'w':
558  SET_LOOKUP_VALUE( vector <short> )
559  case 'C':
560  SET_LOOKUP_VALUE( vector <char> )
561  default:
562  ostringstream err;
563  err << "Value type " << value_type_code << " not supported yet.";
564  PyErr_SetString(PyExc_TypeError, err.str().c_str());
565  }
566  if (success)
567  {
568  return 0;
569  }
570  else
571  {
572  return -1;
573  }
574 }
575 
576 
577 template <class A>
578 PyObject* _set_vector_destFinfo(ObjId obj, string fieldName, PyObject * value, char vtypecode)
579 {
580  ostringstream error;
581  if (!PySequence_Check(value))
582  {
583  PyErr_SetString(PyExc_TypeError, "For setting vector field, specified value must be a sequence." );
584  return NULL;
585  }
586  vector<A> * _value = (vector < A > *)to_cpp(value, vtypecode);
587  if (_value == NULL)
588  {
589  return NULL;
590  }
591  bool ret = SetGet1< vector < A > >::set(obj, fieldName, *_value);
592  delete _value;
593  if (ret)
594  {
595  Py_RETURN_TRUE;
596  }
597  else
598  {
599  Py_RETURN_FALSE;
600  }
601 }
602 
606 template <class A>
607 PyObject* setDestFinfo1(ObjId obj, string fieldName, PyObject* arg1, char type1, A arg2)
608 {
609  bool ret;
610  ostringstream error;
611  error << "moose.setDestFinfo1: ";
612  switch (type1)
613  {
614  case 'f':
615  case 'd':
616  {
617  double param = PyFloat_AsDouble(arg1);
618  if (type1 == 'f')
619  {
620  ret = SetGet2<float, A>::set(obj, fieldName, (float)param, arg2);
621  }
622  else
623  {
624  ret = SetGet2<double, A>::set(obj, fieldName, param, arg2);
625  }
626  }
627  break;
628  case 's':
629  {
630  char * param = PyString_AsString(arg1);
631  ret = SetGet2<string, A>::set(obj, fieldName, string(param), arg2);
632  }
633  break;
634  case 'i':
635  case 'l':
636  {
637  long param = PyInt_AsLong(arg1);
638  if (param == -1 && PyErr_Occurred())
639  {
640  return NULL;
641  }
642  if (type1 == 'i')
643  {
644  ret = SetGet2<int, A>::set(obj, fieldName, (int)param, arg2);
645  }
646  else
647  {
648  ret = SetGet2<long, A>::set(obj, fieldName, param, arg2);
649  }
650  }
651  break;
652  case 'I':
653  case 'k':
654  {
655  unsigned long param =PyLong_AsUnsignedLong(arg1);
656  if (PyErr_Occurred())
657  {
658  return NULL;
659  }
660  if (type1 == 'I')
661  {
662  ret = SetGet2< unsigned int, A>::set(obj, fieldName, (unsigned int)param, arg2);
663  }
664  else
665  {
666  ret = SetGet2<unsigned long, A>::set(obj, fieldName, param, arg2);
667  }
668  }
669  break;
670  case 'x':
671  {
672  Id param;
673  // if (Id_SubtypeCheck(arg1)){
674  _Id * id = (_Id*)(arg1);
675  if (id == NULL)
676  {
677  error << "argument should be an vec or an melement";
678  PyErr_SetString(PyExc_TypeError, error.str().c_str());
679  return NULL;
680  }
681  param = id->id_;
682  // } else if (ObjId_SubtypeCheck(arg)){
683  // _ObjId * oid = (_ObjId*)(arg);
684  // if (oid == NULL){
685  // error << "argument should be an vec or an melement";
686  // PyErr_SetString(PyExc_TypeError, error.str().c_str());
687  // return NULL;
688  // }
689  // param = oid->oid_.id;
690  // }
691  ret = SetGet2<Id, A>::set(obj, fieldName, param, arg2);
692  }
693  break;
694  case 'y':
695  {
696  ObjId param;
697  // if (Id_SubtypeCheck(arg)){
698  // _Id * id = (_Id*)(arg);
699  // if (id == NULL){
700  // error << "argument should be an vec or an melement";
701  // PyErr_SetString(PyExc_TypeError, error.str().c_str());
702  // return NULL;
703  // }
704  // param = ObjId(id->id_);
705  // } else if (ObjId_SubtypeCheck(arg)){
706  _ObjId * oid = (_ObjId*)(arg1);
707  if (oid == NULL)
708  {
709  error << "argument should be an vec or an melement";
710  PyErr_SetString(PyExc_TypeError, error.str().c_str());
711  return NULL;
712  }
713  param = oid->oid_;
714  // }
715  ret = SetGet2<ObjId, A>::set(obj, fieldName, param, arg2);
716  }
717  break;
718  case 'c':
719  {
720  char * param = PyString_AsString(arg1);
721  if (!param)
722  {
723  error << "expected argument of type char/string";
724  PyErr_SetString(PyExc_TypeError, error.str().c_str());
725  return NULL;
726  }
727  else if (strlen(param) == 0)
728  {
729  error << "Empty string not allowed.";
730  PyErr_SetString(PyExc_ValueError, error.str().c_str());
731  return NULL;
732  }
733  ret = SetGet2<char, A>::set(obj, fieldName, param[0], arg2);
734  }
735  default:
736  {
737  error << "Unhandled argument 1 type (shortType=" << type1 << ")";
738  PyErr_SetString(PyExc_TypeError, error.str().c_str());
739  return NULL;
740  }
741  }
742  if (ret)
743  {
744  Py_RETURN_TRUE;
745  }
746  else
747  {
748  Py_RETURN_FALSE;
749  }
750 }
751 
752 
753 
754 #endif // _MOOSEMODULE_H
755 
756 //
757 // moosemodule.h ends here
PyObject_HEAD Id id_
Definition: moosemodule.h:114
PyObject * get_vec_lookupfield(ObjId oid, string fieldname, KeyType key, char vtypecode)
Definition: moosemodule.h:371
PyObject * deleteObjId(ObjId obj)
Definition: vec.cpp:522
int defineElementFinfos(const Cinfo *cinfo)
PyObject * moose_Id_str(_Id *self)
Definition: vec.cpp:566
int defineDestFinfos(const Cinfo *cinfo)
PyObject * moose_ObjId_get_elementField_attr(PyObject *self, void *closure)
char shortType(string)
uint32_t value
Definition: moosemodule.h:42
PyObject * moose_ObjId_setDestField(_ObjId *self, PyObject *args)
Definition: melement.cpp:1634
PyObject * moose_Id_richCompare(_Id *self, PyObject *args, int op)
Definition: vec.cpp:755
PyObject * moose_ObjId_setLookupField(_ObjId *self, PyObject *args)
Definition: melement.cpp:1600
int setLookupField(ObjId oid, char *fieldName, PyObject *key, PyObject *value)
Definition: melement.cpp:1480
PyObject * _set_vector_destFinfo(ObjId obj, string fieldName, PyObject *value, char vtypecode)
Definition: moosemodule.h:578
PyObject * moose_syncDataHandler(PyObject *dummy, PyObject *target)
PyObject * moose_start(PyObject *dummy, PyObject *args)
PyObject * moose_ObjId_connect(_ObjId *self, PyObject *args)
Definition: melement.cpp:2195
long moose_Field_hash(_Field *self)
Return the hash of the string {objectpath}.{fieldName}
Definition: mfield.cpp:142
static double op(double x)
PyObject * moose_Id_getValue(_Id *self)
Definition: vec.cpp:578
PyObject * oid_to_element(ObjId oid)
PyObject * moose_ElementField_getName(_Field *self, void *closure)
Definition: mfield.cpp:593
static A get(const ObjId &dest, const string &field, L index)
Definition: SetGet.h:532
int set_lookup_value(const ObjId &oid, string fname, char value_type_code, char key_type_code, PyObject *key, PyObject *value_obj)
Definition: moosemodule.h:486
int moose_Id_init(_Id *self, PyObject *args, PyObject *kwargs)
Definition: vec.cpp:416
int moose_Field_init(_Field *self, PyObject *args, PyObject *kwds)
Definition: mfield.cpp:89
PyObject * moose_delete(PyObject *dummy, PyObject *args)
PyObject * moose_seed(PyObject *dummy, PyObject *args)
PyObject * moose_Id_getattro(_Id *self, PyObject *attr)
Definition: vec.cpp:810
PyObject * moose_ObjId_getSlice(_ObjId *self, Py_ssize_t start, Py_ssize_t end)
Definition: melement.cpp:1240
PyObject * moose_ObjId_setField(_ObjId *self, PyObject *args)
Definition: melement.cpp:791
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)
Definition: melement.cpp:394
unsigned char bytes[4]
Definition: moosemodule.h:41
PyObject * moose_Id_getSlice(_Id *self, Py_ssize_t start, Py_ssize_t end)
Definition: vec.cpp:702
PyObject * moose_ElementField_getPath(_Field *self, void *closure)
Definition: mfield.cpp:571
const char ** getFinfoTypes()
finalize()
int moose_ElementField_setNum(_Field *self, PyObject *num, void *closure)
Definition: mfield.cpp:540
vector< T > * PySequenceToVector(PyObject *seq, char typecode)
Definition: moosemodule.h:309
PyObject * setDestFinfo2(ObjId obj, string fieldName, PyObject *arg1, char type1, PyObject *arg2, char type2)
PyObject * moose_Id_getItem(_Id *self, Py_ssize_t index)
Definition: vec.cpp:649
vector< vector< T > > * PySequenceToVectorOfVectors(PyObject *seq, char typecode)
Definition: moosemodule.h:342
const map< string, string > & get_field_alias()
PyObject * moose_move(PyObject *dummy, PyObject *args)
Definition: ObjId.h:20
int moose_ObjId_init(_ObjId *self, PyObject *args, PyObject *kwargs)
Definition: melement.cpp:296
PyObject * error
Definition: moosemodule.h:26
PyObject * moose_ObjId_getFieldNames(_ObjId *self, PyObject *args)
Definition: melement.cpp:2047
PyObject * moose_ObjId_getattro(_ObjId *self, PyObject *attr)
Definition: melement.cpp:484
PyObject * moose_LookupField_getItem(_Field *self, PyObject *key)
Definition: mfield.cpp:221
PyObject * moose_ElementField_getOwner(_Field *self, void *closure)
Definition: mfield.cpp:597
PyObject * moose_ObjId_getDataIndex(_ObjId *self)
Definition: melement.cpp:2317
PyObject_HEAD ObjId oid_
Definition: moosemodule.h:133
PyObject * setDestFinfo1(ObjId obj, string fieldName, PyObject *arg1, char type1, A arg2)
Definition: moosemodule.h:607
int moose_ElementField_setattro(_Field *self, PyObject *attr, PyObject *value)
Definition: mfield.cpp:826
int get_npy_typenum(const type_info &ctype)
PyObject * moose_Field_repr(_Field *self)
String representation of fields is {objectpath}.{fieldName}
Definition: mfield.cpp:156
PyMODINIT_FUNC init_moose()
int parseFinfoType(string className, string finfoType, string fieldName, vector< string > &typeVec)
Py_ssize_t moose_ObjId_getLength(_ObjId *self)
Definition: melement.cpp:1276
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)
Definition: melement.cpp:2241
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)
Definition: mfield.cpp:685
Id getShell(int argc, char **argv)
setup_runtime_env()
Py_ssize_t moose_Id_getLength(_Id *self)
Definition: vec.cpp:607
long moose_Id_hash(_Id *self)
Definition: vec.cpp:509
ObjId myoid
Definition: moosemodule.h:141
PyObject * moose_Id_repr(_Id *self)
Definition: vec.cpp:551
int moose_Id_setattro(_Id *self, PyObject *attr, PyObject *value)
Definition: vec.cpp:977
PyObject * moose_Id_getPath(_Id *self)
Definition: vec.cpp:588
_ObjId * owner
Definition: moosemodule.h:140
PyObject * moose_ElementField_getDataId(_Field *self, void *closure)
Definition: mfield.cpp:602
PyObject * moose_ObjId_getField(_ObjId *self, PyObject *args)
Definition: melement.cpp:460
PyObject * moose_ObjId_getFieldType(_ObjId *self, PyObject *args)
Definition: melement.cpp:420
PyObject * moose_getField(PyObject *dummy, PyObject *args)
PyObject * get_simple_lookupfield(ObjId oid, string fieldname, KeyType key, char vtypecode)
Definition: moosemodule.h:378
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)
Definition: mfield.cpp:519
PyObject * moose_ElementField_getItem(_Field *self, Py_ssize_t index)
Definition: mfield.cpp:611
void moose_Field_dealloc(_Field *self)
Definition: mfield.cpp:134
int moose_LookupField_setItem(_Field *self, PyObject *key, PyObject *value)
Definition: mfield.cpp:226
map< string, vector< PyGetSetDef > > & get_getsetdefs()
PyTypeObject * getBaseClass(PyObject *self)
PyObject * moose_ObjId_getFieldIndex(_ObjId *self)
Definition: melement.cpp:2330
PyObject_HEAD char * name
Definition: moosemodule.h:139
PyObject * moose_ObjId_get_lookupField_attr(PyObject *self, void *closure)
PyObject * moose_ElementField_getNum(_Field *self, void *closure)
Definition: mfield.cpp:528
PyObject * moose_reinit(PyObject *dummy, PyObject *args)
int defineClass(PyObject *module_dict, const Cinfo *cinfo)
long moose_ObjId_hash(_ObjId *self)
Definition: melement.cpp:333
PyObject * moose_getFieldDict(PyObject *dummy, PyObject *args)
PyObject * moose_Id_delete(_Id *self)
Definition: vec.cpp:534
char innerType(char)
Definition: types.cpp:104
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
Definition: Id.h:17
PyObject * moose_Id_getShape(_Id *self)
Definition: vec.cpp:623
PyObject * moose_getCwe(PyObject *dummy, PyObject *args)
PyObject * moose_Id_subscript(_Id *self, PyObject *op)
Definition: vec.cpp:730
int moose_Id_contains(_Id *self, PyObject *args)
Definition: vec.cpp:799
#define SET_LOOKUP_VALUE(TYPE)
PyObject * lookup_value(const ObjId &oid, string fname, char value_type_code, char key_type_code, PyObject *key)
Definition: moosemodule.h:386
PyObject * moose_ObjId_getLookupField(_ObjId *self, PyObject *args)
Definition: melement.cpp:1465
int defineLookupFinfos(const Cinfo *cinfo)
int moose_ObjId_setattro(_ObjId *self, PyObject *attr, PyObject *value)
Definition: melement.cpp:809
PyObject * to_py(void *obj, char typecode)
PyObject * moose_ElementField_getId(_Field *self, void *closure)
Definition: mfield.cpp:581
PyObject * moose_ObjId_getItem(_ObjId *self, Py_ssize_t index)
Definition: melement.cpp:1210
PyObject * moose_ElementField_getSlice(_Field *self, Py_ssize_t start, Py_ssize_t end)
Definition: mfield.cpp:644
PyObject * getLookupField(ObjId oid, char *fieldName, PyObject *key)
Definition: melement.cpp:1295
string getFieldType(string className, string fieldName)
unsigned int id_
Definition: Id.h:172
PyObject * moose_element(PyObject *dummy, PyObject *args)
PyObject * moose_Id_setField(_Id *self, PyObject *args)
Definition: vec.cpp:958
Definition: Cinfo.h:18
static char path[]
Definition: mfield.cpp:403
PyObject * moose_connect(PyObject *dummy, PyObject *args)
Py_ssize_t moose_ElementField_getLen(_Field *self, void *closure)
Definition: mfield.cpp:561
PyObject * moose_useClock(PyObject *dummy, PyObject *args)
PyObject * moose_quit(PyObject *dummy)
PyObject * getObjIdAttr(_ObjId *oid, string attribute)
PyObject * moose_ObjId_repr(_ObjId *self)
Definition: melement.cpp:355
static struct module_state _state
Definition: moosemodule.h:66
static bool set(const ObjId &dest, const string &field, A1 arg1, A2 arg2)
Definition: SetGet.h:365
PyObject * moose_ObjId_getNeighbors(_ObjId *self, PyObject *args)
Definition: melement.cpp:2112