//
// HtVector.h
//
// 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
// 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
//
//
// $Id: HtVector.h,v 1.10 2004/05/28 13:15:21 lha Exp $
//
//
#ifndef _HtVector_h_
#define _HtVector_h_
#include "Object.h"
class HtVector : public Object
{
public:
//
// Constructor/Destructor
//
HtVector();
HtVector(int capacity);
~HtVector();
//
// Add() will append an Object to the end of the vector
//
void Add(Object *);
//
// Insert() will insert an object at the given position. If the
// position is larger than the number of objects in the vector, the
// object is appended; no new objects are created between the end
// of the vector and the given position.
//
void Insert(Object *, int position);
//
// Assign() will assign the object to the given position, replacing
// the object currently there. It is functionally equivalent to calling
// RemoveFrom() followed by Insert()
void Assign(Object *, int position);
//
// Find the given object in the vector and remove it from the vector.
// The object will NOT be deleted. If the object is not found,
// NOTOK will be returned, else OK.
//
int Remove(Object *);
//
// Remove the object at the given position
// (in some sense, the inverse of Insert)
//
int RemoveFrom(int position);
//
// Release() will remove all the objects from the vector.
// This will NOT delete them
void Release();
//
// Destroy() will delete all the objects in the vector. This is
// equivalent to calling the destructor
//
void Destroy();
//
// Vector traversel (a bit redundant since you can use [])
//
void Start_Get() {current_index = -1;}
Object *Get_Next();
Object *Get_First();
Object *Next(Object *current);
Object *Previous(Object *current);
Object *Last() {return element_count<=0?(Object *)NULL:data[element_count-1];}
//
// Direct access to vector items. To assign new objects, use
// Insert() or Add() or Assign()
//
Object *operator[] (int n) {return (n<0||n>=element_count)?(Object *)NULL:data[n];}
Object *Nth(int n) {return (n<0||n>=element_count)?(Object *)NULL:data[n];}
//
// Access to the number of elements
//
int Count() const {return element_count;}
int IsEmpty() {return element_count==0;}
//
// Get the index number of an object. If the object is not found,
// returns -1
//
int Index(Object *);
//
// Deep copy member function
//
Object *Copy() const;
//
// Vector Assignment
//
HtVector &operator= (HtVector *vector) {return *this = *vector;}
HtVector &operator= (HtVector &vector);
protected:
//
// The actual internal data array
Object **data;
//
// For traversal it is nice to know where we are...
//
int current_index;
//
// It's nice to keep track of how many things we contain...
// as well as how many slots we've declared
//
int element_count;
int allocated;
//
// Protected function to ensure capacity
//
void Allocate(int ensureCapacity);
};
#endif