From: <sp...@us...> - 2004-02-26 22:09:03
|
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 ) |