summaryrefslogtreecommitdiffstats
path: root/debian/htdig/htdig-3.2.0b6/htlib/HtVector.cc
diff options
context:
space:
mode:
Diffstat (limited to 'debian/htdig/htdig-3.2.0b6/htlib/HtVector.cc')
-rw-r--r--debian/htdig/htdig-3.2.0b6/htlib/HtVector.cc310
1 files changed, 310 insertions, 0 deletions
diff --git a/debian/htdig/htdig-3.2.0b6/htlib/HtVector.cc b/debian/htdig/htdig-3.2.0b6/htlib/HtVector.cc
new file mode 100644
index 00000000..b6addea3
--- /dev/null
+++ b/debian/htdig/htdig-3.2.0b6/htlib/HtVector.cc
@@ -0,0 +1,310 @@
+//
+// HtVector.cc
+//
+// HtVector: A Vector class which holds objects of type Object.
+// (A vector is an array that can expand as necessary)
+// This class is very similar in interface to the List class
+//
+// Part of the ht://Dig package <http://www.htdig.org/>
+// Copyright (c) 1999-2004 The ht://Dig Group
+// For copyright details, see the file COPYING in your distribution
+// or the GNU Library General Public License (LGPL) version 2 or later
+// <http://www.gnu.org/copyleft/lgpl.html>
+//
+// $Id: HtVector.cc,v 1.11 2004/05/28 13:15:21 lha Exp $
+//
+
+#ifdef HAVE_CONFIG_H
+#include "htconfig.h"
+#endif /* HAVE_CONFIG_H */
+
+#include "HtVector.h"
+
+//*********************************************************************
+// void HtVector::HtVector()
+// Default constructor
+//
+HtVector::HtVector()
+{
+ data = new Object *[4]; // After all, why would anyone want an empty vector?
+ element_count = 0;
+ allocated = 4;
+ current_index = -1;
+}
+
+
+//*********************************************************************
+// void HtVector::HtVector(int capacity)
+// Constructor with known capacity
+// (has the side effect of not allocating double memory)
+//
+HtVector::HtVector(int capacity)
+{
+ data = new Object *[capacity];
+ element_count = 0;
+ allocated = capacity;
+ current_index = -1;
+}
+
+
+//*********************************************************************
+// void HtVector::~HtVector()
+// Destructor
+//
+HtVector::~HtVector()
+{
+ Destroy();
+}
+
+
+//*********************************************************************
+// void HtVector::Release()
+// Remove all objects from the vector, but do not delete them
+void HtVector::Release()
+{
+ for (current_index = 0; current_index < element_count; current_index++)
+ {
+ data[current_index] = NULL;
+ }
+ if (data)
+ delete [] data;
+ data = NULL;
+ allocated = 0;
+ element_count = 0;
+ current_index = -1;
+}
+
+//*********************************************************************
+// void HtVector::Destroy()
+// Deletes all objects from the vector
+//
+void HtVector::Destroy()
+{
+ for (current_index = 0; current_index < element_count; current_index++)
+ if (data[current_index])
+ {
+ delete data[current_index];
+ data[current_index] = NULL;
+ }
+ if (data)
+ delete [] data;
+ data = NULL;
+ allocated = 0;
+ element_count = 0;
+ current_index = -1;
+}
+
+
+//*********************************************************************
+// void HtVector::Add(Object *object)
+// Add an object to the list.
+//
+void HtVector::Add(Object *object)
+{
+ Allocate(element_count+1);
+ data[element_count] = object;
+ element_count += 1;
+}
+
+
+//*********************************************************************
+// void HtVector::Insert(Object *object, int position)
+// Add an object into the list.
+//
+void HtVector::Insert(Object *object, int position)
+{
+ if (position < 0) return;
+ if (position >= element_count)
+ {
+ Add(object);
+ return;
+ }
+
+ Allocate(element_count + 1);
+ for (int i = element_count; i > position; i--)
+ data[i] = data[i-1];
+ data[position] = object;
+ element_count += 1;
+}
+
+
+//*********************************************************************
+// void HtVector::Assign(Object *object, int position)
+// Assign an object to the position
+//
+void HtVector:: Assign(Object *object, int position)
+{
+ // Simply perform an insert, followed by a remove!
+ Insert(object, position);
+ RemoveFrom(position + 1);
+ return;
+}
+
+
+//*********************************************************************
+// int HtVector::Remove(Object *object)
+// Remove an object from the list.
+//
+int HtVector::Remove(Object *object)
+{
+ return RemoveFrom(Index(object));
+}
+
+
+//*********************************************************************
+// int HtVector::RemoveFrom(int position)
+// Remove an object from the list.
+//
+int HtVector::RemoveFrom(int position)
+{
+ if (position < 0 || position >= element_count)
+ return NOTOK;
+
+ for (int i = position; i < element_count - 1; i++)
+ data[i] = data[i+1];
+ element_count -= 1;
+ return OK;
+}
+
+
+//*********************************************************************
+// Object *HtVector::Get_Next()
+// Return the next object in the list.
+//
+Object *HtVector::Get_Next()
+{
+ current_index++;
+ if (current_index >= element_count)
+ return 0;
+ return data[current_index];
+}
+
+
+//*********************************************************************
+// Object *HtVector::Get_First()
+// Return the first object in the list.
+//
+Object *HtVector::Get_First()
+{
+ if (!IsEmpty())
+ {
+ current_index = 0;
+ return data[0];
+ }
+ else
+ return 0;
+}
+
+
+//*********************************************************************
+// int HtVector::Index(Object *obj)
+// Return the index of an object in the list.
+//
+int HtVector::Index(Object *obj)
+{
+ int index = 0;
+
+ while (index < element_count && data[index] != obj)
+ {
+ index++;
+ }
+ if (index >= element_count)
+ return -1;
+ else
+ return index;
+}
+
+
+//*********************************************************************
+// Object *HtVector::Next(Object *prev)
+// Return the next object in the list. Using this, the list will
+// appear as a circular list.
+//
+Object *HtVector::Next(Object *prev)
+{
+ current_index = Index(prev);
+ if (current_index == -1)
+ return 0;
+
+ current_index++; // We should probably do this with remainders
+ if (current_index >= element_count)
+ current_index = 0;
+ return data[current_index];
+}
+
+
+//*********************************************************************
+// Object *HtVector::Previous(Object *next)
+// Return the previous object in the vector. Using this, the vector will
+// appear as a circular list.
+//
+Object *HtVector::Previous(Object *next)
+{
+ current_index = Index(next);
+ if (current_index == -1)
+ return 0;
+
+ current_index--; // We should probably do this with remainders
+ if (current_index < 0)
+ current_index = element_count - 1;
+ return data[current_index];
+}
+
+
+//*********************************************************************
+// Object *HtVector::Copy() const
+// Return a deep copy of the vector.
+//
+Object *HtVector::Copy() const
+{
+ HtVector *vector = new HtVector(allocated);
+
+ for(int i = 0; i < Count(); i++)
+ vector->Add(data[i]->Copy());
+
+ return vector;
+}
+
+
+//*********************************************************************
+// HtVector &HtVector::operator=(HtVector &vector)
+// Return a deep copy of the list.
+//
+HtVector &HtVector::operator=(HtVector &vector)
+{
+ Destroy();
+
+ for(int i = 0; i < vector.Count(); i++)
+ Add(vector.data[i]->Copy());
+
+ return *this;
+}
+
+
+//*********************************************************************
+// int Allocate(int capacity)
+// Ensure there is at least capacity space in the vector
+//
+void HtVector::Allocate(int capacity)
+{
+ if (capacity > allocated) // Darn, we actually have to do work :-)
+ {
+ Object **old_data = data;
+
+ // Ensure we have more than the capacity and we aren't
+ // always rebuilding the vector (which leads to quadratic behavior)
+ while (allocated < capacity)
+ allocated *= 2;
+
+ data = new Object *[allocated];
+
+ for (int i = 0; i < element_count; i++)
+ {
+ data[i] = old_data[i];
+ old_data[i] = NULL;
+ }
+
+ if (old_data)
+ delete [] old_data;
+ }
+}