diff --git a/CHANGES.current b/CHANGES.current index 12145f661..b994588b5 100644 --- a/CHANGES.current +++ b/CHANGES.current @@ -1,5 +1,10 @@ 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 Fixed problem with escape sequences in string and character constants. SWIG wasn't parsing certain octal codes correctly. diff --git a/Lib/guile/std_map.i b/Lib/guile/std_map.i index 86b99ee7d..55fe10824 100644 --- a/Lib/guile/std_map.i +++ b/Lib/guile/std_map.i @@ -263,23 +263,16 @@ namespace std { std::map::iterator i = self->find(key); return i != self->end(); } - /* - void each() { - swig_type_info* k_type = SWIG_TypeQuery(#K " *"); - swig_type_info* t_type = SWIG_TypeQuery(#T " *"); - std::map::iterator i; - for (i=self->begin(); i!=self->end(); ++i) { + SCM keys() { + SCM result = SCM_EOL; + for (std::map::reverse_iterator i=$1.rbegin(); + i!=$1.rend(); ++i) { K* key = new K(i->first); - T* val = &(i->second); - VALUE entry = rb_ary_new2(2); - 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); + SCM k = SWIG_MakePtr(key,$descriptor(K *)); + result = gh_cons(k,result); } + return result; } - */ } }; @@ -490,21 +483,15 @@ namespace std { std::map::iterator i = self->find(key); return i != self->end(); } - /* - void each() { - swig_type_info* t_type = SWIG_TypeQuery(#T " *"); - std::map::iterator i; - for (i=self->begin(); i!=self->end(); ++i) { - T* val = &(i->second); - 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); + SCM keys() { + SCM result = SCM_EOL; + for (std::map::reverse_iterator i=$1.rbegin(); + i!=$1.rend(); ++i) { + SCM k = CONVERT_TO(i->first); + result = gh_cons(k,result); } + return result; } - */ } }; %enddef @@ -708,21 +695,16 @@ namespace std { std::map::iterator i = self->find(key); return i != self->end(); } - /* - void each() { - swig_type_info* k_type = SWIG_TypeQuery(#K " *"); - std::map::iterator i; - for (i=self->begin(); i!=self->end(); ++i) { + SCM keys() { + SCM result = SCM_EOL; + for (std::map::reverse_iterator i=$1.rbegin(); + i!=$1.rend(); ++i) { K* key = new K(i->first); - VALUE entry = rb_ary_new2(2); - VALUE k = SWIG_NewPointerObj((void *) key,k_type,1); - VALUE x = CONVERT_TO(i->second); - rb_ary_store(entry,0,k); - rb_ary_store(entry,1,x); - rb_yield(entry); + SCM k = SWIG_MakePtr(key,$descriptor(K *)); + result = gh_cons(k,result); } + return result; } - */ } }; %enddef @@ -925,17 +907,15 @@ namespace std { std::map::iterator i = self->find(key); return i != self->end(); } - /* - void each() { - std::map::iterator i; - for (i=self->begin(); i!=self->end(); ++i) { - VALUE entry = rb_ary_new2(2); - rb_ary_store(entry,0,CONVERT_K_TO(i->first)); - rb_ary_store(entry,1,CONVERT_T_TO(i->second)); - rb_yield(entry); + SCM keys() { + SCM result = SCM_EOL; + for (std::map::reverse_iterator i=$1.rbegin(); + i!=$1.rend(); ++i) { + SCM k = CONVERT_K_TO(i->first); + result = gh_cons(k,result); } + return result; } - */ } }; %enddef diff --git a/Lib/mzscheme/std_map.i b/Lib/mzscheme/std_map.i index dd56444ea..1dc4b0445 100644 --- a/Lib/mzscheme/std_map.i +++ b/Lib/mzscheme/std_map.i @@ -263,23 +263,16 @@ namespace std { std::map::iterator i = self->find(key); return i != self->end(); } - /* - void each() { - swig_type_info* k_type = SWIG_TypeQuery(#K " *"); - swig_type_info* t_type = SWIG_TypeQuery(#T " *"); - std::map::iterator i; - for (i=self->begin(); i!=self->end(); ++i) { + Scheme_Object* keys() { + Scheme_Object* result = scheme_null; + for (std::map::reverse_iterator i=$1.rbegin(); + i!=$1.rend(); ++i) { K* key = new K(i->first); - T* val = &(i->second); - VALUE entry = rb_ary_new2(2); - 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); + Scheme_Object* k = SWIG_MakePtr(key,$descriptor(K *)); + result = scheme_make_pair(k,result); } + return result; } - */ } }; @@ -490,21 +483,15 @@ namespace std { std::map::iterator i = self->find(key); return i != self->end(); } - /* - void each() { - swig_type_info* t_type = SWIG_TypeQuery(#T " *"); - std::map::iterator i; - for (i=self->begin(); i!=self->end(); ++i) { - T* val = &(i->second); - 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); + Scheme_Object* keys() { + Scheme_Object* result = scheme_null; + for (std::map::reverse_iterator i=$1.rbegin(); + i!=$1.rend(); ++i) { + Scheme_Object* k = CONVERT_TO(i->first); + result = scheme_make_pair(k,result); } + return result; } - */ } }; %enddef @@ -708,21 +695,16 @@ namespace std { std::map::iterator i = self->find(key); return i != self->end(); } - /* - void each() { - swig_type_info* k_type = SWIG_TypeQuery(#K " *"); - std::map::iterator i; - for (i=self->begin(); i!=self->end(); ++i) { + Scheme_Object* keys() { + Scheme_Object* result = scheme_null; + for (std::map::reverse_iterator i=$1.rbegin(); + i!=$1.rend(); ++i) { K* key = new K(i->first); - VALUE entry = rb_ary_new2(2); - VALUE k = SWIG_NewPointerObj((void *) key,k_type,1); - VALUE x = CONVERT_TO(i->second); - rb_ary_store(entry,0,k); - rb_ary_store(entry,1,x); - rb_yield(entry); + Scheme_Object* k = SWIG_MakePtr(key,$descriptor(K *)); + result = scheme_make_pair(k,result); } + return result; } - */ } }; %enddef @@ -925,17 +907,15 @@ namespace std { std::map::iterator i = self->find(key); return i != self->end(); } - /* - void each() { - std::map::iterator i; - for (i=self->begin(); i!=self->end(); ++i) { - VALUE entry = rb_ary_new2(2); - rb_ary_store(entry,0,CONVERT_K_TO(i->first)); - rb_ary_store(entry,1,CONVERT_T_TO(i->second)); - rb_yield(entry); + Scheme_Object* keys() { + Scheme_Object* result = scheme_null; + for (std::map::reverse_iterator i=$1.rbegin(); + i!=$1.rend(); ++i) { + Scheme_Object* k = CONVERT_K_TO(i->first); + result = scheme_make_pair(k,result); } + return result; } - */ } }; %enddef diff --git a/Lib/python/std_map.i b/Lib/python/std_map.i index ab7b16ddc..d3c643427 100644 --- a/Lib/python/std_map.i +++ b/Lib/python/std_map.i @@ -274,32 +274,30 @@ namespace std { } PyObject* keys() { PyObject* keyList = PyList_New(self->size()); - swig_type_info* type = SWIG_TypeQuery(#K " *"); std::map::iterator i; unsigned int j; for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { K* ptr = new K(i->first); PyList_SetItem(keyList,j, - SWIG_NewPointerObj((void *) ptr,type,1)); + SWIG_NewPointerObj((void *) ptr, + $descriptor(K *),1)); } return keyList; } PyObject* values() { PyObject* valueList = PyList_New(self->size()); - swig_type_info* type = SWIG_TypeQuery(#T " *"); std::map::iterator i; unsigned int j; for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { T* ptr = new T(i->second); PyList_SetItem(valueList,j, - SWIG_NewPointerObj((void *) ptr,type,1)); + SWIG_NewPointerObj((void *) ptr, + $descriptor(T *),1)); } return valueList; } PyObject* items() { PyObject* itemList = PyList_New(self->size()); - swig_type_info* k_type = SWIG_TypeQuery(#K " *"); - swig_type_info* t_type = SWIG_TypeQuery(#T " *"); std::map::iterator i; unsigned int j; for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { @@ -308,10 +306,10 @@ namespace std { PyObject* item = PyTuple_New(2); PyTuple_SetItem(item,0, SWIG_NewPointerObj((void *) k_ptr, - k_type,1)); + $descriptor(K *),1)); PyTuple_SetItem(item,1, SWIG_NewPointerObj((void *) t_ptr, - t_type,1)); + $descriptor(T *),1)); PyList_SetItem(itemList,j,item); } return itemList; @@ -324,13 +322,13 @@ namespace std { PyObject* __iter__() { %#if PY_VERSION_HEX >= 0x02020000 PyObject* keyList = PyList_New(self->size()); - swig_type_info* type = SWIG_TypeQuery(#K " *"); std::map::iterator i; unsigned int j; for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { K* ptr = new K(i->first); PyList_SetItem(keyList,j, - SWIG_NewPointerObj((void *) ptr,type,1)); + SWIG_NewPointerObj((void *) ptr, + $descriptor(K *),1)); } PyObject* iter = PyObject_GetIter(keyList); Py_DECREF(keyList); @@ -551,19 +549,18 @@ namespace std { } PyObject* values() { PyObject* valueList = PyList_New(self->size()); - swig_type_info* type = SWIG_TypeQuery(#T " *"); std::map::iterator i; unsigned int j; for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { T* ptr = new T(i->second); PyList_SetItem(valueList,j, - SWIG_NewPointerObj((void *) ptr,type,1)); + SWIG_NewPointerObj((void *) ptr, + $descriptor(T *),1)); } return valueList; } PyObject* items() { PyObject* itemList = PyList_New(self->size()); - swig_type_info* t_type = SWIG_TypeQuery(#T " *"); std::map::iterator i; unsigned int j; for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { @@ -573,7 +570,7 @@ namespace std { CONVERT_TO(i->first)); PyTuple_SetItem(item,1, SWIG_NewPointerObj((void *) t_ptr, - t_type,1)); + $descriptor(T *),1)); PyList_SetItem(itemList,j,item); } return itemList; @@ -799,13 +796,13 @@ namespace std { } PyObject* keys() { PyObject* keyList = PyList_New(self->size()); - swig_type_info* type = SWIG_TypeQuery(#K " *"); std::map::iterator i; unsigned int j; for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { K* ptr = new K(i->first); PyList_SetItem(keyList,j, - SWIG_NewPointerObj((void *) ptr,type,1)); + SWIG_NewPointerObj((void *) ptr, + $descriptor(K *),1)); } return keyList; } @@ -821,7 +818,6 @@ namespace std { } PyObject* items() { PyObject* itemList = PyList_New(self->size()); - swig_type_info* k_type = SWIG_TypeQuery(#K " *"); std::map::iterator i; unsigned int j; for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { @@ -829,7 +825,7 @@ namespace std { PyObject* item = PyTuple_New(2); PyTuple_SetItem(item,0, SWIG_NewPointerObj((void *) k_ptr, - k_type,1)); + $descriptor(K *),1)); PyTuple_SetItem(item,1, CONVERT_TO(i->second)); PyList_SetItem(itemList,j,item); @@ -844,13 +840,13 @@ namespace std { PyObject* __iter__() { %#if PY_VERSION_HEX >= 0x02020000 PyObject* keyList = PyList_New(self->size()); - swig_type_info* type = SWIG_TypeQuery(#K " *"); std::map::iterator i; unsigned int j; for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { K* ptr = new K(i->first); PyList_SetItem(keyList,j, - SWIG_NewPointerObj((void *) ptr,type,1)); + SWIG_NewPointerObj((void *) ptr, + $descriptor(K *),1)); } PyObject* iter = PyObject_GetIter(keyList); Py_DECREF(keyList); diff --git a/Lib/ruby/std_map.i b/Lib/ruby/std_map.i index 1e11280f1..345196fc6 100644 --- a/Lib/ruby/std_map.i +++ b/Lib/ruby/std_map.i @@ -217,38 +217,38 @@ namespace std { } VALUE keys() { VALUE keyList = rb_ary_new2(self->size()); - swig_type_info* type = SWIG_TypeQuery(#K " *"); std::map::iterator i; unsigned int j; for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { K* ptr = new K(i->first); rb_ary_store(keyList,j, - SWIG_NewPointerObj((void *) ptr,type,1)); + SWIG_NewPointerObj((void *) ptr, + $descriptor(K *),1)); } return keyList; } VALUE values() { VALUE valueList = rb_ary_new2(self->size()); - swig_type_info* type = SWIG_TypeQuery(#T " *"); std::map::iterator i; unsigned int j; for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { T* ptr = new T(i->second); rb_ary_store(valueList,j, - SWIG_NewPointerObj((void *) ptr,type,1)); + SWIG_NewPointerObj((void *) ptr, + $descriptor(T *),1)); } return valueList; } void each() { - swig_type_info* k_type = SWIG_TypeQuery(#K " *"); - swig_type_info* t_type = SWIG_TypeQuery(#T " *"); std::map::iterator i; for (i=self->begin(); i!=self->end(); ++i) { K* key = new K(i->first); T* val = &(i->second); VALUE entry = rb_ary_new2(2); - VALUE k = SWIG_NewPointerObj((void *) key,k_type,1); - VALUE x = SWIG_NewPointerObj((void *) val,t_type,0); + VALUE k = SWIG_NewPointerObj((void *) key, + $descriptor(K *),1); + VALUE x = SWIG_NewPointerObj((void *) val, + $descriptor(T *),0); rb_ary_store(entry,0,k); rb_ary_store(entry,1,x); rb_yield(entry); @@ -431,24 +431,24 @@ namespace std { } VALUE values() { VALUE valueList = rb_ary_new2(self->size()); - swig_type_info* type = SWIG_TypeQuery(#T " *"); std::map::iterator i; unsigned int j; for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { T* ptr = new T(i->second); rb_ary_store(valueList,j, - SWIG_NewPointerObj((void *) ptr,type,1)); + SWIG_NewPointerObj((void *) ptr, + $descriptor(T *),1)); } return valueList; } void each() { - swig_type_info* t_type = SWIG_TypeQuery(#T " *"); std::map::iterator i; for (i=self->begin(); i!=self->end(); ++i) { T* val = &(i->second); VALUE entry = rb_ary_new2(2); 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,1,x); rb_yield(entry); @@ -619,13 +619,13 @@ namespace std { } VALUE keys() { VALUE keyList = rb_ary_new2(self->size()); - swig_type_info* type = SWIG_TypeQuery(#K " *"); std::map::iterator i; unsigned int j; for (i=self->begin(), j=0; i!=self->end(); ++i, ++j) { K* ptr = new K(i->first); rb_ary_store(keyList,j, - SWIG_NewPointerObj((void *) ptr,type,1)); + SWIG_NewPointerObj((void *) ptr, + $descriptor(K *),1)); } return keyList; } @@ -640,12 +640,12 @@ namespace std { return valueList; } void each() { - swig_type_info* k_type = SWIG_TypeQuery(#K " *"); std::map::iterator i; for (i=self->begin(); i!=self->end(); ++i) { K* key = new K(i->first); 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); rb_ary_store(entry,0,k); rb_ary_store(entry,1,x); diff --git a/Lib/ruby/std_vector.i b/Lib/ruby/std_vector.i index ed5555e1c..e6fe64316 100644 --- a/Lib/ruby/std_vector.i +++ b/Lib/ruby/std_vector.i @@ -203,10 +203,10 @@ namespace std { throw std::out_of_range("vector index out of range"); } void each() { - swig_type_info* type = SWIG_TypeQuery(#T " *"); for (unsigned int i=0; isize(); i++) { T* x = &((*self)[i]); - rb_yield(SWIG_NewPointerObj((void *) x, type, 0)); + rb_yield(SWIG_NewPointerObj((void *) x, + $descriptor(T *), 0)); } } }