diff --git a/include/wx/clntdata.h b/include/wx/clntdata.h index 33fae4c104..c1d09e7c68 100644 --- a/include/wx/clntdata.h +++ b/include/wx/clntdata.h @@ -169,12 +169,6 @@ struct WXDLLIMPEXP_BASE wxClientDataDictionaryPair wxClientData* data; }; -_WX_DECLARE_VECTOR( - wxClientDataDictionaryPair, - wxClientDataDictionaryPairVector, - WXDLLIMPEXP_BASE -); - // this class is used internally to maintain the association between items // of (some subclasses of) wxControlWithItems and their client data // NOTE: this class does not keep track of whether it contains @@ -266,7 +260,7 @@ private: return m_vec.size(); } - wxClientDataDictionaryPairVector m_vec; + wxVector m_vec; }; #endif // _WX_CLNTDATAH__ diff --git a/include/wx/vector.h b/include/wx/vector.h index f8aa5625eb..1c181c2c18 100644 --- a/include/wx/vector.h +++ b/include/wx/vector.h @@ -2,9 +2,10 @@ // Name: wx/vector.h // Purpose: STL vector clone // Author: Lindsay Mathieson -// Modified by: +// Modified by: Vaclav Slavik - make it a template // Created: 30.07.2001 -// Copyright: (c) 2001 Lindsay Mathieson +// Copyright: (c) 2001 Lindsay Mathieson , +// 2007 Vaclav Slavik // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -13,89 +14,38 @@ #include "wx/defs.h" -class WXDLLIMPEXP_BASE wxVectorBase +#if 0 // wxUSE_STL + +// FIXME: can't do this yet, wxVector::erase() is different (takes index, +// not iterator) +#include +#define wxVector std::vector + +#else // !wxUSE_STL + +template +class wxVector { public: typedef size_t size_type; -private: - size_type m_allocsize; - size_type m_size, - m_capacity; - void **m_objects; + typedef T value_type; -protected: - bool Alloc(size_type sz) + wxVector() : m_allocsize(16), m_size(0), m_capacity(0), m_objects(0) {} + + wxVector(const wxVector& c) { - // work in multiples of m_allocsize; - sz = (sz / m_allocsize + 1) * m_allocsize; - if (sz <= m_capacity) - return true; - - // try to realloc - void *mem = realloc(m_objects, sizeof(void *) * sz); - if (! mem) - return false; // failed - // success - m_objects = (void **) mem; - m_capacity = sz; - return true; + wxCHECK2(Copy(c), return); } - // untyped destructor of elements - must be overriden - virtual void Free(void *) = 0; - // untyped copy constructor of elements - must be overriden - virtual void *Copy(const void *) const = 0; - - const void *GetItem(size_type idx) const - { - wxASSERT(idx < m_size); - return m_objects[idx]; - } - - void Append(void *obj) - { - wxASSERT(m_size < m_capacity); - m_objects[m_size] = obj; - m_size++; - } - - void RemoveAt(size_type idx) - { - wxASSERT(idx < m_size); - Free(m_objects[idx]); - if (idx < m_size - 1) - memcpy( - m_objects + idx, - m_objects + idx + 1, - ( m_size - idx - 1 ) * sizeof(void*) ); - m_size--; - } - - bool copy(const wxVectorBase& vb) + ~wxVector() { clear(); - if (! Alloc(vb.size())) - return false; - - for (size_type i = 0; i < vb.size(); i++) - { - void *o = vb.Copy(vb.GetItem(i)); - if (! o) - return false; - Append(o); - } - - return true; } -public: - wxVectorBase() : m_allocsize(16), m_size(0), m_capacity(0), m_objects(0) {} - virtual ~wxVectorBase() {} // calm down GCC - void clear() { for (size_type i = 0; i < size(); i++) - Free(m_objects[i]); + delete m_objects[i]; free(m_objects); m_objects = 0; m_size = m_capacity = 0; @@ -124,89 +74,115 @@ public: return size() == 0; } - wxVectorBase& operator = (const wxVectorBase& vb) + wxVector& operator=(const wxVector& vb) { - wxCHECK(copy(vb), *this); + wxCHECK(Copy(vb), *this); return *this; } -}; -#define WX_DECLARE_VECTORBASE(obj, cls)\ -protected:\ - virtual void Free(void *o)\ - {\ - delete (obj *) o;\ - }\ - virtual void *Copy(const void *o) const\ - {\ - return new obj(*(obj *) o);\ - }\ -public:\ - cls() {}\ - cls(const cls& c) : wxVectorBase()\ - {\ - wxCHECK2(copy(c), return);\ - }\ - ~cls()\ - {\ - clear();\ + void push_back(const value_type& o) + { + wxCHECK2(Alloc(size() + 1), return); + Append(new value_type(o)); } -#define _WX_DECLARE_VECTOR(obj, cls, exp)\ -class exp cls : public wxVectorBase\ -{\ - WX_DECLARE_VECTORBASE(obj, cls)\ -public:\ - void push_back(const obj& o)\ - {\ - wxCHECK2(Alloc(size() + 1), return);\ - Append(new obj(o));\ - }\ - void pop_back()\ - {\ - RemoveAt(size() - 1);\ - }\ - const obj& at(size_type idx) const\ - {\ - return *(obj *) GetItem(idx);\ - }\ - obj& at(size_type idx)\ - {\ - return *(obj *) GetItem(idx);\ - }\ - const obj& operator[](size_type idx) const\ - {\ - return at(idx);\ - }\ - obj& operator[](size_type idx)\ - {\ - return at(idx);\ - }\ - const obj& front() const\ - {\ - return at(0);\ - }\ - obj& front()\ - {\ - return at(0);\ - }\ - const obj& back() const\ - {\ - return at(size() - 1);\ - }\ - obj& back()\ - {\ - return at(size() - 1);\ - }\ - size_type erase(size_type idx)\ - {\ - RemoveAt(idx);\ - return idx;\ - }\ -} + void pop_back() + { + RemoveAt(size() - 1); + } -#define WX_DECLARE_VECTOR(obj, cls) \ - _WX_DECLARE_VECTOR(obj, cls, WXDLLEXPORT) + const value_type& at(size_type idx) const + { + wxASSERT(idx < m_size); + return *m_objects[idx]; + } + + value_type& at(size_type idx) + { + wxASSERT(idx < m_size); + return *m_objects[idx]; + } + + const value_type& operator[](size_type idx) const { return at(idx); } + value_type& operator[](size_type idx) { return at(idx); } + const value_type& front() const { return at(0); } + value_type& front() { return at(0); } + const value_type& back() const { return at(size() - 1); } + value_type& back() { return at(size() - 1); } + + size_type erase(size_type idx) + { + RemoveAt(idx); + return idx; + } + +private: + bool Alloc(size_type sz) + { + // work in multiples of m_allocsize; + sz = (sz / m_allocsize + 1) * m_allocsize; + if (sz <= m_capacity) + return true; + + // try to realloc + void *mem = realloc(m_objects, sizeof(value_type*) * sz); + if (! mem) + return false; // failed + // success + m_objects = (value_type **) mem; + m_capacity = sz; + return true; + } + + void Append(value_type *obj) + { + wxASSERT(m_size < m_capacity); + m_objects[m_size] = obj; + m_size++; + } + + void RemoveAt(size_type idx) + { + wxASSERT(idx < m_size); + delete m_objects[idx]; + if (idx < m_size - 1) + memcpy( + m_objects + idx, + m_objects + idx + 1, + ( m_size - idx - 1 ) * sizeof(void*) ); + m_size--; + } + + bool Copy(const wxVector& vb) + { + clear(); + if (! Alloc(vb.size())) + return false; + + for (size_type i = 0; i < vb.size(); i++) + { + value_type *o = new value_type(vb.at(i)); + if (! o) + return false; + Append(o); + } + + return true; + } + +private: + size_type m_allocsize; + size_type m_size, + m_capacity; + value_type **m_objects; +}; + +#endif // wxUSE_STL/!wxUSE_STL + +#if WXWIN_COMPATIBILITY_2_8 + #define WX_DECLARE_VECTORBASE(obj, cls) typedef wxVector cls + #define _WX_DECLARE_VECTOR(obj, cls, exp) WX_DECLARE_VECTORBASE(obj, cls) + #define WX_DECLARE_VECTOR(obj, cls) WX_DECLARE_VECTORBASE(obj, cls) +#endif // WXWIN_COMPATIBILITY_2_8 #endif // _WX_VECTOR_H_ - diff --git a/tests/Makefile.in b/tests/Makefile.in index 41c9b375ef..6e25a8e5e8 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -91,7 +91,8 @@ TEST_OBJECTS = \ test_zlibstream.o \ test_textfiletest.o \ test_atomic.o \ - test_uris.o + test_uris.o \ + test_vectors.o TEST_ODEP = $(___pch_testprec_test_testprec_h_gch___depname) TEST_GUI_CXXFLAGS = $(__test_gui_PCH_INC) -D__WX$(TOOLKIT)__ \ $(__WXUNIV_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \ @@ -437,6 +438,9 @@ test_atomic.o: $(srcdir)/thread/atomic.cpp $(TEST_ODEP) test_uris.o: $(srcdir)/uris/uris.cpp $(TEST_ODEP) $(CXXC) -c -o $@ $(TEST_CXXFLAGS) $(srcdir)/uris/uris.cpp +test_vectors.o: $(srcdir)/vectors/vectors.cpp $(TEST_ODEP) + $(CXXC) -c -o $@ $(TEST_CXXFLAGS) $(srcdir)/vectors/vectors.cpp + test_gui_sample_rc.o: $(srcdir)/../samples/sample.rc $(TEST_GUI_ODEP) $(WINDRES) -i$< -o$@ --define __WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p_5) $(__EXCEPTIONS_DEFINE_p_5) $(__RTTI_DEFINE_p_5) $(__THREAD_DEFINE_p_5) --include-dir $(srcdir) $(__DLLFLAG_p_5) --include-dir $(srcdir)/../samples $(__RCDEFDIR_p_1) --include-dir $(top_srcdir)/include diff --git a/tests/makefile.bcc b/tests/makefile.bcc index a55004cd19..0baf188f9f 100644 --- a/tests/makefile.bcc +++ b/tests/makefile.bcc @@ -79,7 +79,8 @@ TEST_OBJECTS = \ $(OBJS)\test_zlibstream.obj \ $(OBJS)\test_textfiletest.obj \ $(OBJS)\test_atomic.obj \ - $(OBJS)\test_uris.obj + $(OBJS)\test_uris.obj \ + $(OBJS)\test_vectors.obj TEST_GUI_CXXFLAGS = $(__RUNTIME_LIBS) -I$(BCCDIR)\include $(__DEBUGINFO) \ $(__OPTIMIZEFLAG) $(__THREADSFLAG_1) -D__WXMSW__ $(__WXUNIV_DEFINE_p) \ $(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \ @@ -465,6 +466,9 @@ $(OBJS)\test_atomic.obj: .\thread\atomic.cpp $(OBJS)\test_uris.obj: .\uris\uris.cpp $(CXX) -q -c -P -o$@ $(TEST_CXXFLAGS) $** +$(OBJS)\test_vectors.obj: .\vectors\vectors.cpp + $(CXX) -q -c -P -o$@ $(TEST_CXXFLAGS) $** + $(OBJS)\test_gui_sample.res: .\..\samples\sample.rc brcc32 -32 -r -fo$@ -i$(BCCDIR)\include -d__WXMSW__ $(__WXUNIV_DEFINE_p_3) $(__DEBUG_DEFINE_p_3) $(__EXCEPTIONS_DEFINE_p_3) $(__RTTI_DEFINE_p_3) $(__THREAD_DEFINE_p_3) $(__UNICODE_DEFINE_p_3) $(__MSLU_DEFINE_p_3) $(__GFXCTX_DEFINE_p_3) -i$(SETUPHDIR) -i.\..\include -i. $(__DLLFLAG_p_3) -i.\..\samples -dNOPCH $** diff --git a/tests/makefile.gcc b/tests/makefile.gcc index 6dd6d2ac5b..b24fac7557 100644 --- a/tests/makefile.gcc +++ b/tests/makefile.gcc @@ -71,7 +71,8 @@ TEST_OBJECTS = \ $(OBJS)\test_zlibstream.o \ $(OBJS)\test_textfiletest.o \ $(OBJS)\test_atomic.o \ - $(OBJS)\test_uris.o + $(OBJS)\test_uris.o \ + $(OBJS)\test_vectors.o TEST_GUI_CXXFLAGS = $(__DEBUGINFO) $(__OPTIMIZEFLAG) $(__THREADSFLAG) \ $(GCCFLAGS) -DHAVE_W32API_H -D__WXMSW__ $(__WXUNIV_DEFINE_p) \ $(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \ @@ -443,6 +444,9 @@ $(OBJS)\test_atomic.o: ./thread/atomic.cpp $(OBJS)\test_uris.o: ./uris/uris.cpp $(CXX) -c -o $@ $(TEST_CXXFLAGS) $(CPPDEPS) $< +$(OBJS)\test_vectors.o: ./vectors/vectors.cpp + $(CXX) -c -o $@ $(TEST_CXXFLAGS) $(CPPDEPS) $< + $(OBJS)\test_gui_sample_rc.o: ./../samples/sample.rc windres --use-temp-file -i$< -o$@ --define __WXMSW__ $(__WXUNIV_DEFINE_p_3) $(__DEBUG_DEFINE_p_3) $(__EXCEPTIONS_DEFINE_p_3) $(__RTTI_DEFINE_p_3) $(__THREAD_DEFINE_p_3) $(__UNICODE_DEFINE_p_3) $(__MSLU_DEFINE_p_3) $(__GFXCTX_DEFINE_p_3) --include-dir $(SETUPHDIR) --include-dir ./../include --include-dir . $(__DLLFLAG_p_3) --include-dir ./../samples --define NOPCH diff --git a/tests/makefile.vc b/tests/makefile.vc index 38eb98b933..75962edb86 100644 --- a/tests/makefile.vc +++ b/tests/makefile.vc @@ -72,7 +72,8 @@ TEST_OBJECTS = \ $(OBJS)\test_zlibstream.obj \ $(OBJS)\test_textfiletest.obj \ $(OBJS)\test_atomic.obj \ - $(OBJS)\test_uris.obj + $(OBJS)\test_uris.obj \ + $(OBJS)\test_vectors.obj TEST_GUI_CXXFLAGS = /M$(__RUNTIME_LIBS_23)$(__DEBUGRUNTIME) /DWIN32 \ $(__DEBUGINFO) /Fd$(OBJS)\test_gui.pdb $(____DEBUGRUNTIME) \ $(__OPTIMIZEFLAG) $(__NO_VC_CRTDBG_p) /D__WXMSW__ $(__WXUNIV_DEFINE_p) \ @@ -550,6 +551,9 @@ $(OBJS)\test_atomic.obj: .\thread\atomic.cpp $(OBJS)\test_uris.obj: .\uris\uris.cpp $(CXX) /c /nologo /TP /Fo$@ $(TEST_CXXFLAGS) $** +$(OBJS)\test_vectors.obj: .\vectors\vectors.cpp + $(CXX) /c /nologo /TP /Fo$@ $(TEST_CXXFLAGS) $** + $(OBJS)\test_gui_dummy.obj: .\dummy.cpp $(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) /Yctestprec.h $** diff --git a/tests/makefile.wat b/tests/makefile.wat index b200472846..666adb58d1 100644 --- a/tests/makefile.wat +++ b/tests/makefile.wat @@ -276,7 +276,8 @@ TEST_OBJECTS = & $(OBJS)\test_zlibstream.obj & $(OBJS)\test_textfiletest.obj & $(OBJS)\test_atomic.obj & - $(OBJS)\test_uris.obj + $(OBJS)\test_uris.obj & + $(OBJS)\test_vectors.obj TEST_GUI_CXXFLAGS = $(__DEBUGINFO) $(__OPTIMIZEFLAG) $(__THREADSFLAG) & $(__RUNTIME_LIBS) -d__WXMSW__ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) & $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) & @@ -498,6 +499,9 @@ $(OBJS)\test_atomic.obj : .AUTODEPEND .\thread\atomic.cpp $(OBJS)\test_uris.obj : .AUTODEPEND .\uris\uris.cpp $(CXX) -bt=nt -zq -fo=$^@ $(TEST_CXXFLAGS) $< +$(OBJS)\test_vectors.obj : .AUTODEPEND .\vectors\vectors.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(TEST_CXXFLAGS) $< + $(OBJS)\test_gui_sample.res : .AUTODEPEND .\..\samples\sample.rc wrc -q -ad -bt=nt -r -fo=$^@ -d__WXMSW__ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) $(__UNICODE_DEFINE_p) $(__GFXCTX_DEFINE_p) -i=$(SETUPHDIR) -i=.\..\include -i=. $(__DLLFLAG_p) -i=.\..\samples -dNOPCH $< diff --git a/tests/test.bkl b/tests/test.bkl index 925a6556dc..410c9fc718 100644 --- a/tests/test.bkl +++ b/tests/test.bkl @@ -66,6 +66,7 @@ textfile/textfiletest.cpp thread/atomic.cpp uris/uris.cpp + vectors/vectors.cpp net base diff --git a/tests/test_test.dsp b/tests/test_test.dsp index cc3c4d0407..647f81e221 100644 --- a/tests/test_test.dsp +++ b/tests/test_test.dsp @@ -597,6 +597,10 @@ SOURCE=.\strings\vararg.cpp # End Source File # Begin Source File +SOURCE=.\vectors\vectors.cpp +# End Source File +# Begin Source File + SOURCE=.\strings\vsnprintf.cpp # End Source File # Begin Source File diff --git a/tests/vectors/vectors.cpp b/tests/vectors/vectors.cpp new file mode 100644 index 0000000000..ca75e21942 --- /dev/null +++ b/tests/vectors/vectors.cpp @@ -0,0 +1,66 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: tests/vectors/vectors.cpp +// Purpose: wxVector unit test +// Author: Vaclav Slavik +// Created: 2007-07-07 +// RCS-ID: $Id$ +// Copyright: (c) 2007 Vaclav Slavik +/////////////////////////////////////////////////////////////////////////////// + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "testprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif // WX_PRECOMP + +#include "wx/vector.h" + +// -------------------------------------------------------------------------- +// test class +// -------------------------------------------------------------------------- + +class VectorsTestCase : public CppUnit::TestCase +{ +public: + VectorsTestCase() {} + +private: + CPPUNIT_TEST_SUITE( VectorsTestCase ); + CPPUNIT_TEST( PushTest ); + CPPUNIT_TEST_SUITE_END(); + + void PushTest(); + + DECLARE_NO_COPY_CLASS(VectorsTestCase) +}; + +// register in the unnamed registry so that these tests are run by default +CPPUNIT_TEST_SUITE_REGISTRATION( VectorsTestCase ); + +// also include in it's own registry so that these tests can be run alone +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( VectorsTestCase, "VectorsTestCase" ); + +void VectorsTestCase::PushTest() +{ + wxVector v; + + CPPUNIT_ASSERT( v.size() == 0 ); + v.push_back(1); + CPPUNIT_ASSERT( v.size() == 1 ); + v.push_back(2); + CPPUNIT_ASSERT( v.size() == 2 ); + v.push_back(42); + CPPUNIT_ASSERT( v.size() == 3 ); + + CPPUNIT_ASSERT( v[0] == 1 ); + CPPUNIT_ASSERT( v[1] == 2 ); + CPPUNIT_ASSERT( v[2] == 42 ); +}