]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/arrstr.h
check for self-assignment in operator=
[wxWidgets.git] / include / wx / arrstr.h
index 4c099c36b20bc33e9ea2c4ef718633619e4f5b3f..14c291b2494d3219dc42027e34754dc1e7e4292f 100644 (file)
@@ -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 <iterator>
+    #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 <class Iterator>
+  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); }
@@ -295,12 +326,21 @@ public:
   void pop_back() { RemoveAt(GetCount() - 1); }
   void push_back(const_reference v) { Add(v); }
   reverse_iterator rbegin() { return reverse_iterator(end() - 1); }
-  const_reverse_iterator rbegin() const;
+  const_reverse_iterator rbegin() const
+    { return const_reverse_iterator(end() - 1); }
   reverse_iterator rend() { return reverse_iterator(begin() - 1); }
-  const_reverse_iterator rend() const;
+  const_reverse_iterator rend() const
+    { return const_reverse_iterator(begin() - 1); }
   void reserve(size_type n) /* base::reserve*/;
   void resize(size_type n, value_type v = value_type());
   size_type size() const { return GetCount(); }
+  void swap(wxArrayString& other)
+  {
+      wxSwap(m_nSize, other.m_nSize);
+      wxSwap(m_nCount, other.m_nCount);
+      wxSwap(m_pItems, other.m_pItems);
+      wxSwap(m_autoSort, other.m_autoSort);
+  }
 
 protected:
   void Init(bool autoSort);             // common part of all ctors
@@ -348,6 +388,14 @@ public:
             m_strings[i] = m_array[i];
         return m_strings;
     }
+
+    wxString* Release()
+    {
+        wxString *r = GetStrings();
+        m_strings = NULL;
+        return r;
+    }
+
 private:
     const wxArrayString& m_array;
     wxString* m_strings;
@@ -444,7 +492,7 @@ private:
         const wxArrayString * array;
     } m_data;
 
-    DECLARE_NO_ASSIGN_CLASS(wxArrayStringsAdapter)
+    wxDECLARE_NO_ASSIGN_CLASS(wxArrayStringsAdapter);
 };
 
 #endif // _WX_ARRSTR_H