std::map ready for prime time (hopefully)

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@4510 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Luigi Ballabio 2003-03-11 15:38:02 +00:00
commit 03658fcb4c
6 changed files with 95 additions and 134 deletions

View file

@ -1,5 +1,10 @@
Version 1.3.18 (In progress) Version 1.3.18 (In progress)
============================ ============================
03/11/2003: luigi
Support for std::map.
(a) Integration with scripting language (a la std::vector) for
Python, Ruby, MzScheme, and Guile;
(b) Simple wrapper for other languages
03/10/2003: beazley 03/10/2003: beazley
Fixed problem with escape sequences in string and character constants. SWIG Fixed problem with escape sequences in string and character constants. SWIG
wasn't parsing certain octal codes correctly. wasn't parsing certain octal codes correctly.

View file

@ -263,23 +263,16 @@ namespace std {
std::map<K,T >::iterator i = self->find(key); std::map<K,T >::iterator i = self->find(key);
return i != self->end(); return i != self->end();
} }
/* SCM keys() {
void each() { SCM result = SCM_EOL;
swig_type_info* k_type = SWIG_TypeQuery(#K " *"); for (std::map<K,T >::reverse_iterator i=$1.rbegin();
swig_type_info* t_type = SWIG_TypeQuery(#T " *"); i!=$1.rend(); ++i) {
std::map<K,T >::iterator i;
for (i=self->begin(); i!=self->end(); ++i) {
K* key = new K(i->first); K* key = new K(i->first);
T* val = &(i->second); SCM k = SWIG_MakePtr(key,$descriptor(K *));
VALUE entry = rb_ary_new2(2); result = gh_cons(k,result);
VALUE k = SWIG_NewPointerObj((void *) key,k_type,1);
VALUE x = SWIG_NewPointerObj((void *) val,t_type,0);
rb_ary_store(entry,0,k);
rb_ary_store(entry,1,x);
rb_yield(entry);
} }
return result;
} }
*/
} }
}; };
@ -490,21 +483,15 @@ namespace std {
std::map<K,T >::iterator i = self->find(key); std::map<K,T >::iterator i = self->find(key);
return i != self->end(); return i != self->end();
} }
/* SCM keys() {
void each() { SCM result = SCM_EOL;
swig_type_info* t_type = SWIG_TypeQuery(#T " *"); for (std::map<K,T >::reverse_iterator i=$1.rbegin();
std::map<K,T >::iterator i; i!=$1.rend(); ++i) {
for (i=self->begin(); i!=self->end(); ++i) { SCM k = CONVERT_TO(i->first);
T* val = &(i->second); result = gh_cons(k,result);
VALUE entry = rb_ary_new2(2);
VALUE k = CONVERT_TO(i->first);
VALUE x = SWIG_NewPointerObj((void *) val,t_type,0);
rb_ary_store(entry,0,k);
rb_ary_store(entry,1,x);
rb_yield(entry);
} }
return result;
} }
*/
} }
}; };
%enddef %enddef
@ -708,21 +695,16 @@ namespace std {
std::map<K,T >::iterator i = self->find(key); std::map<K,T >::iterator i = self->find(key);
return i != self->end(); return i != self->end();
} }
/* SCM keys() {
void each() { SCM result = SCM_EOL;
swig_type_info* k_type = SWIG_TypeQuery(#K " *"); for (std::map<K,T >::reverse_iterator i=$1.rbegin();
std::map<K,T >::iterator i; i!=$1.rend(); ++i) {
for (i=self->begin(); i!=self->end(); ++i) {
K* key = new K(i->first); K* key = new K(i->first);
VALUE entry = rb_ary_new2(2); SCM k = SWIG_MakePtr(key,$descriptor(K *));
VALUE k = SWIG_NewPointerObj((void *) key,k_type,1); result = gh_cons(k,result);
VALUE x = CONVERT_TO(i->second);
rb_ary_store(entry,0,k);
rb_ary_store(entry,1,x);
rb_yield(entry);
} }
return result;
} }
*/
} }
}; };
%enddef %enddef
@ -925,17 +907,15 @@ namespace std {
std::map<K,T >::iterator i = self->find(key); std::map<K,T >::iterator i = self->find(key);
return i != self->end(); return i != self->end();
} }
/* SCM keys() {
void each() { SCM result = SCM_EOL;
std::map<K,T >::iterator i; for (std::map<K,T >::reverse_iterator i=$1.rbegin();
for (i=self->begin(); i!=self->end(); ++i) { i!=$1.rend(); ++i) {
VALUE entry = rb_ary_new2(2); SCM k = CONVERT_K_TO(i->first);
rb_ary_store(entry,0,CONVERT_K_TO(i->first)); result = gh_cons(k,result);
rb_ary_store(entry,1,CONVERT_T_TO(i->second));
rb_yield(entry);
} }
return result;
} }
*/
} }
}; };
%enddef %enddef

