Beispiel #1
0
boost::python::object convert_datum_to_python(const Datum &datum) {
    ScopedRecursionGuard srg(" while converting MWorks datum to Python object");
    
    if (datum.isUndefined()) {
        return boost::python::object();
    }
    
    switch (datum.getDataType()) {
        case M_INTEGER:
            return convert_longlong_to_python(datum.getInteger());
            
        case M_FLOAT:
            return manageNewRef( PyFloat_FromDouble(datum.getFloat()) );
            
        case M_BOOLEAN:
            return manageNewRef( PyBool_FromLong(datum.getBool()) );
            
        case M_STRING: {
            auto &str = datum.getString();
            return manageNewRef( PyString_FromStringAndSize(str.c_str(), str.size()) );
        }
            
        case M_LIST: {
            auto &listValue = datum.getList();
            boost::python::object list = manageNewRef( PyList_New(listValue.size()) );
            
            for (Py_ssize_t i = 0; i < listValue.size(); i++) {
                boost::python::object item = convert_datum_to_python(listValue.at(i));
                // PyList_SetItem "steals" the item reference, so we need to INCREF it
                Py_INCREF(item.ptr());
                if (PyList_SetItem(list.ptr(), i, item.ptr()))
                    throw_error_already_set();
            }
            
            return list;
        }
            
        case M_DICTIONARY: {
            boost::python::object dict = manageNewRef( PyDict_New() );
            
            for (auto &item : datum.getDict()) {
                if (PyDict_SetItem(dict.ptr(),
                                   convert_datum_to_python(item.first).ptr(),
                                   convert_datum_to_python(item.second).ptr()))
                {
                    throw_error_already_set();
                }
            }
            
            return dict;
        }
            
        default:
            PyErr_Format(PyExc_TypeError, "Cannot convert Datum of unknown type (%d)", datum.getDataType());
            throw_error_already_set();
            return boost::python::object();  // Never reached
    }
}
Beispiel #2
0
void VariableRegistryTestFixture::checkCodec(const Datum &generated_codec, int number_of_entries) const {
    CPPUNIT_ASSERT( generated_codec.isDictionary() );
    
    auto &dict = generated_codec.getDict();
    CPPUNIT_ASSERT( dict.size() == number_of_entries );
    
    for (auto &item : dict) {
        auto &key = item.first;
        auto &value = item.second;
        CPPUNIT_ASSERT( key.isInteger() );
        CPPUNIT_ASSERT( value.isDictionary() );
    }
}
Beispiel #3
0
BEGIN_NAMESPACE_MW


map<int, string> extract_simple_codec_map(Datum datum){
    map<int, string> result;
    
    for (auto &item : datum.getDict()) {
        int key = item.first.getInteger();
        Datum value_datum = item.second;
        
        if (value_datum.isDictionary()) {
            value_datum = value_datum.getElement("tagname");
        }
        
        result[key] = value_datum.getString();
    }
    
    return result;
}