From: Vadim Zeitlin Date: Sat, 7 Jul 2001 23:16:38 +0000 (+0000) Subject: added vector and stack classes (UNTESTED) X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/3c648a82a574a5fad06fdbdc61c4e10e340438c2 added vector and stack classes (UNTESTED) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10893 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/distrib/msw/tmake/filelist.txt b/distrib/msw/tmake/filelist.txt index b26ec504c5..f7ee3abba2 100644 --- a/distrib/msw/tmake/filelist.txt +++ b/distrib/msw/tmake/filelist.txt @@ -755,6 +755,7 @@ spinbutt.h WXH spinctrl.h WXH splash.h WXH splitter.h WXH +stack.h WXH statbmp.h WXH statbox.h WXH statline.h WXH @@ -790,6 +791,7 @@ valgen.h WXH validate.h WXH valtext.h WXH variant.h WXH Base +vector.h WXH Base version.h WXH Base wave.h WXH wfstream.h WXH Base diff --git a/include/wx/stack.h b/include/wx/stack.h new file mode 100644 index 0000000000..8cd78bf271 --- /dev/null +++ b/include/wx/stack.h @@ -0,0 +1,44 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/stack.h +// Purpose: STL stack clone +// Author: Lindsay Mathieson +// Modified by: +// Created: 30.07.2001 +// Copyright: (c) 2001 Lindsay Mathieson +// Licence: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_STACK_H_ +#define _WX_STACK_H_ + +#include "wx/vector.h" + +#define WX_DECLARE_STL_STACK(obj, cls)\ +class cls : public wxVectorBase\ +{\ + WX_DECLARE_STL_VECTORBASE(obj, cls);\ +public:\ + void push(const obj& o)\ + {\ + bool rc = Alloc(size() + 1);\ + wxASSERT(rc);\ + Append(new obj(o));\ + };\ +\ + void pop()\ + {\ + RemoveAt(size() - 1);\ + };\ +\ + obj& top()\ + {\ + return *(obj *) GetItem(size() - 1);\ + };\ + const obj& top() const\ + {\ + return *(obj *) GetItem(size() - 1);\ + };\ +} + +#endif // _WX_STACK_H_ + diff --git a/include/wx/vector.h b/include/wx/vector.h new file mode 100644 index 0000000000..55d1b5c015 --- /dev/null +++ b/include/wx/vector.h @@ -0,0 +1,208 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/vector.h +// Purpose: STL vector clone +// Author: Lindsay Mathieson +// Modified by: +// Created: 30.07.2001 +// Copyright: (c) 2001 Lindsay Mathieson +// Licence: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_VECTOR_H_ +#define _WX_VECTOR_H_ + +#include "wx/defs.h" + +class wxVectorBase +{ +private: + int m_allocsize; + int m_size, + m_capacity; + void **m_objects; + +protected: + bool Alloc(int 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(void *) * sz); + if (! mem) + return false; // failed + // success + m_objects = (void **) mem; + m_capacity = sz; + return true; + }; + + // 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(int idx) const + { + wxASSERT(idx >= 0 && 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(int idx) + { + wxASSERT(idx >= 0 && idx < m_size); + Free(m_objects[idx]); + if (idx < m_size - 1) + memcpy( + m_objects + idx * sizeof(void *), + m_objects + (idx + 1) * sizeof(void *), + m_size - idx - 1); + m_size--; + }; + + bool copy(const wxVectorBase& vb) + { + clear(); + if (! Alloc(vb.size())) + return false; + + for (int i = 0; i < vb.size(); i++) + { + void *o = vb.Copy(vb.GetItem(i)); + if (! o) + return false; + Append(o); + }; + + return true; + }; + +public: + wxVectorBase() : m_objects(0), m_allocsize(16), m_size(0), m_capacity(0) {} + void clear() + { + for (int i = 0; i < size(); i++) + Free(m_objects[i]); + free(m_objects); + m_objects = 0; + m_size = m_capacity = 0; + }; + + void reserve(int n) + { + if ( !Alloc(n) ) + { + wxFAIL_MSG( _T("out of memory in wxVector::reserve()") ); + } + }; + + int size() const + { + return m_size; + } + + int capacity() const + { + return m_size; + }; + + bool empty() const + { + return size() == 0; + }; + + wxVectorBase& operator = (const wxVectorBase& vb) + { + bool rc = copy(vb); + wxASSERT(rc); + return *this; + } +}; + +#define WX_DECLARE_VECTORBASE(obj, cls)\ +private:\ + 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)\ + {\ + bool rc = copy(c);\ + wxASSERT(rc);\ + }\ + ~cls()\ + {\ + clear();\ + } + +#define WX_DECLARE_VECTOR(obj, cls)\ +class cls : public wxVectorBase\ +{\ + WX_DECLARE_STL_VECTORBASE(obj, cls);\ +public:\ + void push_back(const obj& o)\ + {\ + bool rc = Alloc(size() + 1);\ + wxASSERT(rc);\ + Append(new obj(o));\ + };\ + void pop_back()\ + {\ + RemoveAt(size() - 1);\ + };\ + const obj& at(int idx) const\ + {\ + return *(obj *) GetItem(idx);\ + };\ + obj& at(int idx)\ + {\ + return *(obj *) GetItem(idx);\ + };\ + const obj& operator[](int idx) const\ + {\ + return at(idx);\ + };\ + obj& operator[](int 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);\ + };\ + int erase(int idx)\ + {\ + RemoveAt(idx);\ + return idx;\ + };\ +} + +#endif // _WX_VECTOR_H_ +