View file

@ -263,23 +263,16 @@ namespace std {
std::map<K,T >::iterator i = self->find(key); std::map<K,T >::iterator i = self->find(key);
return i != self->end(); return i != self->end();
} }
/* Scheme_Object* keys() {
void each() { Scheme_Object* result = scheme_null;
swig_type_info* k_type = SWIG_TypeQuery(#K " *"); for (std::map<K,T >::reverse_iterator i=$1.rbegin();
swig_type_info* t_type = SWIG_TypeQuery(#T " *"); i!=$1.rend(); ++i) {
std::map<K,T >::iterator i;
for (i=self->begin(); i!=self->end(); ++i) {
K* key = new K(i->first); K* key = new K(i->first);
T* val = &(i->second); Scheme_Object* k = SWIG_MakePtr(key,$descriptor(K *));
VALUE entry = rb_ary_new2(2); result = scheme_make_pair(k,result);
VALUE k = SWIG_NewPointerObj((void *) key,k_type,1);
VALUE x = SWIG_NewPointerObj((void *) val,t_type,0);
rb_ary_store(entry,0,k);
rb_ary_store(entry,1,x);
rb_yield(entry);
} }
return result;
} }
*/
} }
}; };
@ -490,21 +483,15 @@ namespace std {
std::map<K,T >::iterator i = self->find(key); std::map<K,T >::iterator i = self->find(key);
return i != self->end(); return i != self->end();
} }
/* Scheme_Object* keys() {
void each() { Scheme_Object* result = scheme_null;
swig_type_info* t_type = SWIG_TypeQuery(#T " *"); for (std::map<K,T >::reverse_iterator i=$1.rbegin();
std::map<K,T >::iterator i; i!=$1.rend(); ++i) {
for (i=self->begin(); i!=self->end(); ++i) { Scheme_Object* k = CONVERT_TO(i->first);
T* val = &(i->second); result = scheme_make_pair(k,result);
VALUE entry = rb_ary_new2(2);
VALUE k = CONVERT_TO(i->first);
VALUE x = SWIG_NewPointerObj((void *) val,t_type,0);
rb_ary_store(entry,0,k);
rb_ary_store(entry,1,x);
rb_yield(entry);
} }
return result;
} }
*/
} }
}; };
%enddef %enddef
@ -708,21 +695,16 @@ namespace std {
std::map<K,T >::iterator i = self->find(key); std::map<K,T >::iterator i = self->find(key);
return i != self->end(); return i != self->end();
} }
/* Scheme_Object* keys() {
void each() { Scheme_Object* result = scheme_null;
swig_type_info* k_type = SWIG_TypeQuery(#K " *"); for (std::map<K,T >::reverse_iterator i=$1.rbegin();
std::map<K,T >::iterator i; i!=$1.rend(); ++i) {
for (i=self->begin(); i!=self->end(); ++i) {
K* key = new K(i->first); K* key = new K(i->first);
VALUE entry = rb_ary_new2(2); Scheme_Object* k = SWIG_MakePtr(key,$descriptor(K *));
VALUE k = SWIG_NewPointerObj((void *) key,k_type,1); result = scheme_make_pair(k,result);
VALUE x = CONVERT_TO(i->second);
rb_ary_store(entry,0,k);
rb_ary_store(entry,1,x);
rb_yield(entry);
} }
return result;
} }
*/
} }
}; };
%enddef %enddef
@ -925,17 +907,15 @@ namespace std {
std::map<K,T >::iterator i = self->find(key); std::map<K,T >::iterator i = self->find(key);
return i != self->end(); return i != self->end();
} }
/* Scheme_Object* keys() {
void each() { Scheme_Object* result = scheme_null;
std::map<K,T >::iterator i; for (std::map<K,T >::reverse_iterator i=$1.rbegin();
for (i=self->begin(); i!=self->end(); ++i) { i!=$1.rend(); ++i) {
VALUE entry = rb_ary_new2(2); Scheme_Object* k = CONVERT_K_TO(i->first);
rb_ary_store(entry,0,CONVERT_K_TO(i->first)); result = scheme_make_pair(k,result);
rb_ary_store(entry,1,CONVERT_T_TO(i->second));
rb_yield(entry);
} }
return result;
} }
*/
} }
}; };
%enddef %enddef

