#ifndef INDEX_H_
#define INDEX_H_

/**
 * An Index behaves like a one-dimensional array of long integers, with
 * boundary checking.  Its principal use is indexing the elements of an
 * SArray, and representing its dimension.
 *
 * @short array of long integers
 */
class Index {
  unsigned int _size;
  long *_index;
 public:
  /**
   * Default constructor. Creates a NULL Index of length 0
   */
  Index();
  /**
   * Constructs an index of given length. All elements of the index
   * are set to 1.
   */
  Index(unsigned int size);
  /**
   * Copy constructor
   */
  Index(Index const &index);
  virtual ~Index();
  /**
   * Assignment operator
   */
  Index &operator=(Index const &rhs);
  /**
   * Number of elements in the index
   */
  unsigned int size() const;
  /**
   * Subscripting operator. Allows an index to behave like an array.
   * @param i index to access (starting from 0). 
   * @exception out_of_range
   */
  long &operator[](unsigned int i);
  long operator[](unsigned int i) const;
  /**
   * Test for equality of two indices.
   */
  bool operator==(Index const &other) const;
  /**
   * Inequality operator.
   */
  bool operator!=(Index const &other) const;
  /**
   * Lexicographic ordering
   */
  bool operator<(Index const &other) const;
};

#endif /* INDEX_H_ */


syntax highlighted by Code2HTML, v. 0.9.1