added vector and stack classes (UNTESTED)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10893 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2001-07-07 23:16:38 +00:00
parent 5438a5665e
commit 3c648a82a5
3 changed files with 254 additions and 0 deletions

View File

@@ -755,6 +755,7 @@ spinbutt.h WXH
spinctrl.h WXH spinctrl.h WXH
splash.h WXH splash.h WXH
splitter.h WXH splitter.h WXH
stack.h WXH
statbmp.h WXH statbmp.h WXH
statbox.h WXH statbox.h WXH
statline.h WXH statline.h WXH
@@ -790,6 +791,7 @@ valgen.h WXH
validate.h WXH validate.h WXH
valtext.h WXH valtext.h WXH
variant.h WXH Base variant.h WXH Base
vector.h WXH Base
version.h WXH Base version.h WXH Base
wave.h WXH wave.h WXH
wfstream.h WXH Base wfstream.h WXH Base

44
include/wx/stack.h Normal file
View File

@@ -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 <lindsay@mathieson.org>
// 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_

208
include/wx/vector.h Normal file
View File

@@ -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 <lindsay@mathieson.org>
// 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_