Update of /cvsroot/rtk/rtk/src/core
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6611/src/core
Modified Files:
CMakeLists.txt
Added Files:
Vector.cpp
Log Message:
Made non template based vector and template based vector by subclassing the first one
--- NEW FILE: Vector.cpp ---
#include <rtk/Vector.h>
#include <stdlib.h> // malloc, realloc, free
namespace Rtk {
///////////////////////////////////////////////////////////////
// Protected stuff
///////////////////////////////////////////////////////////////
void Vector::_Resize(int new_size)
{
_data = (void**)realloc(_data, new_size*sizeof(void*));
}
///////////////////////////////////////////////////////////////
// Constructor/Destructor & misc stuff
///////////////////////////////////////////////////////////////
Vector::Vector(int def_size)
:_dealloc(false), _size(def_size), _count(0)
{
_data = (void**)malloc(_size * sizeof(void*));
}
Vector::~Vector()
{
Clear();
free(_data);
}
bool Vector::SetSize(int new_size)
{
if (new_size < _count) return false;
_Resize(new_size);
return true;
}
///////////////////////////////////////////////////////////////
// Add/Delete objects
///////////////////////////////////////////////////////////////
void Vector::Clear()
{
if (_dealloc) {
for(int i = 0; i < _count; i++)
_Delete(i);
}
_count = 0;
}
bool Vector::Remove(int idx)
{
if (idx < 0 || idx >= _count) return false; // invalid index
if (_dealloc) _Delete(idx);
_count--;
while (idx < _count) {
_data[idx] = _data[idx+1];
idx++;
}
if (_count*4 < _size)
_Resize(_size/2);
return true;
}
int Vector::Add(void* obj)
{
if (_count == _size)
_Resize(_size*2);
_data[_count++] = obj;
return _count-1;
}
bool Vector::Add(void* obj, int idx)
{
if (idx < 0) idx = 0;
if (idx > _count) idx = _count;
if (_count == _size)
_Resize(_size*2);
for(int i = _count; i > idx; i--)
_data[i] = _data[i-1];
_data[idx] = obj;
_count++;
return true;
}
int Vector::Find(const void* obj, int* idx) const
{
int first = (idx == NULL) ? 0 : *idx;
for(int i = first; i < _count; i++)
if (obj == _data[i]) {
if (idx) *idx = i+1;
return i;
}
return -1;
}
int Vector::Find(bool (*fn)(const void* obj, void* obj2), void* param, int* idx)
{
int first = (idx == NULL) ? 0 : *idx;
for(int i = first; i < _count; i++)
if (fn(_data[i], param)) {
if (idx) *idx = i+1;
return i;
}
return -1;
}
void* Vector::Get(int idx)
{
if (idx < 0 || idx >= _count) return (void*)0;
return _data[idx];
}
const void* Vector::Get(int idx) const
{
if (idx < 0 || idx >= _count) return (void*)0;
return _data[idx];
}
///////////////////////////////////////////////////////////////
// Search iterator
///////////////////////////////////////////////////////////////
void* Vector::SearchIterator::Next()
{
int pos = _v.Find(_fn, _param, &_idx);
if (pos < 0) return (void*)0;
return _v.At(pos);
}
Vector::SearchIterator* Vector::Search(bool (*fn)(const void* obj, void* obj2), void* param)
{
return new SearchIterator(*this, fn, param);
}
///////////////////////////////////////////////////////////////
// Simulate a queue
///////////////////////////////////////////////////////////////
void* Vector::Dequeue()
{
void* ret = _data[0];
_count--;
for(int i = 0; i < _count; i++)
_data[i] = _data[i+1];
return ret;
}
} // namespace Rtk
Index: CMakeLists.txt
===================================================================
RCS file: /cvsroot/rtk/rtk/src/core/CMakeLists.txt,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** CMakeLists.txt 23 Feb 2004 22:36:09 -0000 1.9
--- CMakeLists.txt 26 Feb 2004 21:52:28 -0000 1.10
***************
*** 36,40 ****
SList.cpp Dict.cpp debug.cpp
error.cpp String.cpp Array.cpp
! rchar.cpp
)
--- 36,40 ----
SList.cpp Dict.cpp debug.cpp
error.cpp String.cpp Array.cpp
! rchar.cpp Vector.cpp
)
|