diff --git a/include/wx/arrstr.h b/include/wx/arrstr.h index cdba3806d3..14c291b249 100644 --- a/include/wx/arrstr.h +++ b/include/wx/arrstr.h @@ -91,6 +91,18 @@ public: #else // if !wxUSE_STL +// this shouldn't be defined for compilers not supporting template methods or +// without std::distance() -- and if all of the currently supported compilers +// do have it, then it can just be removed and wxHAS_VECTOR_TEMPLATE_ASSIGN +// code always used +#define wxHAS_VECTOR_TEMPLATE_ASSIGN + +#ifdef wxHAS_VECTOR_TEMPLATE_ASSIGN + #include "wx/beforestd.h" + #include + #include "wx/afterstd.h" +#endif // wxHAS_VECTOR_TEMPLATE_ASSIGN + class WXDLLIMPEXP_BASE wxArrayString { public: @@ -265,7 +277,26 @@ public: wxArrayString(const_iterator first, const_iterator last) { Init(false); assign(first, last); } wxArrayString(size_type n, const_reference v) { Init(false); assign(n, v); } - void assign(const_iterator first, const_iterator last); + +#ifdef wxHAS_VECTOR_TEMPLATE_ASSIGN + template + void assign(Iterator first, Iterator last) + { + clear(); + reserve(std::distance(first, last)); + for(; first != last; ++first) + push_back(*first); + } +#else // !wxHAS_VECTOR_TEMPLATE_ASSIGN + void assign(const_iterator first, const_iterator last) + { + clear(); + reserve(last - first); + for(; first != last; ++first) + push_back(*first); + } +#endif // wxHAS_VECTOR_TEMPLATE_ASSIGN/!wxHAS_VECTOR_TEMPLATE_ASSIGN + void assign(size_type n, const_reference v) { clear(); Add(v, n); } reference back() { return *(end() - 1); } diff --git a/interface/wx/arrstr.h b/interface/wx/arrstr.h index 228126f769..46d3fed6b6 100644 --- a/interface/wx/arrstr.h +++ b/interface/wx/arrstr.h @@ -41,7 +41,10 @@ a specialization of wxArray class for the wxString member data: it is not implemented like this, but it does have all of the wxArray functions. - @todo what about stl? how does it integrate? + It also has the full set of std::vector compatible + methods, including nested @c iterator and @c const_iterator classes which + should be used in the new code for forward compatibility with the future + wxWidgets versions. @library{wxbase} @category{containers} diff --git a/src/common/arrstr.cpp b/src/common/arrstr.cpp index bb22e7e88c..fa303bd756 100644 --- a/src/common/arrstr.cpp +++ b/src/common/arrstr.cpp @@ -378,13 +378,6 @@ void wxArrayString::Remove(const wxString& sz) RemoveAt(iIndex); } -void wxArrayString::assign(const_iterator first, const_iterator last) -{ - reserve(last - first); - for(; first != last; ++first) - push_back(*first); -} - // ---------------------------------------------------------------------------- // sorting // ---------------------------------------------------------------------------- diff --git a/tests/arrays/arrays.cpp b/tests/arrays/arrays.cpp index a5a26644f3..0913b8ab8e 100644 --- a/tests/arrays/arrays.cpp +++ b/tests/arrays/arrays.cpp @@ -314,6 +314,19 @@ void ArraysTestCase::wxStringArrayTest() _T("a") , _T("a") , _T("a") ) ); + + a5.assign(a1.end(), a1.end()); + CPPUNIT_ASSERT( a5.empty() ); + + a5.assign(a1.begin(), a1.end()); + CPPUNIT_ASSERT( a5 == a1 ); + +#ifdef wxHAS_VECTOR_TEMPLATE_ASSIGN + const wxString months[] = { "Jan", "Feb", "Mar" }; + a5.assign(months, months + WXSIZEOF(months)); + CPPUNIT_ASSERT_EQUAL( WXSIZEOF(months), a5.size() ); + CPPUNIT_ASSERT( COMPARE_3_VALUES(a5, "Jan", "Feb", "Mar") ); +#endif // wxHAS_VECTOR_TEMPLATE_ASSIGN } void ArraysTestCase::wxStringArraySplitTest()