//============================================================================= // METHOD: SPELLconfigDict:: //============================================================================= SPELLpyValue SPELLconfigDict::get( const std::string& key ) const { std::map<std::string,SPELLpyValue>::const_iterator it = m_values.find(key); if (it != m_values.end() ) { return it->second; } return SPELLpyValue(NULL); }
//============================================================================= // METHOD: SPELLconfigDict::reset() //============================================================================= void SPELLconfigDict::reset( PyObject* dict ) { m_values.clear(); if (dict) { SPELLsafePythonOperations ops ("SPELLconfigDict::reset()"); SPELLpyHandle keys = PyDict_Keys(dict); unsigned int numKeys = PyList_Size(keys.get()); for( unsigned int idx = 0; idx < numKeys; idx++ ) { PyObject* key = PyList_GetItem( keys.get(), idx ); PyObject* value = PyDict_GetItem( dict, key ); m_values.insert( std::make_pair( PYSSTR(key), SPELLpyValue(value) )); } } }
//============================================================================ // METHOD: SPELLpyValue::set //============================================================================ void SPELLpyValue::set( PyObject* pyValue ) { m_type = NONE; m_intValue = 0; m_boolValue = false; m_floatValue = 0.0; m_timeValue.set(0,0); m_stringValue = ""; if (pyValue == NULL) return; DEBUG("[PYVAL] Set value from " + PYREPR(pyValue)); if (pyValue != Py_None) { if (PyBool_Check(pyValue)) { m_type = BOOLEAN; m_boolValue = pyValue == Py_True; } else if (PyLong_Check(pyValue)) { DEBUG("[PYVAL] Long check"); m_type = LONG; m_intValue = PyLong_AsLongLong(pyValue); } else if (PyInt_Check(pyValue)) { DEBUG("[PYVAL] Int check"); m_type = LONG; m_intValue = PyInt_AsLong(pyValue); } else if (PyFloat_Check(pyValue)) { m_type = DOUBLE; m_floatValue = PyFloat_AsDouble(pyValue); } else if (SPELLpythonHelper::instance().isTime(pyValue)) { m_timeValue = SPELLpythonHelper::instance().evalTime(PYSSTR(pyValue)); if (m_timeValue.isDelta()) { m_type = RELTIME; } else { m_type = ABSTIME; } } else if (PyString_Check(pyValue)) { m_type = STRING; m_stringValue = PYSTR(pyValue); } else if (PyList_Check(pyValue)) { m_type = LIST; m_listValue.clear(); unsigned int numItems = PyList_Size(pyValue); for(unsigned int idx = 0; idx < numItems; idx++) { m_listValue.push_back( SPELLpyValue( PyList_GetItem( pyValue, idx) )); } } else if (PyDict_Check(pyValue)) { m_type = DICT; m_dictValue.clear(); PyObject* keys = PyDict_Keys(pyValue); unsigned int numItems = PyList_Size(keys); for(unsigned int idx = 0; idx < numItems; idx++) { PyObject* key = PyList_GetItem(keys,idx); PyObject* value = PyDict_GetItem( pyValue, key ); m_dictValue.insert( std::make_pair( PYSSTR(key), SPELLpyValue(value) ) ); } } else { THROW_EXCEPTION("Cannot create variable value", "Cannot infer type from value (" + PYREPR(pyValue) + ")", SPELL_ERROR_LANGUAGE); } SPELLpythonHelper::instance().checkError(); } }