Added --use-stl to cnfigure, wxUSE_STL to setup0.h
Moved wx/datetime.inl contents to wx/datetime.h and removed inline redefinition hack. Implemented STL-like interface on top of wxList/wxArray, when wxUSE_STL=0. Implemented wxList-like and wxArray interfaces on top of std::list and std::vector, when wxUSE_STL=1. Added arrstr.h, moved wxArrayString declaration there; string.h #includes arrstr.h only if WXWIN_COMPATIBILITY_2_4 is enabled. Added WX_CLEAR_HASH_MAP, WX_CLEAR_HASH_TABLE, WX_CLEAR_LIST macros, to clear a wxHashMap, wxHashTable, wxList containing pointers: deletes pointers and makes container zero-sized. When wxUSE_STL=1, wxStringList works like a std::list<wxString>. Made wxBase compile when wxUSE_STL=1. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@21768 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -78,6 +78,7 @@
|
||||
#define TEST_REGCONF
|
||||
#define TEST_REGEX
|
||||
#define TEST_REGISTRY
|
||||
#define TEST_SCOPEGUARD
|
||||
#define TEST_SNGLINST
|
||||
#define TEST_SOCKETS
|
||||
#define TEST_STREAMS
|
||||
@@ -95,7 +96,10 @@
|
||||
#undef TEST_ALL
|
||||
static const bool TEST_ALL = true;
|
||||
#else
|
||||
#define TEST_LOG
|
||||
#define TEST_ARRAYS
|
||||
#define TEST_HASH
|
||||
#define TEST_LIST
|
||||
#define TEST_SCOPEGUARD
|
||||
|
||||
static const bool TEST_ALL = false;
|
||||
#endif
|
||||
@@ -1148,6 +1152,41 @@ static void TestHash()
|
||||
{
|
||||
wxPuts(_T("*** Testing wxHashTable ***\n"));
|
||||
|
||||
{
|
||||
wxHashTable hash(wxKEY_INTEGER), hash2(wxKEY_STRING);
|
||||
int i;
|
||||
|
||||
for ( i = 0; i < 100; ++i )
|
||||
hash.Put(i, (wxObject*)&i + i);
|
||||
|
||||
hash.BeginFind();
|
||||
wxHashTable::compatibility_iterator it = hash.Next();
|
||||
i = 0;
|
||||
|
||||
while (it)
|
||||
{
|
||||
++i;
|
||||
it = hash.Next();
|
||||
}
|
||||
|
||||
if (i != 100)
|
||||
wxPuts(_T("Error in wxHashTable::compatibility_iterator\n"));
|
||||
|
||||
for ( i = 99; i >= 0; --i )
|
||||
if( hash.Get(i) != (wxObject*)&i + i )
|
||||
wxPuts(_T("Error in wxHashTable::Get/Put\n"));
|
||||
|
||||
hash2.Put("foo", (wxObject*)&i + 1);
|
||||
hash2.Put("bar", (wxObject*)&i + 2);
|
||||
hash2.Put("baz", (wxObject*)&i + 3);
|
||||
|
||||
if (hash2.Get("moo") != NULL)
|
||||
wxPuts(_T("Error in wxHashTable::Get\n"));
|
||||
|
||||
if (hash2.Get("bar") != (wxObject*)&i + 2)
|
||||
wxPuts(_T("Error in wxHashTable::Get/Put\n"));
|
||||
}
|
||||
#if !wxUSE_STL
|
||||
{
|
||||
wxHashFoos hash;
|
||||
hash.DeleteContents(true);
|
||||
@@ -1197,8 +1236,10 @@ static void TestHash()
|
||||
wxPuts(_T("ok (not found)"));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
wxPrintf(_T("Hash destroyed: %u foos left\n"), Foo::count);
|
||||
wxPuts(_T("*** Testing wxHashTable finished ***\n"));
|
||||
}
|
||||
|
||||
#endif // TEST_HASH
|
||||
@@ -1361,6 +1402,104 @@ WX_DECLARE_LIST(Bar, wxListBars);
|
||||
#include "wx/listimpl.cpp"
|
||||
WX_DEFINE_LIST(wxListBars);
|
||||
|
||||
WX_DECLARE_LIST(int, wxListInt);
|
||||
WX_DEFINE_LIST(wxListInt);
|
||||
|
||||
static void TestList()
|
||||
{
|
||||
wxPuts(_T("*** Testing wxList operations ***\n"));
|
||||
{
|
||||
wxListInt list1;
|
||||
int dummy[5];
|
||||
int i;
|
||||
|
||||
for ( i = 0; i < 5; ++i )
|
||||
list1.Append(dummy + i);
|
||||
|
||||
if ( list1.GetCount() != 5 )
|
||||
wxPuts(_T("Wrong number of items in list\n"));
|
||||
|
||||
if ( list1.Item(3)->GetData() != dummy + 3 )
|
||||
wxPuts(_T("Error in Item()\n"));
|
||||
|
||||
if ( !list1.Find(dummy + 4) )
|
||||
wxPuts(_T("Error in Find()\n"));
|
||||
|
||||
wxListInt::compatibility_iterator node = list1.GetFirst();
|
||||
i = 0;
|
||||
|
||||
while (node)
|
||||
{
|
||||
if ( node->GetData() != dummy + i )
|
||||
wxPuts(_T("Error in compatibility_iterator\n"));
|
||||
node = node->GetNext();
|
||||
++i;
|
||||
}
|
||||
|
||||
if ( size_t(i) != list1.GetCount() )
|
||||
wxPuts(_T("Error in compatibility_iterator\n"));
|
||||
|
||||
list1.Insert(dummy + 0);
|
||||
list1.Insert(1, dummy + 1);
|
||||
list1.Insert(list1.GetFirst()->GetNext()->GetNext(), dummy + 2);
|
||||
|
||||
node = list1.GetFirst();
|
||||
i = 0;
|
||||
|
||||
while (i < 3)
|
||||
{
|
||||
int* t = node->GetData();
|
||||
if ( t != dummy + i )
|
||||
wxPuts(_T("Error in Insert\n"));
|
||||
node = node->GetNext();
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
wxPuts(_T("*** Testing wxList operations finished ***\n"));
|
||||
|
||||
wxPuts(_T("*** Testing std::list operations ***\n"));
|
||||
|
||||
{
|
||||
wxListInt list1;
|
||||
wxListInt::iterator it, en;
|
||||
wxListInt::reverse_iterator rit, ren;
|
||||
int i;
|
||||
for ( i = 0; i < 5; ++i )
|
||||
list1.push_back(i + &i);
|
||||
|
||||
for ( it = list1.begin(), en = list1.end(), i = 0;
|
||||
it != en; ++it, ++i )
|
||||
if ( *it != i + &i )
|
||||
wxPuts(_T("Error in iterator\n"));
|
||||
|
||||
for ( rit = list1.rbegin(), ren = list1.rend(), i = 4;
|
||||
rit != ren; ++rit, --i )
|
||||
if ( *rit != i + &i )
|
||||
wxPuts(_T("Error in reverse_iterator\n"));
|
||||
|
||||
if ( *list1.rbegin() != *--list1.end() ||
|
||||
*list1.begin() != *--list1.rend() )
|
||||
wxPuts(_T("Error in iterator/reverse_iterator\n"));
|
||||
if ( *list1.begin() != *--++list1.begin() ||
|
||||
*list1.rbegin() != *--++list1.rbegin() )
|
||||
wxPuts(_T("Error in iterator/reverse_iterator\n"));
|
||||
|
||||
if ( list1.front() != &i || list1.back() != &i + 4 )
|
||||
wxPuts(_T("Error in front()/back()\n"));
|
||||
|
||||
list1.erase(list1.begin());
|
||||
list1.erase(--list1.end());
|
||||
|
||||
for ( it = list1.begin(), en = list1.end(), i = 1;
|
||||
it != en; ++it, ++i )
|
||||
if ( *it != i + &i )
|
||||
wxPuts(_T("Error in erase()\n"));
|
||||
}
|
||||
|
||||
wxPuts(_T("*** Testing std::list operations finished ***\n"));
|
||||
}
|
||||
|
||||
static void TestListCtor()
|
||||
{
|
||||
wxPuts(_T("*** Testing wxList construction ***\n"));
|
||||
@@ -1379,7 +1518,11 @@ static void TestListCtor()
|
||||
wxPrintf(_T("After 2nd list creation: %u and %u objects in the lists, %u objects total.\n"),
|
||||
list1.GetCount(), list2.GetCount(), Bar::GetNumber());
|
||||
|
||||
#if !wxUSE_STL
|
||||
list1.DeleteContents(true);
|
||||
#else
|
||||
WX_CLEAR_LIST(wxListBars, list1);
|
||||
#endif
|
||||
}
|
||||
|
||||
wxPrintf(_T("After list destruction: %u objects left.\n"), Bar::GetNumber());
|
||||
@@ -2989,6 +3132,8 @@ static void TestRegistryAssociation()
|
||||
// scope guard
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#ifdef TEST_SCOPEGUARD
|
||||
|
||||
#include "wx/scopeguard.h"
|
||||
|
||||
static void function0() { puts("function0()"); }
|
||||
@@ -3009,14 +3154,16 @@ static void TestScopeGuard()
|
||||
ON_BLOCK_EXIT2(function2, 3.14, 'p');
|
||||
|
||||
Object obj;
|
||||
ON_BLOCK_EXIT_OBJ0(obj, Object::method0);
|
||||
ON_BLOCK_EXIT_OBJ1(obj, Object::method1, 7);
|
||||
ON_BLOCK_EXIT_OBJ2(obj, Object::method2, 2.71, 'e');
|
||||
ON_BLOCK_EXIT_OBJ0(obj, &Object::method0);
|
||||
ON_BLOCK_EXIT_OBJ1(obj, &Object::method1, 7);
|
||||
ON_BLOCK_EXIT_OBJ2(obj, &Object::method2, 2.71, 'e');
|
||||
|
||||
wxScopeGuard dismissed = wxMakeGuard(function0);
|
||||
dismissed.Dismiss();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// sockets
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -5715,6 +5862,17 @@ static void PrintArray(const wxChar* name, const wxArrayString& array)
|
||||
}
|
||||
}
|
||||
|
||||
static void PrintArray(const wxChar* name, const wxSortedArrayString& array)
|
||||
{
|
||||
wxPrintf(_T("Dump of the array '%s'\n"), name);
|
||||
|
||||
size_t nCount = array.GetCount();
|
||||
for ( size_t n = 0; n < nCount; n++ )
|
||||
{
|
||||
wxPrintf(_T("\t%s[%u] = '%s'\n"), name, n, array[n].c_str());
|
||||
}
|
||||
}
|
||||
|
||||
int wxCMPFUNC_CONV StringLenCompare(const wxString& first,
|
||||
const wxString& second)
|
||||
{
|
||||
@@ -5779,6 +5937,53 @@ static void TestArrayOf ## name ## s() \
|
||||
TestArrayOf(UShort);
|
||||
TestArrayOf(Int);
|
||||
|
||||
static void TestStlArray()
|
||||
{
|
||||
wxPuts(_T("*** Testing std::vector operations ***\n"));
|
||||
|
||||
{
|
||||
wxArrayInt list1;
|
||||
wxArrayInt::iterator it, en;
|
||||
wxArrayInt::reverse_iterator rit, ren;
|
||||
int i;
|
||||
for ( i = 0; i < 5; ++i )
|
||||
list1.push_back(i);
|
||||
|
||||
for ( it = list1.begin(), en = list1.end(), i = 0;
|
||||
it != en; ++it, ++i )
|
||||
if ( *it != i )
|
||||
wxPuts(_T("Error in iterator\n"));
|
||||
|
||||
for ( rit = list1.rbegin(), ren = list1.rend(), i = 4;
|
||||
rit != ren; ++rit, --i )
|
||||
if ( *rit != i )
|
||||
wxPuts(_T("Error in reverse_iterator\n"));
|
||||
|
||||
if ( *list1.rbegin() != *(list1.end()-1) ||
|
||||
*list1.begin() != *(list1.rend()-1) )
|
||||
wxPuts(_T("Error in iterator/reverse_iterator\n"));
|
||||
|
||||
it = list1.begin()+1;
|
||||
rit = list1.rbegin()+1;
|
||||
if ( *list1.begin() != *(it-1) ||
|
||||
*list1.rbegin() != *(rit-1) )
|
||||
wxPuts(_T("Error in iterator/reverse_iterator\n"));
|
||||
|
||||
if ( list1.front() != 0 || list1.back() != 4 )
|
||||
wxPuts(_T("Error in front()/back()\n"));
|
||||
|
||||
list1.erase(list1.begin());
|
||||
list1.erase(list1.end()-1);
|
||||
|
||||
for ( it = list1.begin(), en = list1.end(), i = 1;
|
||||
it != en; ++it, ++i )
|
||||
if ( *it != i )
|
||||
wxPuts(_T("Error in erase()\n"));
|
||||
}
|
||||
|
||||
wxPuts(_T("*** Testing std::vector operations finished ***\n"));
|
||||
}
|
||||
|
||||
static void TestArrayOfObjects()
|
||||
{
|
||||
wxPuts(_T("*** Testing wxObjArray ***\n"));
|
||||
@@ -6211,6 +6416,16 @@ static void TestStringMatch()
|
||||
#include "wx/snglinst.h"
|
||||
#endif // TEST_SNGLINST
|
||||
|
||||
static int MyStringCompare(wxString* s1, wxString* s2)
|
||||
{
|
||||
return wxStrcmp(s1->c_str(), s2->c_str());
|
||||
}
|
||||
|
||||
static int MyStringReverseCompare(wxString* s1, wxString* s2)
|
||||
{
|
||||
return -wxStrcmp(s1->c_str(), s2->c_str());
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
wxApp::CheckBuildOptions(wxBuildOptions());
|
||||
@@ -6340,7 +6555,7 @@ int main(int argc, char **argv)
|
||||
#endif // TEST_STRINGS
|
||||
|
||||
#ifdef TEST_ARRAYS
|
||||
if ( TEST_ALL )
|
||||
if ( 1 || TEST_ALL )
|
||||
{
|
||||
wxArrayString a1;
|
||||
a1.Add(_T("tiger"));
|
||||
@@ -6357,38 +6572,50 @@ int main(int argc, char **argv)
|
||||
wxArrayString a2(a1);
|
||||
PrintArray(_T("a2"), a2);
|
||||
|
||||
#if !wxUSE_STL
|
||||
wxSortedArrayString a3(a1);
|
||||
#else
|
||||
wxSortedArrayString a3;
|
||||
for (wxArrayString::iterator it = a1.begin(), en = a1.end();
|
||||
it != en; ++it)
|
||||
a3.Add(*it);
|
||||
#endif
|
||||
PrintArray(_T("a3"), a3);
|
||||
|
||||
wxPuts(_T("*** After deleting three strings from a1"));
|
||||
a1.Remove(2,3);
|
||||
a1.RemoveAt(2,3);
|
||||
|
||||
PrintArray(_T("a1"), a1);
|
||||
PrintArray(_T("a2"), a2);
|
||||
PrintArray(_T("a3"), a3);
|
||||
|
||||
#if !wxUSE_STL
|
||||
wxPuts(_T("*** After reassigning a1 to a2 and a3"));
|
||||
a3 = a2 = a1;
|
||||
PrintArray(_T("a2"), a2);
|
||||
PrintArray(_T("a3"), a3);
|
||||
#endif
|
||||
|
||||
wxPuts(_T("*** After sorting a1"));
|
||||
a1.Sort();
|
||||
a1.Sort(&MyStringCompare);
|
||||
PrintArray(_T("a1"), a1);
|
||||
|
||||
wxPuts(_T("*** After sorting a1 in reverse order"));
|
||||
a1.Sort(true);
|
||||
a1.Sort(&MyStringReverseCompare);
|
||||
PrintArray(_T("a1"), a1);
|
||||
|
||||
#if !wxUSE_STL
|
||||
wxPuts(_T("*** After sorting a1 by the string length"));
|
||||
a1.Sort(StringLenCompare);
|
||||
a1.Sort(&StringLenCompare);
|
||||
PrintArray(_T("a1"), a1);
|
||||
#endif
|
||||
|
||||
TestArrayOfObjects();
|
||||
TestArrayOfUShorts();
|
||||
}
|
||||
|
||||
TestArrayOfInts();
|
||||
TestStlArray();
|
||||
#endif // TEST_ARRAYS
|
||||
|
||||
#ifdef TEST_DIR
|
||||
@@ -6418,6 +6645,7 @@ int main(int argc, char **argv)
|
||||
|
||||
#ifdef TEST_LIST
|
||||
TestListCtor();
|
||||
TestList();
|
||||
#endif // TEST_LIST
|
||||
|
||||
#ifdef TEST_LOCALE
|
||||
@@ -6663,6 +6891,10 @@ int main(int argc, char **argv)
|
||||
TestDateTimeInteractive();
|
||||
#endif // TEST_DATETIME
|
||||
|
||||
#ifdef TEST_SCOPEGUARD
|
||||
TestScopeGuard();
|
||||
#endif
|
||||
|
||||
#ifdef TEST_USLEEP
|
||||
wxPuts(_T("Sleeping for 3 seconds... z-z-z-z-z..."));
|
||||
wxUsleep(3000);
|
||||
|
Reference in New Issue
Block a user