#include <vector>
#include <algorithm>
#include "wx/afterstd.h"
- #if defined(__WXMSW__) && defined(__MINGW32__)
- #include "wx/msw/winundef.h"
- #endif
#endif
/*
#if wxUSE_STL
+template<class T>
+class WXDLLIMPEXP_BASE wxArray_SortFunction
+{
+public:
+ typedef int (wxCMPFUNC_CONV *CMPFUNC)(T* pItem1, T* pItem2);
+
+ wxArray_SortFunction(CMPFUNC f) : m_f(f) { }
+ bool operator()(const T& i1, const T& i2)
+ { return m_f((T*)&i1, (T*)&i2) < 0; }
+private:
+ CMPFUNC m_f;
+};
+
+template<class T, typename F>
+class WXDLLIMPEXP_BASE wxSortedArray_SortFunction
+{
+public:
+ typedef F CMPFUNC;
+
+ wxSortedArray_SortFunction(CMPFUNC f) : m_f(f) { }
+ bool operator()(const T& i1, const T& i2)
+ { return m_f(i1, i2) < 0; }
+private:
+ CMPFUNC m_f;
+};
+
#define _WX_DECLARE_BASEARRAY(T, name, classexp) \
+ typedef int (wxCMPFUNC_CONV *CMPFUN##name)(T pItem1, T pItem2); \
+ typedef wxSortedArray_SortFunction<T, CMPFUN##name> name##_Predicate; \
+ _WX_DECLARE_BASEARRAY_2(T, name, name##_Predicate, classexp)
+
+#define _WX_DECLARE_BASEARRAY_2(T, name, predicate, classexp) \
classexp name : public std::vector<T> \
{ \
+ typedef predicate Predicate; \
+ typedef predicate::CMPFUNC SCMPFUNC; \
+ typedef wxArray_SortFunction<T>::CMPFUNC CMPFUNC; \
public: \
void Empty() { clear(); } \
void Clear() { clear(); } \
size_t IndexForInsert(T lItem, CMPFUNC fnCompare) const; \
void Add(T lItem, size_t nInsert = 1) \
{ insert(end(), nInsert, lItem); } \
- void Add(T lItem, CMPFUNC fnCompare); \
+ size_t Add(T lItem, CMPFUNC fnCompare); \
void Insert(T lItem, size_t uiIndex, size_t nInsert = 1) \
{ insert(begin() + uiIndex, nInsert, lItem); } \
void Remove(T lItem); \
\
void Sort(CMPFUNC fCmp) \
{ \
- Predicate p(fCmp); \
+ wxArray_SortFunction<T> p(fCmp); \
std::sort(begin(), end(), p); \
} \
-private: \
- class Predicate \
- { \
- typedef CMPFUNC fnc; \
- fnc m_f; \
- public: \
- Predicate(fnc f) : m_f(f) { } \
- bool operator()(const T& i1, const T& i2) \
- { return m_f((T*)&i1, (T*)&i2) < 0; /* const cast */ } \
- }; \
}
#else // if !wxUSE_STL
#define _WX_DECLARE_BASEARRAY(T, name, classexp) \
classexp name \
{ \
+ typedef CMPFUNC SCMPFUNC; /* for compatibility wuth wxUSE_STL */ \
public: \
name(); \
name(const name& array); \
int Index(T lItem, CMPFUNC fnCompare) const; \
size_t IndexForInsert(T lItem, CMPFUNC fnCompare) const; \
void Add(T lItem, size_t nInsert = 1); \
- void Add(T lItem, CMPFUNC fnCompare); \
+ size_t Add(T lItem, CMPFUNC fnCompare); \
void Insert(T lItem, size_t uiIndex, size_t nInsert = 1); \
void Remove(T lItem); \
void RemoveAt(size_t uiIndex, size_t nRemove = 1); \
typedef value_type& reference; \
typedef value_type* pointer; \
typedef reverse_iterator itor; \
- friend itor operator+(int o, const itor& it); \
- friend itor operator+(const itor& it, int o); \
- friend itor operator-(const itor& it, int o); \
- friend difference_type operator -(const itor& i1, const itor& i2);\
+ friend inline itor operator+(int o, const itor& it) \
+ { return it.m_ptr - o; } \
+ friend inline itor operator+(const itor& it, int o) \
+ { return it.m_ptr - o; } \
+ friend inline itor operator-(const itor& it, int o) \
+ { return it.m_ptr + o; } \
+ friend inline difference_type operator-(const itor& i1, \
+ const itor& i2) \
+ { return i1.m_ptr - i2.m_ptr; } \
+ \
public: \
pointer m_ptr; \
reverse_iterator() : m_ptr(NULL) { } \
typedef const value_type& reference; \
typedef const value_type* pointer; \
typedef const_reverse_iterator itor; \
- friend itor operator+(int o, const itor& it); \
- friend itor operator+(const itor& it, int o); \
- friend itor operator-(const itor& it, int o); \
- friend difference_type operator -(const itor& i1, const itor& i2);\
+ friend inline itor operator+(int o, const itor& it) \
+ { return it.m_ptr - o; } \
+ friend inline itor operator+(const itor& it, int o) \
+ { return it.m_ptr - o; } \
+ friend inline itor operator-(const itor& it, int o) \
+ { return it.m_ptr + o; } \
+ friend inline difference_type operator-(const itor& i1, \
+ const itor& i2) \
+ { return i1.m_ptr - i2.m_ptr; } \
+ \
public: \
pointer m_ptr; \
const_reverse_iterator() : m_ptr(NULL) { } \
void reserve(size_type n) { base::reserve(n); }; \
void resize(size_type n, value_type v = value_type()); \
size_type size() const { return base::size(); } \
-}; \
- \
-inline name::reverse_iterator operator+(int o, const name::reverse_iterator& it) { return it.m_ptr - o; } \
-inline name::reverse_iterator operator+(const name::reverse_iterator& it, int o) { return it.m_ptr - o; } \
-inline name::reverse_iterator operator-(const name::reverse_iterator& it, int o) { return it.m_ptr + o; } \
-inline name::difference_type operator -(const name::reverse_iterator& i1, \
- const name::reverse_iterator& i2) \
- { return i1.m_ptr - i2.m_ptr; } \
- \
-inline name::const_reverse_iterator operator+(int o, const name::const_reverse_iterator& it) { return it.m_ptr - o; } \
-inline name::const_reverse_iterator operator+(const name::const_reverse_iterator& it, int o) { return it.m_ptr - o; } \
-inline name::const_reverse_iterator operator-(const name::const_reverse_iterator& it, int o) { return it.m_ptr + o; } \
-inline name::difference_type operator -(const name::const_reverse_iterator& i1,\
- const name::const_reverse_iterator& i2) \
- { return i1.m_ptr - i2.m_ptr; } \
+}
+
#endif // !wxUSE_STL
// cannot handle types with size greater than pointer because of sorting
// ----------------------------------------------------------------------------
-#define _WX_DEFINE_SORTED_TYPEARRAY(T, name, base, defcomp, classexp) \
-typedef int (CMPFUNC_CONV *SCMPFUNC##T)(T pItem1, T pItem2); \
-_WX_DEFINE_SORTED_TYPEARRAY_2(T, name, base, defcomp, classexp, SCMPFUNC##T)
-
#define _WX_DEFINE_SORTED_TYPEARRAY_2(T, name, base, defcomp, classexp, comptype)\
-wxCOMPILE_TIME_ASSERT2(sizeof(T) <= sizeof(void *), \
+wxCOMPILE_TIME_ASSERT2(sizeof(T) <= sizeof(base::base_type), \
TypeTooBigToBeStoredInSorted##base, \
name); \
classexp name : public base \
{ \
+ typedef comptype SCMPFUNC; \
public: \
name(comptype fn defcomp) { m_fnCompare = fn; } \
\
void AddAt(T item, size_t index) \
{ base::insert(begin() + index, item); } \
\
- void Add(T Item) \
- { base::Add(Item, (CMPFUNC)m_fnCompare); } \
+ size_t Add(T Item) \
+ { return base::Add(Item, (CMPFUNC)m_fnCompare); } \
\
void RemoveAt(size_t uiIndex, size_t nRemove = 1) \
{ base::erase(begin() + uiIndex, begin() + uiIndex + nRemove); } \
#define WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, base, expmode) \
typedef T _wxArray##name; \
- _WX_DEFINE_SORTED_TYPEARRAY(_wxArray##name, name, base, \
- wxARRAY_EMPTY_CMP, class expmode)
+ typedef int (CMPFUNC_CONV *SCMPFUNC##name)(T pItem1, T pItem2); \
+ _WX_DEFINE_SORTED_TYPEARRAY_2(_wxArray##name, name, base, \
+ wxARRAY_EMPTY_CMP, class expmode, SCMPFUNC##name)
// ----------------------------------------------------------------------------
// WX_DEFINE_SORTED_TYPEARRAY_CMP: exactly the same as above but the comparison
#define WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, base, \
expmode) \
typedef T _wxArray##name; \
- _WX_DEFINE_SORTED_TYPEARRAY(_wxArray##name, name, base, = cmpfunc, \
- class expmode)
+ typedef int (CMPFUNC_CONV *SCMPFUNC##name)(T pItem1, T pItem2); \
+ _WX_DEFINE_SORTED_TYPEARRAY_2(_wxArray##name, name, base, = cmpfunc, \
+ class expmode, SCMPFUNC##name)
// ----------------------------------------------------------------------------
// WX_DECLARE_OBJARRAY(T, name): this macro generates a new array class