X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d294c9db889143938d8164df03fef56bdc1ab45e..bcd96979730f8bb56ac220f9092439694d4e0456:/include/wx/list.h diff --git a/include/wx/list.h b/include/wx/list.h index 5714dcd455..2539ab1c10 100644 --- a/include/wx/list.h +++ b/include/wx/list.h @@ -135,15 +135,42 @@ private: #endif // defined( __VISUALC__ ) +/* + Note: 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 WXDLLEXPORT 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 + */ + +// the real wxList-class declaration #define WX_DECLARE_LIST_XO(elT, liT, decl) \ + class WXDLLEXPORT _WX_LIST_HELPER_##liT \ + { \ + typedef elT _WX_LIST_ITEM_TYPE_##liT; \ + public: \ + static void DeleteFunction( _WX_LIST_ITEM_TYPE_##liT X ); \ + }; \ + \ VC6_WORKAROUND(elT, liT, decl) \ decl liT : public std::list \ { \ private: \ bool m_destroy; \ - private: \ - typedef elT _WX_LIST_ITEM_TYPE_##liT; \ - static void DeleteFunction( _WX_LIST_ITEM_TYPE_##liT X ); \ public: \ decl compatibility_iterator \ { \ @@ -269,7 +296,7 @@ private: void Erase( const compatibility_iterator& i ) \ { \ if ( m_destroy ) \ - DeleteFunction( i->GetData() ); \ + _WX_LIST_HELPER_##liT::DeleteFunction( i->GetData() ); \ erase( i.m_iter ); \ } \ bool DeleteNode( const compatibility_iterator& i ) \ @@ -288,7 +315,8 @@ private: void Clear() \ { \ if ( m_destroy ) \ - std::for_each( begin(), end(), DeleteFunction ); \ + std::for_each( begin(), end(), \ + _WX_LIST_HELPER_##liT::DeleteFunction ); \ clear(); \ } \ /* Workaround for broken VC6 std::list::sort() see above */ \ @@ -702,12 +730,12 @@ private: name& operator=(const name& list) \ { Assign(list); return *this; } \ \ - compatibility_iterator GetFirst() const \ + nodetype *GetFirst() const \ { return (nodetype *)wxListBase::GetFirst(); } \ - compatibility_iterator GetLast() const \ + nodetype *GetLast() const \ { return (nodetype *)wxListBase::GetLast(); } \ \ - compatibility_iterator Item(size_t index) const \ + nodetype *Item(size_t index) const \ { return (nodetype *)wxListBase::Item(index); } \ \ T *operator[](size_t index) const \ @@ -716,18 +744,18 @@ private: return node ? (T*)(node->GetData()) : (T*)NULL; \ } \ \ - compatibility_iterator Append(Tbase *object) \ + nodetype *Append(Tbase *object) \ { return (nodetype *)wxListBase::Append(object); } \ - compatibility_iterator Insert(Tbase *object) \ + nodetype *Insert(Tbase *object) \ { return (nodetype *)Insert((nodetype*)NULL, object); } \ - compatibility_iterator Insert(size_t pos, Tbase *object) \ + nodetype *Insert(size_t pos, Tbase *object) \ { return (nodetype *)wxListBase::Insert(pos, object); } \ - compatibility_iterator Insert(nodetype *prev, Tbase *object) \ + nodetype *Insert(nodetype *prev, Tbase *object) \ { return (nodetype *)wxListBase::Insert(prev, object); } \ \ - compatibility_iterator Append(long key, void *object) \ + nodetype *Append(long key, void *object) \ { return (nodetype *)wxListBase::Append(key, object); } \ - compatibility_iterator Append(const wxChar *key, void *object) \ + nodetype *Append(const wxChar *key, void *object) \ { return (nodetype *)wxListBase::Append(key, object); } \ \ nodetype *DetachNode(nodetype *node) \ @@ -736,10 +764,10 @@ private: { return wxListBase::DeleteNode(node); } \ bool DeleteObject(Tbase *object) \ { return wxListBase::DeleteObject(object); } \ - void Erase(compatibility_iterator it) \ + void Erase(nodetype *it) \ { DeleteNode(it); } \ \ - compatibility_iterator Find(const Tbase *object) const \ + nodetype *Find(const Tbase *object) const \ { return (nodetype *)wxListBase::Find(object); } \ \ virtual nodetype *Find(const wxListKey& key) const \