diff --git a/Lib/python/pycontainer.swg b/Lib/python/pycontainer.swg index 3d10b9bb8..8463e28f8 100644 --- a/Lib/python/pycontainer.swg +++ b/Lib/python/pycontainer.swg @@ -262,6 +262,13 @@ namespace swig { seq->erase(position); } + template + struct traits_reserve { + static void reserve(Sequence & /*seq*/, typename Sequence::size_type /*n*/) { + // This should be specialized for types that support reserve + } + }; + template inline Sequence* getslice(const Sequence* self, Difference i, Difference j, Py_ssize_t step) { @@ -279,6 +286,7 @@ namespace swig { return new Sequence(sb, se); } else { Sequence *sequence = new Sequence(); + swig::traits_reserve::reserve(*sequence, (jj - ii + step - 1) / step); typename Sequence::const_iterator it = sb; while (it!=se) { sequence->push_back(*it); @@ -289,6 +297,7 @@ namespace swig { } } else { Sequence *sequence = new Sequence(); + swig::traits_reserve::reserve(*sequence, (ii - jj - step - 1) / -step); typename Sequence::const_reverse_iterator sb = self->rbegin(); typename Sequence::const_reverse_iterator se = self->rbegin(); std::advance(sb,size-ii-1); @@ -315,6 +324,7 @@ namespace swig { size_t ssize = jj - ii; if (ssize <= is.size()) { // expanding/staying the same size + swig::traits_reserve::reserve(*self, self->size() - ssize + is.size()); typename Sequence::iterator sb = self->begin(); typename InputSeq::const_iterator isit = is.begin(); std::advance(sb,ii); diff --git a/Lib/python/std_unordered_map.i b/Lib/python/std_unordered_map.i index 97b48af70..894840c6c 100644 --- a/Lib/python/std_unordered_map.i +++ b/Lib/python/std_unordered_map.i @@ -15,6 +15,13 @@ } } + template + struct traits_reserve > { + static void reserve(std::unordered_map &seq, typename std::unordered_map::size_type n) { + seq.reserve(n); + } + }; + template struct traits_asptr > { typedef std::unordered_map unordered_map_type; diff --git a/Lib/python/std_unordered_multimap.i b/Lib/python/std_unordered_multimap.i index aadd15515..2410aa52b 100644 --- a/Lib/python/std_unordered_multimap.i +++ b/Lib/python/std_unordered_multimap.i @@ -16,6 +16,13 @@ } } + template + struct traits_reserve > { + static void reserve(std::unordered_multimap &seq, typename std::unordered_multimap::size_type n) { + seq.reserve(n); + } + }; + template struct traits_asptr > { typedef std::unordered_multimap unordered_multimap_type; diff --git a/Lib/python/std_unordered_multiset.i b/Lib/python/std_unordered_multiset.i index d5b9ff61c..0d9f3d9c6 100644 --- a/Lib/python/std_unordered_multiset.i +++ b/Lib/python/std_unordered_multiset.i @@ -18,6 +18,13 @@ } } + template + struct traits_reserve > { + static void reserve(std::unordered_multiset &seq, typename std::unordered_multiset::size_type n) { + seq.reserve(n); + } + }; + template struct traits_asptr > { static int asptr(PyObject *obj, std::unordered_multiset **m) { diff --git a/Lib/python/std_unordered_set.i b/Lib/python/std_unordered_set.i index a021cb4ed..855a28da5 100644 --- a/Lib/python/std_unordered_set.i +++ b/Lib/python/std_unordered_set.i @@ -16,6 +16,13 @@ } } + template + struct traits_reserve > { + static void reserve(std::unordered_set &seq, typename std::unordered_set::size_type n) { + seq.reserve(n); + } + }; + template struct traits_asptr > { static int asptr(PyObject *obj, std::unordered_set **s) { diff --git a/Lib/python/std_vector.i b/Lib/python/std_vector.i index 3f04a30c7..2ac41a54d 100644 --- a/Lib/python/std_vector.i +++ b/Lib/python/std_vector.i @@ -5,6 +5,13 @@ %fragment("StdVectorTraits","header",fragment="StdSequenceTraits") %{ namespace swig { + template + struct traits_reserve > { + static void reserve(std::vector &seq, typename std::vector::size_type n) { + seq.reserve(n); + } + }; + template struct traits_asptr > { static int asptr(PyObject *obj, std::vector **vec) {