@@ -1848,6 +1848,130 @@ template<int, TYPE2*>
1848
1848
%End
1849
1849
};
1850
1850
1851
+ template <TYPE>
1852
+ %MappedType QMap< QPair< QString, QString>, TYPE >
1853
+ {
1854
+ %TypeHeaderCode
1855
+ #include <QPair>
1856
+ #include <QMap>
1857
+ %End
1858
+
1859
+ %ConvertFromTypeCode
1860
+ //convert map to a python dictionary
1861
+ PyObject *d;
1862
+
1863
+ if ( ( d = PyDict_New() ) == NULL )
1864
+ return NULL;
1865
+
1866
+ for ( auto it = sipCpp->constBegin(); it != sipCpp->constEnd(); ++ it )
1867
+ {
1868
+ PyObject *keyobj;
1869
+ if ( ( keyobj = PyTuple_New( 2 ) ) == NULL )
1870
+ {
1871
+ Py_DECREF( d );
1872
+ return NULL;
1873
+ }
1874
+
1875
+ TYPE *t = new TYPE(it.value());
1876
+ PyObject *tobj = sipConvertFromNewType(t, sipType_TYPE, sipTransferObj);
1877
+ if ( tobj == NULL )
1878
+ {
1879
+ Py_DECREF(d);
1880
+ delete t;
1881
+ return NULL;
1882
+ }
1883
+
1884
+ // build key
1885
+ PyObject *k1obj = sipConvertFromNewType( new QString( it.key().first ), sipType_QString, sipTransferObj );
1886
+ PyTuple_SetItem( keyobj, 0, k1obj );
1887
+ PyObject *k2obj = sipConvertFromNewType( new QString( it.key().second ), sipType_QString, sipTransferObj );
1888
+ PyTuple_SetItem( keyobj, 1, k2obj );
1889
+
1890
+ if(keyobj == NULL || tobj == NULL || PyDict_SetItem(d, keyobj, tobj) < 0)
1891
+ {
1892
+ Py_DECREF(d);
1893
+
1894
+ if (keyobj)
1895
+ {
1896
+ Py_DECREF(keyobj);
1897
+ }
1898
+
1899
+ if (tobj)
1900
+ {
1901
+ Py_DECREF(tobj);
1902
+ }
1903
+ return NULL;
1904
+ }
1905
+
1906
+ Py_DECREF(keyobj);
1907
+ Py_DECREF(tobj);
1908
+ }
1909
+
1910
+ return d;
1911
+ %End
1912
+
1913
+ %ConvertToTypeCode
1914
+ Py_ssize_t i = 0;
1915
+ PyObject *kobj, *tobj;
1916
+
1917
+ // Check the type if that is all that is required.
1918
+ if (sipIsErr == NULL)
1919
+ {
1920
+ if (!PyDict_Check(sipPy))
1921
+ return 0;
1922
+
1923
+ while (PyDict_Next(sipPy, &i, &kobj, &tobj))
1924
+ if (!sipCanConvertToType(tobj, sipType_TYPE, SIP_NOT_NONE))
1925
+ return 0;
1926
+
1927
+ return 1;
1928
+ }
1929
+
1930
+ PyObject *t1obj, *t2obj;
1931
+ QMap< QPair< QString, QString>, TYPE > *qm = new QMap< QPair< QString, QString>, TYPE >;
1932
+
1933
+ int state;
1934
+ while (PyDict_Next(sipPy, &i, &t1obj, &t2obj))
1935
+ {
1936
+ PyObject *sipKeyFirst = PyTuple_GetItem( t1obj, 0 );
1937
+ PyObject *sipKeySecond = PyTuple_GetItem( t1obj, 1 );
1938
+ QString *k1 = reinterpret_cast<QString *>(sipConvertToType(sipKeyFirst, sipType_QString, sipTransferObj, SIP_NOT_NONE, &state, sipIsErr));
1939
+ if (*sipIsErr)
1940
+ {
1941
+ sipReleaseType(k1, sipType_QString, state);
1942
+ delete qm;
1943
+ return 0;
1944
+ }
1945
+
1946
+ QString *k2 = reinterpret_cast<QString *>(sipConvertToType(sipKeySecond, sipType_QString, sipTransferObj, SIP_NOT_NONE, &state, sipIsErr));
1947
+ if (*sipIsErr)
1948
+ {
1949
+ sipReleaseType(k1, sipType_QString, state);
1950
+ sipReleaseType(k2, sipType_QString, state);
1951
+ delete qm;
1952
+ return 0;
1953
+ }
1954
+
1955
+ TYPE *t = reinterpret_cast<TYPE *>(sipConvertToType(t2obj, sipType_TYPE, sipTransferObj, SIP_NOT_NONE, &state, sipIsErr));
1956
+ if (*sipIsErr)
1957
+ {
1958
+ sipReleaseType(t, sipType_TYPE, state);
1959
+
1960
+ delete qm;
1961
+ return 0;
1962
+ }
1963
+
1964
+ qm->insert( qMakePair( *k1,*k2 ), *t );
1965
+ sipReleaseType(k1, sipType_QString, state);
1966
+ sipReleaseType(k2, sipType_QString, state);
1967
+ sipReleaseType(t, sipType_TYPE, state);
1968
+ }
1969
+
1970
+ *sipCppPtr = qm;
1971
+
1972
+ return sipGetState( sipTransferObj );
1973
+ %End
1974
+ };
1851
1975
1852
1976
template <TYPE>
1853
1977
%MappedType QVector< TYPE* >
0 commit comments