+}                                                                           \
+                                                                            \
+void name::assign(const_iterator first, const_iterator last)                \
+{                                                                           \
+  clear();                                                                  \
+  reserve(last - first);                                                    \
+  for(; first != last; ++first)                                             \
+    push_back(*first);                                                      \
+}                                                                           \
+                                                                            \
+void name::assign(size_type n, const_reference v)                           \
+{                                                                           \
+  clear();                                                                  \
+  reserve(n);                                                               \
+  for( size_type i = 0; i < n; ++i )                                        \
+    push_back(v);                                                           \
+}                                                                           \
+                                                                            \
+void name::insert(iterator it, const_iterator first, const_iterator last)   \
+{                                                                           \
+  size_t nInsert = last - first, nIndex = it - begin();                     \
+  if (nInsert == 0)                                                         \
+      return;                                                               \
+  Grow(nInsert);                                                            \
+                                                                            \
+  memmove(&m_pItems[nIndex + nInsert], &m_pItems[nIndex],                   \
+          (m_nCount - nIndex)*sizeof(T));                                   \
+  for (size_t i = 0; i < nInsert; ++i, ++it, ++first)                       \
+      *it = *first;                                                         \
+  m_nCount += nInsert;                                                      \
+}
+
+#ifdef __INTELC__
+    #pragma warning(push)
+    #pragma warning(disable: 1684)
+    #pragma warning(disable: 1572)
+#endif
+
+_WX_DEFINE_BASEARRAY(const void *, wxBaseArrayPtrVoid)
+_WX_DEFINE_BASEARRAY(char,         wxBaseArrayChar)
+_WX_DEFINE_BASEARRAY(short,        wxBaseArrayShort)
+_WX_DEFINE_BASEARRAY(int,          wxBaseArrayInt)
+_WX_DEFINE_BASEARRAY(long,         wxBaseArrayLong)
+_WX_DEFINE_BASEARRAY(size_t,       wxBaseArraySizeT)
+_WX_DEFINE_BASEARRAY(double,       wxBaseArrayDouble)
+
+#ifdef __INTELC__
+    #pragma warning(pop)
+#endif
+
+#else // wxUSE_STL
+
+#include "wx/arrstr.h"
+
+#include "wx/beforestd.h"
+#include <functional>
+#include "wx/afterstd.h"
+
+// some compilers (Sun CC being the only known example) distinguish between
+// extern "C" functions and the functions with C++ linkage and ptr_fun and
+// wxStringCompareLess can't take wxStrcmp/wxStricmp directly as arguments in
+// this case, we need the wrappers below to make this work
+struct wxStringCmp
+{
+    typedef wxString first_argument_type;
+    typedef wxString second_argument_type;
+    typedef int result_type;
+
+    int operator()(const wxString& s1, const wxString& s2) const
+    {
+        return s1.compare(s2);
+    }
+};
+
+struct wxStringCmpNoCase
+{
+    typedef wxString first_argument_type;
+    typedef wxString second_argument_type;
+    typedef int result_type;
+
+    int operator()(const wxString& s1, const wxString& s2) const
+    {
+        return s1.CmpNoCase(s2);
+    }
+};
+
+int wxArrayString::Index(const wxString& str, bool bCase, bool WXUNUSED(bFromEnd)) const
+{
+    wxArrayString::const_iterator it;
+
+    if (bCase)
+    {
+        it = std::find_if(begin(), end(),
+                          std::not1(
+                              std::bind2nd(
+                                  wxStringCmp(), str)));
+    }
+    else // !bCase
+    {
+        it = std::find_if(begin(), end(),
+                          std::not1(
+                              std::bind2nd(
+                                  wxStringCmpNoCase(), str)));
+    }
+
+    return it == end() ? wxNOT_FOUND : it - begin();