+#if !defined(__VISUALC__) || __VISUALC__ >= 1300 // == !VC6
+
+template<class T>
+class wxList_SortFunction
+{
+public:
+ wxList_SortFunction(wxSortCompareFunction f) : m_f(f) { }
+ bool operator()(const T& i1, const T& i2)
+ { return m_f((T*)&i1, (T*)&i2) < 0; }
+private:
+ wxSortCompareFunction m_f;
+};
+
+#define WX_LIST_SORTFUNCTION( elT, f ) wxList_SortFunction<elT>(f)
+#define WX_LIST_VC6_WORKAROUND(elT, liT, decl)
+
+#else // if defined( __VISUALC__ ) && __VISUALC__ < 1300 // == VC6
+
+#define WX_LIST_SORTFUNCTION( elT, f ) std::greater<elT>( f )
+#define WX_LIST_VC6_WORKAROUND(elT, liT, decl) \
+ decl liT; \
+ \
+ /* Workaround for broken VC6 STL incorrectly requires a std::greater<> */ \
+ /* to be passed into std::list::sort() */ \
+ template <> \
+ struct std::greater<elT> \
+ { \
+ private: \
+ wxSortCompareFunction m_CompFunc; \
+ public: \
+ greater( wxSortCompareFunction compfunc = NULL ) \
+ : m_CompFunc( compfunc ) {} \
+ bool operator()(const elT X, const elT Y) const \
+ { \
+ return m_CompFunc ? \
+ ( m_CompFunc( wxListCastElementToVoidPtr(X), \
+ wxListCastElementToVoidPtr(Y) ) < 0 ) : \
+ ( X > Y ); \
+ } \
+ };
+
+// helper for std::greater<elT> above:
+template<typename T>
+inline const void *wxListCastElementToVoidPtr(const T* ptr) { return ptr; }
+inline const void *wxListCastElementToVoidPtr(const wxString& str)
+ { return (const char*)str; }
+
+#endif // VC6/!VC6
+
+/*
+ Note 1: the outer helper class _WX_LIST_HELPER_##liT below is a workaround
+ for mingw 3.2.3 compiler bug that prevents a static function of liT class
+ from being exported into dll. A minimal code snippet reproducing the bug:
+
+ struct WXDLLIMPEXP_CORE Foo
+ {
+ static void Bar();
+ struct SomeInnerClass
+ {
+ friend class Foo; // comment this out to make it link
+ };
+ ~Foo()
+ {
+ Bar();
+ }
+ };
+
+ The program does not link under mingw_gcc 3.2.3 producing undefined
+ reference to Foo::Bar() function
+
+
+ Note 2: the EmptyList is needed to allow having a NULL pointer-like
+ invalid iterator. We used to use just an uninitialized iterator object
+ instead but this fails with some debug/checked versions of STL, notably the
+ glibc version activated with _GLIBCXX_DEBUG, so we need to have a separate
+ invalid iterator.
+ */
+
+// the real wxList-class declaration
+#define WX_DECLARE_LIST_XO(elT, liT, decl) \
+ decl _WX_LIST_HELPER_##liT \