X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9127686895aa155a4c5b3c5f4feaeaed15626936..58ce18f2fdadecffb21e27555115af708325cf18:/include/wx/arrstr.h diff --git a/include/wx/arrstr.h b/include/wx/arrstr.h index ddb11c0a31..f9e297dd33 100644 --- a/include/wx/arrstr.h +++ b/include/wx/arrstr.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: include/wx/arrstr.h +// Name: wx/arrstr.h // Purpose: wxArrayString class // Author: Mattia Barbon and Vadim Zeitlin // Modified by: @@ -87,10 +87,37 @@ public: } int Index(const wxString& str, bool bCase = true, bool bFromEnd = false) const; + +private: + void Insert() + { + wxFAIL_MSG( "wxSortedArrayString::Insert() is not to be used" ); + } + + void Sort() + { + wxFAIL_MSG( "wxSortedArrayString::Sort() is not to be used" ); + } }; #else // if !wxUSE_STL +// this shouldn't be defined for compilers not supporting template methods or +// without std::distance() +// +// FIXME-VC6: currently it's only not defined for VC6 in DLL build as it +// doesn't export template methods from DLL correctly so even though +// it compiles them fine, we get link errors when using wxArrayString +#if !defined(__VISUALC6__) || !(defined(WXMAKINGDLL) || defined(WXUSINGDLL)) + #define wxHAS_VECTOR_TEMPLATE_ASSIGN +#endif + +#ifdef wxHAS_VECTOR_TEMPLATE_ASSIGN + #include "wx/beforestd.h" + #include + #include "wx/afterstd.h" +#endif // wxHAS_VECTOR_TEMPLATE_ASSIGN + class WXDLLIMPEXP_BASE wxArrayString { public: @@ -109,11 +136,11 @@ public: // // NB: the reason for using int and not bool is that like this we can avoid // using this ctor for implicit conversions from "const char *" (which - // we'd like to be implicitly converted to wxString instead!) - // - // of course, using explicit would be even better - if all compilers - // supported it... - wxArrayString(int autoSort) { Init(autoSort != 0); } + // we'd like to be implicitly converted to wxString instead!). This + // wouldn't be needed if the 'explicit' keyword was supported by all + // compilers, or if this was protected ctor for wxSortedArrayString, + // but we're stuck with it now. + wxEXPLICIT wxArrayString(int autoSort) { Init(autoSort != 0); } // C string array ctor wxArrayString(size_t sz, const char** a); wxArrayString(size_t sz, const wchar_t** a); @@ -149,7 +176,7 @@ public: wxString& Item(size_t nIndex) const { wxASSERT_MSG( nIndex < m_nCount, - _T("wxArrayString: index out of bounds") ); + wxT("wxArrayString: index out of bounds") ); return m_pItems[nIndex]; } @@ -160,7 +187,7 @@ public: wxString& Last() const { wxASSERT_MSG( !IsEmpty(), - _T("wxArrayString: index out of bounds") ); + wxT("wxArrayString: index out of bounds") ); return Item(GetCount() - 1); } @@ -265,7 +292,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); } @@ -295,30 +341,20 @@ 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) { - // not sure if we can rely on having std::swap() everywhere so do it - // manually - const size_t savedSize = m_nSize; - const size_t savedCount = m_nCount; - wxString * const savedItems = m_pItems; - const bool savedAutoSort = m_autoSort; - - m_nSize = other.m_nSize; - m_nCount = other.m_nCount; - m_pItems = other.m_pItems; - m_autoSort = other.m_autoSort; - - other.m_nSize = savedSize; - other.m_nCount = savedCount; - other.m_pItems = savedItems; - other.m_autoSort = savedAutoSort; + 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: @@ -367,6 +403,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; @@ -463,7 +507,7 @@ private: const wxArrayString * array; } m_data; - DECLARE_NO_ASSIGN_CLASS(wxArrayStringsAdapter) + wxDECLARE_NO_ASSIGN_CLASS(wxArrayStringsAdapter); }; #endif // _WX_ARRSTR_H