20 #define PRINTF(fmt, ...) 28 using namespace object;
94 it.getNext()->intoStringBuffer(sb);
104 Vector::Vector(
int initSize,
bool ownerOfObjects)
106 numAlloc = initSize == 0 ? 1 : initSize;
107 this->ownerOfObjects = ownerOfObjects;
118 void Vector::put(
Object *newElement,
int newPos)
121 newPos = numElements;
124 if (newPos < numElements) {
125 if (ownerOfObjects && array[newPos])
126 delete array[newPos];
130 if (newPos >= numAlloc) {
131 while (newPos >= numAlloc)
133 array = (
Object**)realloc(array, numAlloc *
sizeof(
Object*));
137 for (
int i = numElements; i < newPos; i++)
140 if (newPos >= numElements)
141 numElements = newPos + 1;
143 array[newPos] = newElement;
148 if (ownerOfObjects) {
149 for (
int i = 0; i < numElements; i++)
157 void Vector::insert(
Object *newElement,
int pos)
159 if (pos >= numElements)
160 put(newElement, pos);
165 if (numElements >= numAlloc) {
167 array = (
Object**)realloc(array, numAlloc *
sizeof(
Object*));
170 for (
int i = numElements - 1; i > pos; i--)
171 array[i] = array[i - 1];
173 array[pos] = newElement;
177 void Vector::remove(
int pos)
179 if (ownerOfObjects && array[pos])
182 for (
int i = pos + 1; i < numElements; i++)
183 array[i - 1] = array[i];
209 if (numElements == 0)
210 return mustExist ? -1 : 0;
212 int high = numElements - 1, low = 0;
215 int index = (low + high) / 2;
224 return c > 0 ? index + 1 : index;
245 Object *Vector::VectorIterator::getNext()
247 if (index < vector->numElements - 1)
250 return index < vector->numElements ? vector->array[index] : NULL;
253 bool Vector::VectorIterator::hasNext()
255 return index < vector->numElements - 1;
267 List::List(
bool ownerOfObjects)
269 this->ownerOfObjects = ownerOfObjects;
282 if (ownerOfObjects && first->object)
283 delete first->object;
296 newLast->
next = NULL;
297 newLast->
object = element;
300 last->next = newLast;
303 first = last = newLast;
309 bool List::remove0(
Object *element,
bool compare,
bool doNotDeleteAtAll)
311 Node *beforeCur, *cur;
313 for (beforeCur = NULL, cur = first; cur; beforeCur = cur, cur = cur->
next) {
315 (cur->object && element->
equals(cur->object)) :
316 element == cur->object) {
319 if (cur->next == NULL)
327 if (ownerOfObjects && cur->object && !doNotDeleteAtAll)
344 object = current->object;
345 current = current->next;
352 bool List::ListIterator::hasNext()
354 return current != NULL;
367 HashSet::HashSet(
bool ownerOfObjects,
int tableSize)
369 this->ownerOfObjects = ownerOfObjects;
370 this->tableSize = tableSize;
372 table =
new Node*[tableSize];
373 for (
int i = 0; i < tableSize; i++)
379 for (
int i = 0; i < tableSize; i++) {
389 if (ownerOfObjects) {
409 if (ownerOfObjects) {
417 int h = calcHashValue(
object);
418 for (
Node *node = table[h]; node; node = node->
next) {
419 if (object->
equals(node->object))
429 Node *node = findNode(
object);
433 int h = calcHashValue(
object);
434 node = createNode ();
435 node->
next = table[h];
449 bool HashSet::contains(
Object *
object)
const 451 int h = calcHashValue(
object);
452 for (
Node *n = table[h]; n; n = n->
next) {
453 if (object->
equals(n->object))
462 int h = calcHashValue(
object);
465 for (last = NULL, cur = table[h]; cur; last = cur, cur = cur->
next) {
466 if (object->
equals(cur->object)) {
470 table[h] = cur->
next;
500 HashSet::HashSetIterator::HashSetIterator(
HashSet *set)
508 void HashSet::HashSetIterator::gotoNext()
513 while (node == NULL) {
514 if (pos >= set->tableSize - 1)
517 node = set->table[pos];
522 Object *HashSet::HashSetIterator::getNext()
526 result = node->object;
534 bool HashSet::HashSetIterator::hasNext()
548 HashTable::HashTable(
bool ownerOfKeys,
bool ownerOfValues,
int tableSize) :
549 HashSet (ownerOfKeys, tableSize)
596 node->object->intoStringBuffer(sb);
661 newBottom->
object = object;
662 newBottom->
prev = NULL;
703 return current != NULL;