// Author: Julian Smart
// Modified by: VZ at 16/11/98: WX_DECLARE_LIST() and typesafe lists added
// Created: 29/01/98
-// RCS-ID: $Id$
// Copyright: (c) 1998 Julian Smart
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#include "wx/defs.h"
#include "wx/object.h"
#include "wx/string.h"
+#include "wx/vector.h"
-#if wxUSE_STL
+#if wxUSE_STD_CONTAINERS
#include "wx/beforestd.h"
#include <algorithm>
#include <iterator>
class WXDLLIMPEXP_FWD_BASE wxObjectListNode;
typedef wxObjectListNode wxNode;
-#if wxUSE_STL
+#if wxUSE_STD_CONTAINERS
#define wxLIST_COMPATIBILITY
decl _WX_LIST_HELPER_##liT \
{ \
typedef elT _WX_LIST_ITEM_TYPE_##liT; \
+ typedef std::list<elT> BaseListType; \
public: \
+ static BaseListType EmptyList; \
static void DeleteFunction( _WX_LIST_ITEM_TYPE_##liT X ); \
}; \
\
WX_LIST_VC6_WORKAROUND(elT, liT, decl) \
- decl liT : public std::list<elT> \
+ class liT : public std::list<elT> \
{ \
private: \
typedef std::list<elT> BaseListType; \
- static BaseListType EmptyList; \
\
bool m_destroy; \
\
public: \
- decl compatibility_iterator \
+ class compatibility_iterator \
{ \
private: \
/* Workaround for broken VC6 nested class name resolution */ \
\
public: \
compatibility_iterator() \
- : m_iter(EmptyList.end()), m_list( NULL ) {} \
+ : m_iter(_WX_LIST_HELPER_##liT::EmptyList.end()), m_list( NULL ) {} \
compatibility_iterator( liT* li, iterator i ) \
: m_iter( i ), m_list( li ) {} \
compatibility_iterator( const liT* li, iterator i ) \
} \
int IndexOf() const \
{ \
- return *this ? std::distance( m_list->begin(), m_iter ) \
+ return *this ? (int)std::distance( m_list->begin(), m_iter ) \
: wxNOT_FOUND; \
} \
}; \
#define WX_DEFINE_EXPORTED_LIST(name) WX_DEFINE_LIST(name)
#define WX_DEFINE_USER_EXPORTED_LIST(name) WX_DEFINE_LIST(name)
-#else // if !wxUSE_STL
+#else // if !wxUSE_STD_CONTAINERS
// undef it to get rid of old, deprecated functions
ptrop \
itor& operator++() \
{ \
- if (m_node) \
- m_node = m_node->GetNext(); \
+ wxASSERT_MSG( m_node, wxT("uninitialized iterator") ); \
+ m_node = m_node->GetNext(); \
return *this; \
} \
const itor operator++(int) \
{ \
itor tmp = *this; \
- if (m_node) \
- m_node = m_node->GetNext(); \
+ wxASSERT_MSG( m_node, wxT("uninitialized iterator") ); \
+ m_node = m_node->GetNext(); \
return tmp; \
} \
itor& operator--() \
ptrop \
itor& operator++() \
{ \
- if (m_node) \
- m_node = m_node->GetNext(); \
+ wxASSERT_MSG( m_node, wxT("uninitialized iterator") ); \
+ m_node = m_node->GetNext(); \
return *this; \
} \
const itor operator++(int) \
{ \
itor tmp = *this; \
- if (m_node) \
- m_node = m_node->GetNext(); \
+ wxASSERT_MSG( m_node, wxT("uninitialized iterator") ); \
+ m_node = m_node->GetNext(); \
return tmp; \
} \
itor& operator--() \
#define WX_DEFINE_EXPORTED_LIST(name) WX_DEFINE_LIST(name)
#define WX_DEFINE_USER_EXPORTED_LIST(name) WX_DEFINE_LIST(name)
-#endif // !wxUSE_STL
+#endif // !wxUSE_STD_CONTAINERS
// ============================================================================
// now we can define classes 100% compatible with the old ones
// inline compatibility functions
-#if !wxUSE_STL
+#if !wxUSE_STD_CONTAINERS
// ----------------------------------------------------------------------------
// wxNodeBase deprecated methods
class WXDLLIMPEXP_BASE wxList : public wxObjectList
{
public:
-#if defined(wxWARN_COMPAT_LIST_USE) && !wxUSE_STL
- wxList() { };
+#if defined(wxWARN_COMPAT_LIST_USE) && !wxUSE_STD_CONTAINERS
+ wxList() { }
wxDEPRECATED( wxList(int key_type) );
-#elif !wxUSE_STL
+#elif !wxUSE_STD_CONTAINERS
wxList(int key_type = wxKEY_NONE);
#endif
// this destructor is required for Darwin
~wxList() { }
-#if !wxUSE_STL
+#if !wxUSE_STD_CONTAINERS
wxList& operator=(const wxList& list)
{ if (&list != this) Assign(list); return *this; }
// compatibility methods
void Sort(wxSortCompareFunction compfunc) { wxListBase::Sort(compfunc); }
-#endif // !wxUSE_STL
+#endif // !wxUSE_STD_CONTAINERS
+
+#ifndef __VISUALC6__
+ template<typename T>
+ wxVector<T> AsVector() const
+ {
+ wxVector<T> vector(size());
+ size_t i = 0;
+
+ for ( const_iterator it = begin(); it != end(); ++it )
+ {
+ vector[i++] = static_cast<T>(*it);
+ }
+
+ return vector;
+ }
+#endif // !__VISUALC6__
+
};
-#if !wxUSE_STL
+#if !wxUSE_STD_CONTAINERS
// -----------------------------------------------------------------------------
// wxStringList class for compatibility with the old code
void DoCopy(const wxStringList&); // common part of copy ctor and operator=
};
-#else // if wxUSE_STL
+#else // if wxUSE_STD_CONTAINERS
WX_DECLARE_LIST_XO(wxString, wxStringListBase, class WXDLLIMPEXP_BASE);
{ push_front(s); return GetFirst(); }
};
-#endif // wxUSE_STL
+#endif // wxUSE_STD_CONTAINERS
#endif // wxLIST_COMPATIBILITY