aboutsummaryrefslogtreecommitdiff
path: root/Lib
diff options
context:
space:
mode:
authorWilliam S Fulton <wsf@fultondesigns.co.uk>2013-07-30 07:34:39 +0100
committerWilliam S Fulton <wsf@fultondesigns.co.uk>2013-08-06 07:02:49 +0100
commit80f8d1d9225b5fcb66b774e8859637f14e11afd8 (patch)
treeea2e1d865082696bde0feb3cdec43bf8c6927309 /Lib
parent5f1fff1849285f46cfaffadff0352cf976ea4c52 (diff)
downloadswig-80f8d1d9225b5fcb66b774e8859637f14e11afd8.tar.gz
Fix for missing C++ code in std::multimap wrappers.
%template for a std::multimap generated uncompilable code unless a %template for a std::map of the same template types was also coded up. This patch is needed in conjunction with previous commit - 5f1fff1849285f46cfaffadff0352cf976ea4c52 Closes #64 Closes #65
Diffstat (limited to 'Lib')
-rw-r--r--Lib/octave/std_map.i135
-rw-r--r--Lib/python/std_map.i142
-rw-r--r--Lib/python/std_multimap.i2
-rw-r--r--Lib/ruby/std_map.i123
-rw-r--r--Lib/ruby/std_multimap.i2
5 files changed, 209 insertions, 195 deletions
diff --git a/Lib/octave/std_map.i b/Lib/octave/std_map.i
index 6c476ce53..7b85a548e 100644
--- a/Lib/octave/std_map.i
+++ b/Lib/octave/std_map.i
@@ -2,73 +2,9 @@
%include <octcontainer.swg>
-%fragment("StdMapTraits","header",fragment="StdSequenceTraits")
+%fragment("StdMapCommonTraits","header",fragment="StdSequenceTraits")
{
namespace swig {
- template <class OctSeq, class K, class T >
- inline void
- assign(const OctSeq& octseq, std::map<K,T > *map) {
- typedef typename std::map<K,T>::value_type value_type;
- typename OctSeq::const_iterator it = octseq.begin();
- for (;it != octseq.end(); ++it) {
- map->insert(value_type(it->first, it->second));
- }
- }
-
- template <class K, class T>
- struct traits_asptr<std::map<K,T> > {
- typedef std::map<K,T> map_type;
- static int asptr(octave_value obj, map_type **val) {
- /*
- int res = SWIG_ERROR;
- if (PyDict_Check(obj)) {
- SwigVar_PyObject items = PyObject_CallMethod(obj,(char *)"items",NULL);
- res = traits_asptr_stdseq<std::map<K,T>, std::pair<K, T> >::asptr(items, val);
- } else {
- map_type *p;
- res = SWIG_ConvertPtr(obj,(void**)&p,swig::type_info<map_type>(),0);
- if (SWIG_IsOK(res) && val) *val = p;
- }
- return res;
- */
- return SWIG_ERROR;
- }
- };
-
- template <class K, class T >
- struct traits_from<std::map<K,T> > {
- typedef std::map<K,T> map_type;
- typedef typename map_type::const_iterator const_iterator;
- typedef typename map_type::size_type size_type;
-
- static octave_value from(const map_type& map) {
- /*
- swig_type_info *desc = swig::type_info<map_type>();
- if (desc && desc->clientdata) {
- return SWIG_NewPointerObj(new map_type(map), desc, SWIG_POINTER_OWN);
- } else {
- size_type size = map.size();
- int pysize = (size <= (size_type) INT_MAX) ? (int) size : -1;
- if (pysize < 0) {
- SWIG_PYTHON_THREAD_BEGIN_BLOCK;
- PyErr_SetString(PyExc_OverflowError,
- "map size not valid in python");
- SWIG_PYTHON_THREAD_END_BLOCK;
- return NULL;
- }
- PyObject *obj = PyDict_New();
- for (const_iterator i= map.begin(); i!= map.end(); ++i) {
- swig::SwigVar_PyObject key = swig::from(i->first);
- swig::SwigVar_PyObject val = swig::from(i->second);
- PyDict_SetItem(obj, key, val);
- }
- return obj;
- }
- */
- return octave_value();
- }
- };
-
template <class ValueType>
struct from_key_oper
{
@@ -138,6 +74,75 @@
}
}
+%fragment("StdMapTraits","header",fragment="StdMapCommonTraits")
+{
+ namespace swig {
+ template <class OctSeq, class K, class T >
+ inline void
+ assign(const OctSeq& octseq, std::map<K,T > *map) {
+ typedef typename std::map<K,T>::value_type value_type;
+ typename OctSeq::const_iterator it = octseq.begin();
+ for (;it != octseq.end(); ++it) {
+ map->insert(value_type(it->first, it->second));
+ }
+ }
+
+ template <class K, class T>
+ struct traits_asptr<std::map<K,T> > {
+ typedef std::map<K,T> map_type;
+ static int asptr(octave_value obj, map_type **val) {
+ /*
+ int res = SWIG_ERROR;
+ if (PyDict_Check(obj)) {
+ SwigVar_PyObject items = PyObject_CallMethod(obj,(char *)"items",NULL);
+ res = traits_asptr_stdseq<std::map<K,T>, std::pair<K, T> >::asptr(items, val);
+ } else {
+ map_type *p;
+ res = SWIG_ConvertPtr(obj,(void**)&p,swig::type_info<map_type>(),0);
+ if (SWIG_IsOK(res) && val) *val = p;
+ }
+ return res;
+ */
+ return SWIG_ERROR;
+ }
+ };
+
+ template <class K, class T >
+ struct traits_from<std::map<K,T> > {
+ typedef std::map<K,T> map_type;
+ typedef typename map_type::const_iterator const_iterator;
+ typedef typename map_type::size_type size_type;
+
+ static octave_value from(const map_type& map) {
+ /*
+ swig_type_info *desc = swig::type_info<map_type>();
+ if (desc && desc->clientdata) {
+ return SWIG_NewPointerObj(new map_type(map), desc, SWIG_POINTER_OWN);
+ } else {
+ size_type size = map.size();
+ int pysize = (size <= (size_type) INT_MAX) ? (int) size : -1;
+ if (pysize < 0) {
+ SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+ PyErr_SetString(PyExc_OverflowError,
+ "map size not valid in python");
+ SWIG_PYTHON_THREAD_END_BLOCK;
+ return NULL;
+ }
+ PyObject *obj = PyDict_New();
+ for (const_iterator i= map.begin(); i!= map.end(); ++i) {
+ swig::SwigVar_PyObject key = swig::from(i->first);
+ swig::SwigVar_PyObject val = swig::from(i->second);
+ PyDict_SetItem(obj, key, val);
+ }
+ return obj;
+ }
+ */
+ return octave_value();
+ }
+ };
+ }
+}
+
%define %swig_map_common(Map...)
%swig_sequence_iterator(Map);
%swig_container_methods(Map);
diff --git a/Lib/python/std_map.i b/Lib/python/std_map.i
index 37d749790..66ed68da5 100644
--- a/Lib/python/std_map.i
+++ b/Lib/python/std_map.i
@@ -2,7 +2,79 @@
Maps
*/
-%fragment("StdMapTraits","header",fragment="StdSequenceTraits")
+%fragment("StdMapCommonTraits","header",fragment="StdSequenceTraits")
+{
+ namespace swig {
+ template <class ValueType>
+ struct from_key_oper
+ {
+ typedef const ValueType& argument_type;
+ typedef PyObject *result_type;
+ result_type operator()(argument_type v) const
+ {
+ return swig::from(v.first);
+ }
+ };
+
+ template <class ValueType>
+ struct from_value_oper
+ {
+ typedef const ValueType& argument_type;
+ typedef PyObject *result_type;
+ result_type operator()(argument_type v) const
+ {
+ return swig::from(v.second);
+ }
+ };
+
+ template<class OutIterator, class FromOper, class ValueType = typename OutIterator::value_type>
+ struct SwigPyMapIterator_T : SwigPyIteratorClosed_T<OutIterator, ValueType, FromOper>
+ {
+ SwigPyMapIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq)
+ : SwigPyIteratorClosed_T<OutIterator,ValueType,FromOper>(curr, first, last, seq)
+ {
+ }
+ };
+
+
+ template<class OutIterator,
+ class FromOper = from_key_oper<typename OutIterator::value_type> >
+ struct SwigPyMapKeyIterator_T : SwigPyMapIterator_T<OutIterator, FromOper>
+ {
+ SwigPyMapKeyIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq)
+ : SwigPyMapIterator_T<OutIterator, FromOper>(curr, first, last, seq)
+ {
+ }
+ };
+
+ template<typename OutIter>
+ inline SwigPyIterator*
+ make_output_key_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0)
+ {
+ return new SwigPyMapKeyIterator_T<OutIter>(current, begin, end, seq);
+ }
+
+ template<class OutIterator,
+ class FromOper = from_value_oper<typename OutIterator::value_type> >
+ struct SwigPyMapValueITerator_T : SwigPyMapIterator_T<OutIterator, FromOper>
+ {
+ SwigPyMapValueITerator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq)
+ : SwigPyMapIterator_T<OutIterator, FromOper>(curr, first, last, seq)
+ {
+ }
+ };
+
+
+ template<typename OutIter>
+ inline SwigPyIterator*
+ make_output_value_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0)
+ {
+ return new SwigPyMapValueITerator_T<OutIter>(current, begin, end, seq);
+ }
+ }
+}
+
+%fragment("StdMapTraits","header",fragment="StdMapCommonTraits")
{
namespace swig {
template <class SwigPySeq, class K, class T, class Compare, class Alloc >
@@ -73,74 +145,6 @@
}
}
};
-
- template <class ValueType>
- struct from_key_oper
- {
- typedef const ValueType& argument_type;
- typedef PyObject *result_type;
- result_type operator()(argument_type v) const
- {
- return swig::from(v.first);
- }
- };
-
- template <class ValueType>
- struct from_value_oper
- {
- typedef const ValueType& argument_type;
- typedef PyObject *result_type;
- result_type operator()(argument_type v) const
- {
- return swig::from(v.second);
- }
- };
-
- template<class OutIterator, class FromOper, class ValueType = typename OutIterator::value_type>
- struct SwigPyMapIterator_T : SwigPyIteratorClosed_T<OutIterator, ValueType, FromOper>
- {
- SwigPyMapIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq)
- : SwigPyIteratorClosed_T<OutIterator,ValueType,FromOper>(curr, first, last, seq)
- {
- }
- };
-
-
- template<class OutIterator,
- class FromOper = from_key_oper<typename OutIterator::value_type> >
- struct SwigPyMapKeyIterator_T : SwigPyMapIterator_T<OutIterator, FromOper>
- {
- SwigPyMapKeyIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq)
- : SwigPyMapIterator_T<OutIterator, FromOper>(curr, first, last, seq)
- {
- }
- };
-
- template<typename OutIter>
- inline SwigPyIterator*
- make_output_key_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0)
- {
- return new SwigPyMapKeyIterator_T<OutIter>(current, begin, end, seq);
- }
-
- template<class OutIterator,
- class FromOper = from_value_oper<typename OutIterator::value_type> >
- struct SwigPyMapValueITerator_T : SwigPyMapIterator_T<OutIterator, FromOper>
- {
- SwigPyMapValueITerator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq)
- : SwigPyMapIterator_T<OutIterator, FromOper>(curr, first, last, seq)
- {
- }
- };
-
-
- template<typename OutIter>
- inline SwigPyIterator*
- make_output_value_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0)
- {
- return new SwigPyMapValueITerator_T<OutIter>(current, begin, end, seq);
- }
-
}
}
diff --git a/Lib/python/std_multimap.i b/Lib/python/std_multimap.i
index 8a240ae10..c81e2ac5d 100644
--- a/Lib/python/std_multimap.i
+++ b/Lib/python/std_multimap.i
@@ -3,7 +3,7 @@
*/
%include <std_map.i>
-%fragment("StdMultimapTraits","header",fragment="StdSequenceTraits")
+%fragment("StdMultimapTraits","header",fragment="StdMapCommonTraits")
{
namespace swig {
template <class SwigPySeq, class K, class T >
diff --git a/Lib/ruby/std_map.i b/Lib/ruby/std_map.i
index e23f1c31b..f706ca873 100644
--- a/Lib/ruby/std_map.i
+++ b/Lib/ruby/std_map.i
@@ -1,67 +1,9 @@
//
// Maps
//
-%fragment("StdMapTraits","header",fragment="StdSequenceTraits")
+%fragment("StdMapCommonTraits","header",fragment="StdSequenceTraits")
{
namespace swig {
- template <class RubySeq, class K, class T >
- inline void
- assign(const RubySeq& rubyseq, std::map<K,T > *map) {
- typedef typename std::map<K,T>::value_type value_type;
- typename RubySeq::const_iterator it = rubyseq.begin();
- for (;it != rubyseq.end(); ++it) {
- map->insert(value_type(it->first, it->second));
- }
- }
-
- template <class K, class T>
- struct traits_asptr<std::map<K,T> > {
- typedef std::map<K,T> map_type;
- static int asptr(VALUE obj, map_type **val) {
- int res = SWIG_ERROR;
- if ( TYPE(obj) == T_HASH ) {
- static ID id_to_a = rb_intern("to_a");
- VALUE items = rb_funcall(obj, id_to_a, 0);
- res = traits_asptr_stdseq<std::map<K,T>, std::pair<K, T> >::asptr(items, val);
- } else {
- map_type *p;
- res = SWIG_ConvertPtr(obj,(void**)&p,swig::type_info<map_type>(),0);
- if (SWIG_IsOK(res) && val) *val = p;
- }
- return res;
- }
- };
-
- template <class K, class T >
- struct traits_from<std::map<K,T> > {
- typedef std::map<K,T> map_type;
- typedef typename map_type::const_iterator const_iterator;
- typedef typename map_type::size_type size_type;
-
- static VALUE from(const map_type& map) {
- swig_type_info *desc = swig::type_info<map_type>();
- if (desc && desc->clientdata) {
- return SWIG_NewPointerObj(new map_type(map), desc, SWIG_POINTER_OWN);
- } else {
- size_type size = map.size();
- int rubysize = (size <= (size_type) INT_MAX) ? (int) size : -1;
- if (rubysize < 0) {
- SWIG_RUBY_THREAD_BEGIN_BLOCK;
- rb_raise( rb_eRuntimeError, "map size not valid in Ruby");
- SWIG_RUBY_THREAD_END_BLOCK;
- return Qnil;
- }
- VALUE obj = rb_hash_new();
- for (const_iterator i= map.begin(); i!= map.end(); ++i) {
- VALUE key = swig::from(i->first);
- VALUE val = swig::from(i->second);
- rb_hash_aset(obj, key, val);
- }
- return obj;
- }
- }
- };
-
template <class ValueType>
struct from_key_oper
{
@@ -134,6 +76,69 @@
}
}
+%fragment("StdMapTraits","header",fragment="StdMapCommonTraits")
+{
+ namespace swig {
+ template <class RubySeq, class K, class T >
+ inline void
+ assign(const RubySeq& rubyseq, std::map<K,T > *map) {
+ typedef typename std::map<K,T>::value_type value_type;
+ typename RubySeq::const_iterator it = rubyseq.begin();
+ for (;it != rubyseq.end(); ++it) {
+ map->insert(value_type(it->first, it->second));
+ }
+ }
+
+ template <class K, class T>
+ struct traits_asptr<std::map<K,T> > {
+ typedef std::map<K,T> map_type;
+ static int asptr(VALUE obj, map_type **val) {
+ int res = SWIG_ERROR;
+ if ( TYPE(obj) == T_HASH ) {
+ static ID id_to_a = rb_intern("to_a");
+ VALUE items = rb_funcall(obj, id_to_a, 0);
+ res = traits_asptr_stdseq<std::map<K,T>, std::pair<K, T> >::asptr(items, val);
+ } else {
+ map_type *p;
+ res = SWIG_ConvertPtr(obj,(void**)&p,swig::type_info<map_type>(),0);
+ if (SWIG_IsOK(res) && val) *val = p;
+ }
+ return res;
+ }
+ };
+
+ template <class K, class T >
+ struct traits_from<std::map<K,T> > {
+ typedef std::map<K,T> map_type;
+ typedef typename map_type::const_iterator const_iterator;
+ typedef typename map_type::size_type size_type;
+
+ static VALUE from(const map_type& map) {
+ swig_type_info *desc = swig::type_info<map_type>();
+ if (desc && desc->clientdata) {
+ return SWIG_NewPointerObj(new map_type(map), desc, SWIG_POINTER_OWN);
+ } else {
+ size_type size = map.size();
+ int rubysize = (size <= (size_type) INT_MAX) ? (int) size : -1;
+ if (rubysize < 0) {
+ SWIG_RUBY_THREAD_BEGIN_BLOCK;
+ rb_raise( rb_eRuntimeError, "map size not valid in Ruby");
+ SWIG_RUBY_THREAD_END_BLOCK;
+ return Qnil;
+ }
+ VALUE obj = rb_hash_new();
+ for (const_iterator i= map.begin(); i!= map.end(); ++i) {
+ VALUE key = swig::from(i->first);
+ VALUE val = swig::from(i->second);
+ rb_hash_aset(obj, key, val);
+ }
+ return obj;
+ }
+ }
+ };
+ }
+}
+
%define %swig_map_common(Map...)
%swig_container_methods(%arg(Map));
// %swig_sequence_iterator(%arg(Map));
diff --git a/Lib/ruby/std_multimap.i b/Lib/ruby/std_multimap.i
index 31795c768..3e06ee12c 100644
--- a/Lib/ruby/std_multimap.i
+++ b/Lib/ruby/std_multimap.i
@@ -3,7 +3,7 @@
*/
%include <std_map.i>
-%fragment("StdMultimapTraits","header",fragment="StdSequenceTraits")
+%fragment("StdMultimapTraits","header",fragment="StdMapCommonTraits")
{
namespace swig {
template <class RubySeq, class K, class T >