View file

@ -274,32 +274,30 @@ namespace std {
} }
PyObject* keys() { PyObject* keys() {
PyObject* keyList = PyList_New(self->size()); PyObject* keyList = PyList_New(self->size());
swig_type_info* type = SWIG_TypeQuery(#K " *");
std::map<K,T >::iterator i; std::map<K,T >::iterator i;
unsigned int j; unsigned int j;
for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) {
K* ptr = new K(i->first); K* ptr = new K(i->first);
PyList_SetItem(keyList,j, PyList_SetItem(keyList,j,
SWIG_NewPointerObj((void *) ptr,type,1)); SWIG_NewPointerObj((void *) ptr,
$descriptor(K *),1));
} }
return keyList; return keyList;
} }
PyObject* values() { PyObject* values() {
PyObject* valueList = PyList_New(self->size()); PyObject* valueList = PyList_New(self->size());
swig_type_info* type = SWIG_TypeQuery(#T " *");
std::map<K,T >::iterator i; std::map<K,T >::iterator i;
unsigned int j; unsigned int j;
for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) {
T* ptr = new T(i->second); T* ptr = new T(i->second);
PyList_SetItem(valueList,j, PyList_SetItem(valueList,j,
SWIG_NewPointerObj((void *) ptr,type,1)); SWIG_NewPointerObj((void *) ptr,
$descriptor(T *),1));
} }
return valueList; return valueList;
} }
PyObject* items() { PyObject* items() {
PyObject* itemList = PyList_New(self->size()); PyObject* itemList = PyList_New(self->size());
swig_type_info* k_type = SWIG_TypeQuery(#K " *");
swig_type_info* t_type = SWIG_TypeQuery(#T " *");
std::map<K,T >::iterator i; std::map<K,T >::iterator i;
unsigned int j; unsigned int j;
for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) {
@ -308,10 +306,10 @@ namespace std {
PyObject* item = PyTuple_New(2); PyObject* item = PyTuple_New(2);
PyTuple_SetItem(item,0, PyTuple_SetItem(item,0,
SWIG_NewPointerObj((void *) k_ptr, SWIG_NewPointerObj((void *) k_ptr,
k_type,1)); $descriptor(K *),1));
PyTuple_SetItem(item,1, PyTuple_SetItem(item,1,
SWIG_NewPointerObj((void *) t_ptr, SWIG_NewPointerObj((void *) t_ptr,
t_type,1)); $descriptor(T *),1));
PyList_SetItem(itemList,j,item); PyList_SetItem(itemList,j,item);
} }
return itemList; return itemList;
@ -324,13 +322,13 @@ namespace std {
PyObject* __iter__() { PyObject* __iter__() {
%#if PY_VERSION_HEX >= 0x02020000 %#if PY_VERSION_HEX >= 0x02020000
PyObject* keyList = PyList_New(self->size()); PyObject* keyList = PyList_New(self->size());
swig_type_info* type = SWIG_TypeQuery(#K " *");
std::map<K,T >::iterator i; std::map<K,T >::iterator i;
unsigned int j; unsigned int j;
for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) {
K* ptr = new K(i->first); K* ptr = new K(i->first);
PyList_SetItem(keyList,j, PyList_SetItem(keyList,j,
SWIG_NewPointerObj((void *) ptr,type,1)); SWIG_NewPointerObj((void *) ptr,
$descriptor(K *),1));
} }
PyObject* iter = PyObject_GetIter(keyList); PyObject* iter = PyObject_GetIter(keyList);
Py_DECREF(keyList); Py_DECREF(keyList);
@ -551,19 +549,18 @@ namespace std {
} }
PyObject* values() { PyObject* values() {
PyObject* valueList = PyList_New(self->size()); PyObject* valueList = PyList_New(self->size());
swig_type_info* type = SWIG_TypeQuery(#T " *");
std::map<K,T >::iterator i; std::map<K,T >::iterator i;
unsigned int j; unsigned int j;
for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) {
T* ptr = new T(i->second); T* ptr = new T(i->second);
PyList_SetItem(valueList,j, PyList_SetItem(valueList,j,
SWIG_NewPointerObj((void *) ptr,type,1)); SWIG_NewPointerObj((void *) ptr,
$descriptor(T *),1));
} }
return valueList; return valueList;
} }
PyObject* items() { PyObject* items() {
PyObject* itemList = PyList_New(self->size()); PyObject* itemList = PyList_New(self->size());
swig_type_info* t_type = SWIG_TypeQuery(#T " *");
std::map<K,T >::iterator i; std::map<K,T >::iterator i;
unsigned int j; unsigned int j;
for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) {
@ -573,7 +570,7 @@ namespace std {
CONVERT_TO(i->first)); CONVERT_TO(i->first));
PyTuple_SetItem(item,1, PyTuple_SetItem(item,1,
SWIG_NewPointerObj((void *) t_ptr, SWIG_NewPointerObj((void *) t_ptr,
t_type,1)); $descriptor(T *),1));
PyList_SetItem(itemList,j,item); PyList_SetItem(itemList,j,item);
} }
return itemList; return itemList;
@ -799,13 +796,13 @@ namespace std {
} }
PyObject* keys() { PyObject* keys() {
PyObject* keyList = PyList_New(self->size()); PyObject* keyList = PyList_New(self->size());
swig_type_info* type = SWIG_TypeQuery(#K " *");
std::map<K,T >::iterator i; std::map<K,T >::iterator i;
unsigned int j; unsigned int j;
for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) {
K* ptr = new K(i->first); K* ptr = new K(i->first);
PyList_SetItem(keyList,j, PyList_SetItem(keyList,j,
SWIG_NewPointerObj((void *) ptr,type,1)); SWIG_NewPointerObj((void *) ptr,
$descriptor(K *),1));
} }
return keyList; return keyList;
} }
@ -821,7 +818,6 @@ namespace std {
} }
PyObject* items() { PyObject* items() {
PyObject* itemList = PyList_New(self->size()); PyObject* itemList = PyList_New(self->size());
swig_type_info* k_type = SWIG_TypeQuery(#K " *");
std::map<K,T >::iterator i; std::map<K,T >::iterator i;
unsigned int j; unsigned int j;
for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) {
@ -829,7 +825,7 @@ namespace std {
PyObject* item = PyTuple_New(2); PyObject* item = PyTuple_New(2);
PyTuple_SetItem(item,0, PyTuple_SetItem(item,0,
SWIG_NewPointerObj((void *) k_ptr, SWIG_NewPointerObj((void *) k_ptr,
k_type,1)); $descriptor(K *),1));
PyTuple_SetItem(item,1, PyTuple_SetItem(item,1,
CONVERT_TO(i->second)); CONVERT_TO(i->second));
PyList_SetItem(itemList,j,item); PyList_SetItem(itemList,j,item);
@ -844,13 +840,13 @@ namespace std {
PyObject* __iter__() { PyObject* __iter__() {
%#if PY_VERSION_HEX >= 0x02020000 %#if PY_VERSION_HEX >= 0x02020000
PyObject* keyList = PyList_New(self->size()); PyObject* keyList = PyList_New(self->size());
swig_type_info* type = SWIG_TypeQuery(#K " *");
std::map<K,T >::iterator i; std::map<K,T >::iterator i;
unsigned int j; unsigned int j;
for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) {
K* ptr = new K(i->first); K* ptr = new K(i->first);
PyList_SetItem(keyList,j, PyList_SetItem(keyList,j,
SWIG_NewPointerObj((void *) ptr,type,1)); SWIG_NewPointerObj((void *) ptr,
$descriptor(K *),1));
} }
PyObject* iter = PyObject_GetIter(keyList); PyObject* iter = PyObject_GetIter(keyList);
Py_DECREF(keyList); Py_DECREF(keyList);

View file

@ -217,38 +217,38 @@ namespace std {
} }
VALUE keys() { VALUE keys() {
VALUE keyList = rb_ary_new2(self->size()); VALUE keyList = rb_ary_new2(self->size());
swig_type_info* type = SWIG_TypeQuery(#K " *");
std::map<K,T >::iterator i; std::map<K,T >::iterator i;
unsigned int j; unsigned int j;
for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) {
K* ptr = new K(i->first); K* ptr = new K(i->first);
rb_ary_store(keyList,j, rb_ary_store(keyList,j,
SWIG_NewPointerObj((void *) ptr,type,1)); SWIG_NewPointerObj((void *) ptr,
$descriptor(K *),1));
} }
return keyList; return keyList;
} }
VALUE values() { VALUE values() {
VALUE valueList = rb_ary_new2(self->size()); VALUE valueList = rb_ary_new2(self->size());
swig_type_info* type = SWIG_TypeQuery(#T " *");
std::map<K,T >::iterator i; std::map<K,T >::iterator i;
unsigned int j; unsigned int j;
for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) {
T* ptr = new T(i->second); T* ptr = new T(i->second);
rb_ary_store(valueList,j, rb_ary_store(valueList,j,
SWIG_NewPointerObj((void *) ptr,type,1)); SWIG_NewPointerObj((void *) ptr,
$descriptor(T *),1));
} }
return valueList; return valueList;
} }
void each() { void each() {
swig_type_info* k_type = SWIG_TypeQuery(#K " *");
swig_type_info* t_type = SWIG_TypeQuery(#T " *");
std::map<K,T >::iterator i; std::map<K,T >::iterator i;
for (i=self->begin(); i!=self->end(); ++i) { for (i=self->begin(); i!=self->end(); ++i) {
K* key = new K(i->first); K* key = new K(i->first);
T* val = &(i->second); T* val = &(i->second);
VALUE entry = rb_ary_new2(2); VALUE entry = rb_ary_new2(2);
VALUE k = SWIG_NewPointerObj((void *) key,k_type,1); VALUE k = SWIG_NewPointerObj((void *) key,
VALUE x = SWIG_NewPointerObj((void *) val,t_type,0); $descriptor(K *),1);
VALUE x = SWIG_NewPointerObj((void *) val,
$descriptor(T *),0);
rb_ary_store(entry,0,k); rb_ary_store(entry,0,k);
rb_ary_store(entry,1,x); rb_ary_store(entry,1,x);
rb_yield(entry); rb_yield(entry);
@ -431,24 +431,24 @@ namespace std {
} }
VALUE values() { VALUE values() {
VALUE valueList = rb_ary_new2(self->size()); VALUE valueList = rb_ary_new2(self->size());
swig_type_info* type = SWIG_TypeQuery(#T " *");
std::map<K,T >::iterator i; std::map<K,T >::iterator i;
unsigned int j; unsigned int j;
for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) {
T* ptr = new T(i->second); T* ptr = new T(i->second);
rb_ary_store(valueList,j, rb_ary_store(valueList,j,
SWIG_NewPointerObj((void *) ptr,type,1)); SWIG_NewPointerObj((void *) ptr,
$descriptor(T *),1));
} }
return valueList; return valueList;
} }
void each() { void each() {
swig_type_info* t_type = SWIG_TypeQuery(#T " *");
std::map<K,T >::iterator i; std::map<K,T >::iterator i;
for (i=self->begin(); i!=self->end(); ++i) { for (i=self->begin(); i!=self->end(); ++i) {
T* val = &(i->second); T* val = &(i->second);
VALUE entry = rb_ary_new2(2); VALUE entry = rb_ary_new2(2);
VALUE k = CONVERT_TO(i->first); VALUE k = CONVERT_TO(i->first);
VALUE x = SWIG_NewPointerObj((void *) val,t_type,0); VALUE x = SWIG_NewPointerObj((void *) val,
$descriptor(T *),0);
rb_ary_store(entry,0,k); rb_ary_store(entry,0,k);
rb_ary_store(entry,1,x); rb_ary_store(entry,1,x);
rb_yield(entry); rb_yield(entry);
@ -619,13 +619,13 @@ namespace std {
} }
VALUE keys() { VALUE keys() {
VALUE keyList = rb_ary_new2(self->size()); VALUE keyList = rb_ary_new2(self->size());
swig_type_info* type = SWIG_TypeQuery(#K " *");
std::map<K,T >::iterator i; std::map<K,T >::iterator i;
unsigned int j; unsigned int j;
for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) {
K* ptr = new K(i->first); K* ptr = new K(i->first);
rb_ary_store(keyList,j, rb_ary_store(keyList,j,
SWIG_NewPointerObj((void *) ptr,type,1)); SWIG_NewPointerObj((void *) ptr,
$descriptor(K *),1));
} }
return keyList; return keyList;
} }
@ -640,12 +640,12 @@ namespace std {
return valueList; return valueList;
} }
void each() { void each() {
swig_type_info* k_type = SWIG_TypeQuery(#K " *");
std::map<K,T >::iterator i; std::map<K,T >::iterator i;
for (i=self->begin(); i!=self->end(); ++i) { for (i=self->begin(); i!=self->end(); ++i) {
K* key = new K(i->first); K* key = new K(i->first);
VALUE entry = rb_ary_new2(2); VALUE entry = rb_ary_new2(2);
VALUE k = SWIG_NewPointerObj((void *) key,k_type,1); VALUE k = SWIG_NewPointerObj((void *) key,
$descriptor(K *),1);
VALUE x = CONVERT_TO(i->second); VALUE x = CONVERT_TO(i->second);
rb_ary_store(entry,0,k); rb_ary_store(entry,0,k);
rb_ary_store(entry,1,x); rb_ary_store(entry,1,x);

View file

@ -203,10 +203,10 @@ namespace std {
throw std::out_of_range("vector index out of range"); throw std::out_of_range("vector index out of range");
} }
void each() { void each() {
swig_type_info* type = SWIG_TypeQuery(#T " *");
for (unsigned int i=0; i<self->size(); i++) { for (unsigned int i=0; i<self->size(); i++) {
T* x = &((*self)[i]); T* x = &((*self)[i]);
rb_yield(SWIG_NewPointerObj((void *) x, type, 0)); rb_yield(SWIG_NewPointerObj((void *) x,
$descriptor(T *), 0));
} }
} }
} }