/*
*****************************************************************************************
*                                                                                       *
* COPYRIGHT:                                                                            *
*   (C) Copyright Taligent, Inc.,  1996                                                 *
*   (C) Copyright International Business Machines Corporation,  1996-1998               *
*   Licensed Material - Program-Property of IBM - All Rights Reserved.                  *
*   US Government Users Restricted Rights - Use, duplication, or disclosure             *
*   restricted by GSA ADP Schedule Contract with IBM Corp.                              *
*                                                                                       *
*****************************************************************************************
*/
//===============================================================================
//
// File tables.cpp
//
// Contains:
//  EntryPair               - Represents a contracting-character string
//  PointerToPatternEntry   - a smart pointer to a PatternEntry
//
//  VectorOfInt             - Dynamic array classes, in lieu of templates
//  VectorOfPointer 
//  VectorOfPToExpandTable
//  VectorOfPToContractElement
//  VectorOfPointersToPatternEntry
//              
// All of these classes are fairly small and self-explanatory, so they don't
// contain too many internal comments.
//
// Created by: Helena Shih
//
// Modification History:
//
//  Date        Name        Description
//  2/5/97      aliu        Added streamIn and streamOut methods to EntryPair,
//                          VectorOfInt, VectorOfPToExpandTable, VectorOfPToContractElement,
//                          VectorOfPToContractTable.  These are used by TableCollation
//                          streamIn and streamOut methods.
//  2/11/97     aliu        Moved declarations out of for loop initializer.
//  3/5/97      aliu        Made VectorOfPointersToPatternEntry::at() inline.
//  6/18/97     helena      Added VectorOfPointer for MergeCollation.
//  6/23/97     helena      Added comments to make code more readable.  Since 
//                          this is converted from a templatized version, the comment
//                          is only added to one class.
//  8/04/98        erm            Added EntryPair::fwd.
//===============================================================================
#ifndef _TABLES
#include "tables.h"
#endif

#ifndef _PTNENTRY
#include "ptnentry.h"
#endif

#ifndef _FILESTRM
#include "filestrm.h"
#endif

#ifndef _UNISTRM
#include "unistrm.h"
#endif

//=======================================================================================
// METHODS ON EntryPair
//=======================================================================================

void EntryPair::streamOut(FileStream* os) const
{
    if (!T_FileStream_error(os))
    {
        UnicodeStringStreamer::streamOut(&entryName, os);
        T_FileStream_write(os, &value, sizeof(value));
        T_FileStream_write(os, &fwd, sizeof(fwd));
    }
}

void EntryPair::streamIn(FileStream* is)
{
    if (!T_FileStream_error(is))
    {
        UnicodeStringStreamer::streamIn(&entryName, is);
        T_FileStream_read(is, &value, sizeof(value));
        T_FileStream_read(is, &fwd, sizeof(fwd));
    }
}

//=======================================================================================
// METHODS ON VectorOfInt
//=======================================================================================

VectorOfInt::VectorOfInt(int32_t    initialSize)
: fSize(0),
  fCapacity(0),
  fElements(0),
  fBogus(FALSE)
{
    if (initialSize != 0) {
        resize(initialSize);
        if (fBogus) return;
    }
}

// Copy constructor
VectorOfInt::VectorOfInt(const VectorOfInt& that)
: fSize(that.fSize),
  fCapacity(that.fCapacity),
  fElements(0),
  fBogus(FALSE)
{
    fElements = new int32_t[fCapacity];
    if (!fElements) {
        fBogus = TRUE;
        return;
    }
    int32_t*    to = fElements;
    int32_t*    from = that.fElements;
    int32_t*    end = &(fElements[fCapacity]);

    while (to < end)
        *to++ = *from++;
}

VectorOfInt::~VectorOfInt()
{
    delete [] fElements;
}

// assignment operator
const VectorOfInt&
VectorOfInt::operator=(const VectorOfInt&   that)
{
    if (this != &that) {
        // resize if necessary
        if (fCapacity < that.fSize) {
            delete [] fElements;
            fElements = 0;
            fElements = new int32_t[that.fCapacity];
            if (!fElements) { 
                fBogus = TRUE;
                return *this;
            }
            fCapacity = that.fCapacity;
        }

        int32_t*    to = fElements;
        int32_t*    from = that.fElements;
        int32_t*    cutover = &(fElements[that.fCapacity]);
        int32_t*    end = &(fElements[fCapacity]);

        while (to < cutover)
            *to++ = *from++;
        while (to < end)
            *to++ = 0;

        fSize = that.fSize;
    }
    return *this;
}

bool_t
VectorOfInt::isBogus() const
{
    return fBogus;
}

bool_t
VectorOfInt::operator==(const VectorOfInt&  that)
{
    if (this == &that) return TRUE;
    if (fSize != that.fSize) return FALSE;
    for (int32_t i = 0; i < fSize; i++) {
        if (fElements[i] != that.fElements[i])
            return FALSE;
    }
    return TRUE;
}

bool_t
VectorOfInt::operator!=(const VectorOfInt& that)
{
    return !(*this == that);
}

// replace the element at the index
void
VectorOfInt::atPut( int32_t     index,
                const int32_t&  value)
{
    if (index >= fSize) {
        if (index >= fCapacity) {
            resize(index + 1);
            if (fBogus) return;
        }
        else
            fSize = index + 1;
    }
    fElements[index] = value;
}

// insert the element at the index, shift down the following elements
void
VectorOfInt::atInsert(  int32_t         index,
                        const   int32_t&    value)
{
    if (fSize + 1 >= fCapacity) {
        resize(fSize + 1);
        if (fBogus) return;
    } else {
        fSize++;
    }
    int32_t i;
    for (i = fSize - 2 ; i >= index; i--)
    {
        fElements[i+1] = fElements[i];
    }
    fElements[index] = value;
}

// Resize the element array.  Create a new array and copy the elements over 
// then discard the old array.
void
VectorOfInt::resize(int32_t newSize)
{
    int32_t     newCapacity;

    newCapacity = newSize / GROWTH_RATE;
    if (newCapacity < 10)
        newCapacity = 10;
    newCapacity += newSize;

    int32_t*    newArray = 0;
    newArray    = new int32_t[newCapacity];
    if (!newArray) {
        fBogus = TRUE;
        return;
    }

    int32_t*    iter = newArray;
    int32_t*    cutover = &(newArray[fCapacity]);
    int32_t*    end = &(newArray[newCapacity]);
    int32_t*    from = fElements;

    while (iter < cutover)
        *iter++ = *from++;
    while (iter < end)
        *iter++ = 0;

    delete [] fElements;
    fElements = newArray;
    fSize = newSize;
    fCapacity = newCapacity;
}

// Do not detect the out of bounds error, try to do the right thing
// by resizing the array.
int32_t&
VectorOfInt::operator[](int32_t index)
{
    if (index >= fSize) {
        if (index >= fCapacity) {
            resize(index + 1);
            if (fBogus) return fElements[0]; // HSYS : Is this correct?
        }
        else
            fSize = index + 1;
    }
    return fElements[index];
}

void
VectorOfInt::streamOut(FileStream* os) const
{
    if (!T_FileStream_error(os))
    {
        T_FileStream_write(os, &fSize, sizeof(fSize));
        T_FileStream_write(os, fElements, sizeof(*fElements) * fSize);
    }
}

void
VectorOfInt::streamIn(FileStream* is)
{
    if (!T_FileStream_error(is))
    {
        int32_t newSize;
        T_FileStream_read(is, &newSize, sizeof(newSize));
        resize(newSize);
        if (fBogus) return;
        T_FileStream_read(is, fElements, sizeof(*fElements) * newSize);
    }
}

//=======================================================================================
// METHODS ON VectorOfPointer
//=======================================================================================

VectorOfPointer::VectorOfPointer(int32_t    initialSize)
: fSize(0),
  fCapacity(0),
  fElements(0),
  fBogus(FALSE)
{
    if (initialSize != 0) {
        resize(initialSize);
        if (fBogus) return;
    }
}

VectorOfPointer::VectorOfPointer(const VectorOfPointer& that)
: fSize(that.fSize),
  fCapacity(that.fCapacity),
  fElements(0),
  fBogus(FALSE)
{
    fElements = new void*[fCapacity];
    if (!fElements) {
        fBogus = TRUE;
        return;
    }
    void**  to = fElements;
    void**  from = that.fElements;
    void**  end = &(fElements[fCapacity]);

    while (to < end)
        *to++ = *from++;
}

VectorOfPointer::~VectorOfPointer()
{
    delete [] fElements;
}

const VectorOfPointer&
VectorOfPointer::operator=(const VectorOfPointer&   that)
{
    if (this != &that) {
        if (fCapacity < that.fSize) {
            delete [] fElements;
            fElements = 0;
            fElements = new void*[that.fCapacity];
            if (!fElements) { 
                fBogus = TRUE;
                return *this;
            }
            fCapacity = that.fCapacity;
        }

        void**  to = fElements;
        void**  from = that.fElements;
        void**  cutover = &(fElements[that.fCapacity]);
        void**  end = &(fElements[fCapacity]);

        while (to < cutover)
            *to++ = *from++;
        while (to < end)
            *to++ = 0;

        fSize = that.fSize;
    }
    return *this;
}

bool_t

VectorOfPointer::isBogus() const
{
    return fBogus;
}

bool_t
VectorOfPointer::operator==(const VectorOfPointer&  that)
{
    if (this == &that) return TRUE;
    if (fSize != that.fSize) return FALSE;
    for (int32_t i = 0; i < fSize; i++) {
        if (fElements[i] != that.fElements[i])
            return FALSE;
    }
    return TRUE;
}

bool_t
VectorOfPointer::operator!=(const VectorOfPointer& that)
{
    return !(*this == that);
}
void
VectorOfPointer::atPut( int32_t     index,
                        const void*&    value)
{
    if (index >= fSize) {
        if (index >= fCapacity) {
            resize(index + 1);
            if (fBogus) return;
        }
        else
            fSize = index + 1;
    }
    fElements[index] = (void*)value;
}

void
VectorOfPointer::atInsert(  int32_t         index,
                            const   void*&  value)
{
    if (fSize + 1 >= fCapacity) {
        resize(fSize + 1);
        if (fBogus) return;
    } else {
        fSize++;
    }
    int32_t i;
    for (i = fSize - 2 ; i >= index; i--)
    {
        fElements[i+1] = fElements[i];
    }
    fElements[index] = (void*)value;
}

void
VectorOfPointer::resize(int32_t newSize)
{
    int32_t     newCapacity;

    newCapacity = newSize / GROWTH_RATE;
    if (newCapacity < 10)
        newCapacity = 10;
    newCapacity += newSize;

    void**  newArray = 0;
    newArray    = new void*[newCapacity];
    if (!newArray) {
        fBogus = TRUE;
        return;
    }

    void**  iter = newArray;
    void**  cutover = &(newArray[fCapacity]);
    void**  end = &(newArray[newCapacity]);
    void**  from = fElements;

    while (iter < cutover)
        *iter++ = *from++;
    while (iter < end)
        *iter++ = 0;

    delete [] fElements;
    fElements = newArray;
    fSize = newSize;
    fCapacity = newCapacity;
}

void*&
VectorOfPointer::operator[](int32_t index)
{
    if (index >= fSize) {
        if (index >= fCapacity) {
            resize(index + 1);
            if (fBogus) return fElements[0]; // HSYS : Is this correct?
        }
        else
            fSize = index + 1;
    }
    return fElements[index];
}
//=======================================================================================
// METHODS ON VectorOfPToExpandTable
//=======================================================================================

VectorOfPToExpandTable::VectorOfPToExpandTable(int32_t  initialSize)
: fSize(0),
  fCapacity(0),
  fElements(0),
  fBogus(FALSE)
{
    if (initialSize != 0) {
        resize(initialSize);
        if (fBogus) return;
    }
}

VectorOfPToExpandTable::VectorOfPToExpandTable(const VectorOfPToExpandTable& that)
: fSize(that.fSize),
  fCapacity(that.fCapacity),
  fElements(0),
  fBogus(FALSE)
{
    fElements = new VectorOfInt*[fCapacity];
    if (!fElements) {
        fBogus = TRUE;
        return;
    }
    VectorOfInt**       to = fElements;
    VectorOfInt**       from = that.fElements;
    VectorOfInt**       end = &(fElements[fCapacity]);

    while (to < end) {
        if (*from == 0)
            *to++ = *from++;
        else
            // We actually DUPLICATE the items pointed to by "that"
            *to = new VectorOfInt(*(*from++));
            if ((*to)->isBogus()) {
                delete [] fElements;
                fElements = 0;
                return;
            }
            to++;
    }
}

VectorOfPToExpandTable::~VectorOfPToExpandTable()
{
    VectorOfInt**       iter = fElements;
    VectorOfInt**       end = &(fElements[fSize]);

    while (iter < end)
        delete *iter++;

    delete [] fElements;
}

bool_t
VectorOfPToExpandTable::isBogus() const
{
    return fBogus;
}

const VectorOfPToExpandTable&
VectorOfPToExpandTable::operator=(const VectorOfPToExpandTable& that)
{
    if (this != &that) {
        if (fCapacity < that.fSize) {
            delete [] fElements;
            fElements = 0;
            fElements = new VectorOfInt*[that.fCapacity];
            if (!fElements) {
                fBogus = TRUE;
                return *this;
            }
            fCapacity = that.fCapacity;
        }

        VectorOfInt**       to = fElements;
        VectorOfInt**       from = that.fElements;
        VectorOfInt**       cutover = &(fElements[that.fCapacity]);
        VectorOfInt**       end = &(fElements[fCapacity]);

        while (to < cutover) {
            delete *to;
            if (*from == 0)
                *to++ = *from++;
            else {
                *to = new VectorOfInt(*(*from++));
                if ((*to)->isBogus()) {
                    delete [] fElements;
                    fElements = 0;
                    return *this;
                }
                to++;
            }
        }
        while (to < end) {
            delete *to;
            *to++ = 0;
        }

        fSize = that.fSize;
    }
    return *this;
}

PToExpandTable
VectorOfPToExpandTable::operator[](int32_t  index)
{
    if (index >= fSize) {
        if (index >= fCapacity) {
            resize(index + 1);
            if (fBogus) return fElements[0];  // Always return the first element
        }
        else
            fSize = index + 1;
    }
    return fElements[index];
}

void
VectorOfPToExpandTable::atPut(  int32_t         index,
                                VectorOfInt*    value)
{
    if (index >= fSize) {
        if (index >= fCapacity) {
            resize(index + 1);
            if (fBogus) return;
        }
        else
            fSize = index + 1;
    }

    delete fElements[index];
    fElements[index] = value;
}

VectorOfInt*
VectorOfPToExpandTable::orphanAt(int32_t    index)
{
    if (index > fSize)
        return 0;
    else {
        VectorOfInt*        returnVal = fElements[index];
        fElements[index] = 0;
        return returnVal;
    }
}

void
VectorOfPToExpandTable::resize(int32_t  newSize)
{
    int32_t     newCapacity;

    newCapacity = newSize / GROWTH_RATE;
    if (newCapacity < 10)
        newCapacity = 10;
    newCapacity += newSize;

    VectorOfInt**       newArray = 0;
    newArray = new VectorOfInt*[newCapacity];
    if (!newArray) {
        fBogus = TRUE;
        return;
    }
    VectorOfInt**       iter = newArray;
    VectorOfInt**       cutover = &(newArray[fCapacity]);
    VectorOfInt**       end = &(newArray[newCapacity]);
    VectorOfInt**       from = fElements;

    while (iter < cutover)
        *iter++ = *from++;
    while (iter < end)
        *iter++ = 0;

    delete [] fElements;
    fElements = newArray;
    fSize = newSize;
    fCapacity = newCapacity;
}

void
VectorOfPToExpandTable::streamOut(FileStream* os) const
{
    if (!T_FileStream_error(os))
    {
        T_FileStream_write(os, &fSize, sizeof(fSize));
        int32_t i;
        for (i=0; i<fSize; ++i)
        {
            char isNull = (fElements[i] == 0);
            T_FileStream_write(os, &isNull, sizeof(isNull));
            if (!isNull) fElements[i]->streamOut(os);
        }
    }
}

void
VectorOfPToExpandTable::streamIn(FileStream* is)
{
    if (!T_FileStream_error(is))
    {
        int32_t newSize;
        T_FileStream_read(is, &newSize, sizeof(newSize));
        resize(newSize);
        if (fBogus) return;
        int32_t i;
        for (i=0; i<newSize; ++i)
        {
            char isNull;
            T_FileStream_read(is, &isNull, sizeof(isNull));
            if (isNull)
            {
                delete fElements[i];
                fElements[i] = 0;
            }
            else
            {
                if (fElements[i] == 0) fElements[i] = new VectorOfInt;
                fElements[i]->streamIn(is);
                if (fElements[i]->isBogus()) {
                    fBogus = TRUE;
                    return;
                }
            }
        }
    }
}

//=======================================================================================
// METHODS ON VectorOfPToContractElement
//=======================================================================================

VectorOfPToContractElement::VectorOfPToContractElement(int32_t  initialSize)
: fSize(0),
  fCapacity(0),
  fElements(0),
  fBogus(FALSE)
{
    if (initialSize != 0) {
        resize(initialSize);
        if (fBogus) return;
    }
}

VectorOfPToContractElement::VectorOfPToContractElement(const VectorOfPToContractElement&    that)
: fSize(that.fSize),
  fCapacity(that.fCapacity),
  fElements(0),
  fBogus(FALSE)
{
    fElements = new EntryPair*[fCapacity];
    if (!fElements) {
        fBogus = TRUE;
        return;
    }
    EntryPair**     to = fElements;
    EntryPair**     from = that.fElements;
    EntryPair**     end = &(fElements[fCapacity]);

    while (to < end) {
        if (*from == 0)
            *to++ = *from++;
        else
            // We actually DUPLICATE the items pointed to by "that"
            *to++ = new EntryPair(*(*from++));
    }
}

VectorOfPToContractElement::~VectorOfPToContractElement()
{
    EntryPair**     iter = fElements;
    EntryPair**     end = &(fElements[fSize]);

    while (iter < end)
        delete *iter++;

    delete [] fElements;
}

bool_t
VectorOfPToContractElement::isBogus() const
{
    return fBogus;
}

const VectorOfPToContractElement&
VectorOfPToContractElement::operator=(const VectorOfPToContractElement& that)
{
    if (this != &that) {
        if (fCapacity < that.fSize) {
            delete [] fElements;
            fElements = 0;
            fElements = new EntryPair*[that.fCapacity];
            if (!fElements) {
                fBogus = TRUE;
                return *this;
            }
            fCapacity = that.fCapacity;
        }

        EntryPair**     to = fElements;
        EntryPair**     from = that.fElements;
        EntryPair**     cutover = &(fElements[that.fCapacity]);
        EntryPair**     end = &(fElements[fCapacity]);

        while (to < cutover) {
            delete *to;
            if (*from == 0)
                *to++ = *from++;
            else
                *to++ = new EntryPair(*(*from++));
        }
        while (to < end) {
            delete *to;
            *to++ = 0;
        }

        fSize = that.fSize;
    }
    return *this;
}

PToContractElement
VectorOfPToContractElement::operator[](int32_t  index)
{
    if (index >= fSize) {
        if (index >= fCapacity) {
            resize(index + 1);
            if (fBogus) return fElements[0];
        }
        else
            fSize = index + 1;
    }
    return fElements[index];
}

void
VectorOfPToContractElement::atPut(  int32_t     index,
                                    EntryPair*      value)
{
    if (index >= fSize) {
        if (index >= fCapacity) {
            resize(index + 1); 
            if (fBogus) return;
        }
        else
            fSize = index + 1;
    }

    delete fElements[index];
    fElements[index] = value;
}

void
VectorOfPToContractElement::atInsert(   int32_t     index,
                                        EntryPair*  value)
{
    if (fSize + 1 >= fCapacity) {
        resize(fSize + 1);
        if (fBogus) return;
    } else {
        fSize++;
    }
    int32_t i;
    for (i = fSize - 2 ; i >= index; i--)
    {
        fElements[i+1] = fElements[i];
    }
    fElements[index] = value;
}

EntryPair*
VectorOfPToContractElement::orphanAt(int32_t    index)
{
    if (index > fSize)
        return 0;
    else {
        EntryPair*      returnVal = fElements[index];
        fElements[index] = 0;
        return returnVal;
    }
}

void
VectorOfPToContractElement::resize(int32_t  newSize)
{
    int32_t     newCapacity;

    newCapacity = newSize / GROWTH_RATE;
    if (newCapacity < 10)
        newCapacity = 10;
    newCapacity += newSize;

    EntryPair**     newArray = 0;
    newArray = new EntryPair*[newCapacity];
    if (!newArray) {
        fBogus = TRUE;
        return;
    }
    EntryPair**     iter = newArray;
    EntryPair**     cutover = &(newArray[fCapacity]);
    EntryPair**     end = &(newArray[newCapacity]);
    EntryPair**     from = fElements;

    while (iter < cutover)
        *iter++ = *from++;
    while (iter < end)
        *iter++ = 0;

    delete [] fElements;
    fElements = newArray;
    fSize = newSize;
    fCapacity = newCapacity;
}

void
VectorOfPToContractElement::streamOut(FileStream* os) const
{
    if (!T_FileStream_error(os))
    {
        T_FileStream_write(os, &fSize, sizeof(fSize));
        int32_t i;
        for (i=0; i<fSize; ++i)
        {
            char isNull = (fElements[i] == 0);
            T_FileStream_write(os, &isNull, sizeof(isNull));
            if (!isNull) fElements[i]->streamOut(os);
        }
    }
}

void
VectorOfPToContractElement::streamIn(FileStream* is)
{
    if (!T_FileStream_error(is))
    {
        int32_t newSize;
        T_FileStream_read(is, &newSize, sizeof(newSize));
        resize(newSize);
        if (fBogus) return;
        int32_t i;
        for (i=0; i<newSize; ++i)
        {
            char isNull;
            T_FileStream_read(is, &isNull, sizeof(isNull));
            if (isNull)
            {
                delete fElements[i];
                fElements[i] = 0;
            }
            else
            {
                if (fElements[i] == 0) fElements[i] = new EntryPair;
                fElements[i]->streamIn(is);
            }
        }
    }
}

//=======================================================================================
// METHODS ON VectorOfPToContractTable
//=======================================================================================

VectorOfPToContractTable::VectorOfPToContractTable(int32_t  initialSize)
: fSize(0),
  fCapacity(0),
  fElements(0),
  fBogus(FALSE)
{
    if (initialSize != 0) {
        resize(initialSize);
        if (fBogus) return;
    }
}

VectorOfPToContractTable::VectorOfPToContractTable(const VectorOfPToContractTable&  that)
: fSize(that.fSize),
  fCapacity(that.fCapacity),
  fElements(0),
  fBogus(FALSE)
{
    fElements = new VectorOfPToContractElement*[fCapacity];
    if (!fElements) {
        fBogus = TRUE;
        return;
    }
    VectorOfPToContractElement**        to = fElements;
    VectorOfPToContractElement**        from = that.fElements;
    VectorOfPToContractElement**        end = &(fElements[fCapacity]);

    while (to < end) {
        if (*from == 0)
            *to++ = *from++;
        else {
            // We actually DUPLICATE the items pointed to by "that"
            *to = new VectorOfPToContractElement(*(*from++));
            if ((*to)->isBogus()) {
                delete [] fElements;
                fElements = 0;
                return;
            }
            to++;
        }
    }
}

VectorOfPToContractTable::~VectorOfPToContractTable()
{
    VectorOfPToContractElement**        iter = fElements;
    VectorOfPToContractElement**        end = &(fElements[fSize]);

    while (iter < end)
        delete *iter++;

    delete [] fElements;
}

bool_t
VectorOfPToContractTable::isBogus() const
{
    return fBogus;
}

const VectorOfPToContractTable&
VectorOfPToContractTable::operator=(const VectorOfPToContractTable& that)
{
    if (this != &that) {
        if (fCapacity < that.fSize) {
            delete [] fElements;
            fElements = 0;
            fElements = new VectorOfPToContractElement*[that.fCapacity];
            if (!fElements) {
                fBogus = TRUE;
                return *this;
            }
            fCapacity = that.fCapacity;
        }

        VectorOfPToContractElement**        to = fElements;
        VectorOfPToContractElement**        from = that.fElements;
        VectorOfPToContractElement**        cutover = &(fElements[that.fCapacity]);
        VectorOfPToContractElement**        end = &(fElements[fCapacity]);

        while (to < cutover) {
            delete *to;
            if (*from == 0)
                *to++ = *from++;
            else {
                *to = new VectorOfPToContractElement(*(*from++));
                if ((*to)->isBogus()) {
                    delete [] fElements;
                    fElements = 0;
                    return *this;
                }
                to++;
            }
        }
        while (to < end) {
            delete *to;
            *to++ = 0;
        }

        fSize = that.fSize;
    }
    return *this;
}

void
VectorOfPToContractTable::atPut(    int32_t     index,
                                    VectorOfPToContractElement*     value)
{
    if (index >= fSize) {
        if (index >= fCapacity) {
            resize(index + 1);
            if (fBogus) return;
        }
        else
            fSize = index + 1;
    }

    delete fElements[index];
    fElements[index] = value;
}

PToContractTable
VectorOfPToContractTable::operator[](int32_t    index)
{
    if (index >= fSize) {
        if (index >= fCapacity) {
            resize(index + 1);
            if (fBogus) return fElements[0];
        }
        else
            fSize = index + 1;
    }
    return fElements[index];
}

VectorOfPToContractElement*
VectorOfPToContractTable::orphanAt(int32_t  index)
{
    if (index > fSize)
        return 0;
    else {
        VectorOfPToContractElement*     returnVal = fElements[index];
        fElements[index] = 0;
        return returnVal;
    }
}

void
VectorOfPToContractTable::resize(int32_t    newSize)
{
    int32_t     newCapacity;

    newCapacity = newSize / GROWTH_RATE;
    if (newCapacity < 10)
        newCapacity = 10;
    newCapacity += newSize;

    VectorOfPToContractElement**        newArray = 0;
    newArray = new VectorOfPToContractElement*[newCapacity];
    if (!newArray) {
        fBogus = TRUE;
        return;
    }
    VectorOfPToContractElement**        iter = newArray;
    VectorOfPToContractElement**        cutover = &(newArray[fCapacity]);
    VectorOfPToContractElement**        end = &(newArray[newCapacity]);
    VectorOfPToContractElement**        from = fElements;

    while (iter < cutover)
        *iter++ = *from++;
    while (iter < end)
        *iter++ = 0;

    delete [] fElements;
    fElements = newArray;
    fSize = newSize;
    fCapacity = newCapacity;
}

void
VectorOfPToContractTable::streamOut(FileStream* os) const
{
    if (!T_FileStream_error(os))
    {
        T_FileStream_write(os, &fSize, sizeof(fSize));
        int32_t i;
        for (i=0; i<fSize; ++i)
        {
            char isNull = (fElements[i] == 0);
            T_FileStream_write(os, &isNull, sizeof(isNull));
            if (!isNull) fElements[i]->streamOut(os);
        }
    }
}

void
VectorOfPToContractTable::streamIn(FileStream* is)
{
    if (!T_FileStream_error(is))
    {
        int32_t newSize;
        T_FileStream_read(is, &newSize, sizeof(newSize));
        resize(newSize);
        if (fBogus) return;
        int32_t i;
        for (i=0; i<newSize; ++i)
        {
            char isNull;
            T_FileStream_read(is, &isNull, sizeof(isNull));
            if (isNull)
            {
                delete fElements[i];
                fElements[i] = 0;
            }
            else
            {
                if (fElements[i] == 0) fElements[i] = new VectorOfPToContractElement;
                fElements[i]->streamIn(is);
            }
        }
    }
}

//=======================================================================================
// METHODS ON PointerToPatternEntry
//=======================================================================================

PointerToPatternEntry::PointerToPatternEntry(PatternEntry*& value)
: fValue(value)
{
}

PointerToPatternEntry::PointerToPatternEntry(const PointerToPatternEntry&   that)
: fValue(that.fValue)
{
}

PointerToPatternEntry::~PointerToPatternEntry()
{
}

const PointerToPatternEntry&
PointerToPatternEntry::operator=(PatternEntry*  newValue)
{
    delete fValue;
    fValue = newValue;
    return *this;
}

const PointerToPatternEntry&
PointerToPatternEntry::operator=(const PointerToPatternEntry&   pointerToNewValue)
{
    delete fValue;
    fValue = (PatternEntry*)(pointerToNewValue);
    return *this;
}

PointerToPatternEntry::operator PatternEntry*() const
{
    return fValue;
}

//=======================================================================================
// METHODS ON VectorOfPointersToPatternEntry
//=======================================================================================
VectorOfPointersToPatternEntry::VectorOfPointersToPatternEntry(int32_t  initialSize)
: fSize(0),
  fCapacity(0),
  fElements(0),
  fBogus(FALSE)
{
    if (initialSize != 0) {
        resize(initialSize);
        if (fBogus) return;
    }
}

VectorOfPointersToPatternEntry::VectorOfPointersToPatternEntry(const VectorOfPointersToPatternEntry& that)
: fSize(that.fSize),
  fCapacity(that.fCapacity),
  fElements(0),
  fBogus(FALSE)
{
    fElements = new PatternEntry*[fCapacity];
    if (!fElements) {
        fBogus = TRUE;
        return;
    }
    PatternEntry**      to = fElements;
    PatternEntry**      from = that.fElements;
    PatternEntry**      end = &(fElements[fCapacity]);

    while (to < end) {
        if (*from == 0)
            *to++ = *from++;
        else
            // We actually DUPLICATE the items pointed to by "that"
            *to++ = new PatternEntry(*(*from++));
    }
}

VectorOfPointersToPatternEntry::~VectorOfPointersToPatternEntry()
{
    PatternEntry**      iter = fElements;
    PatternEntry**      end = &(fElements[fSize]);

    while (iter < end)
        delete *iter++;

    delete [] fElements;
}

bool_t
VectorOfPointersToPatternEntry::isBogus() const
{
    return fBogus;
}

const VectorOfPointersToPatternEntry&
VectorOfPointersToPatternEntry::operator=(const VectorOfPointersToPatternEntry& that)
{
    if (this != &that) {
        if (fCapacity < that.fSize) {
            delete [] fElements;
            fElements = 0;
            fElements = new PatternEntry*[that.fCapacity];
            if (!fElements) {
                fBogus = TRUE;
                return *this;
            }
            fCapacity = that.fCapacity;
        }

        PatternEntry**      to = fElements;
        PatternEntry**      from = that.fElements;
        PatternEntry**      cutover = &(fElements[that.fCapacity]);
        PatternEntry**      end = &(fElements[fCapacity]);

        while (to < cutover) {
            delete *to;
            if (*from == 0)
                *to++ = *from++;
            else
                *to++ = new PatternEntry(*(*from++));
        }
        while (to < end) {
            delete *to;
            *to++ = 0;
        }

        fSize = that.fSize;
    }
    return *this;
}

PatternEntry*
VectorOfPointersToPatternEntry::operator[](int32_t  index) const
{
    return (index < fCapacity) ? fElements[index] : 0;
}

PointerToPatternEntry
VectorOfPointersToPatternEntry::operator[](int32_t  index)
{
    if (index >= fSize) {
        if (index >= fCapacity) {
            resize(index + 1);
            if (fBogus) return fElements[0];
        }
        else
            fSize = index + 1;
    }
    return fElements[index];
}

void
VectorOfPointersToPatternEntry::atPut(  int32_t         index,
                                        PatternEntry*   value)
{
    if (index >= fSize) {
        if (index >= fCapacity) {
            resize(index + 1);
            if (fBogus) return;
        }
        else
            fSize = index + 1;
    }

    delete fElements[index];
    fElements[index] = value;
}

void
VectorOfPointersToPatternEntry::atInsert(   int32_t         index,
                                            PatternEntry*   value)
{
    if (fSize + 1 >= fCapacity) {
        resize(fSize + 1);
        if (fBogus) return;
    } else {
        fSize++;
    }
    int32_t i;
    for (i = fSize - 2 ; i >= index; i--)
    {
        fElements[i+1] = fElements[i];
    }
    fElements[index] = value;
}

PatternEntry*
VectorOfPointersToPatternEntry::orphanAt(int32_t    index)
{
    if (index > fSize)
        return 0;
    else {
        PatternEntry*   returnVal = fElements[index];
        fElements[index] = 0;
        return returnVal;
    }
}

void
VectorOfPointersToPatternEntry::clear()
{
    int32_t i;

    for (i = 0; i < fSize; i += 1)
    {
        delete fElements[i];
        fElements[i] = NULL;
    }

    fSize = 0;
}

int32_t
VectorOfPointersToPatternEntry::size() const
{
    return fSize;
}

int32_t
VectorOfPointersToPatternEntry::indexOf(const PatternEntry* value) const
{
    int32_t i;

    if (value == NULL)
    {
        for (i = 0; i < fSize; i += 1)
        {
            if (fElements[i] == NULL)
            {
                return i;
            }
        }
    }
    else
    {
        for (i = 0; i < fSize; i += 1)
        {
            if (fElements[i] != NULL && value->equals(*fElements[i]))
            {
                return i;
            }
        }
    }

    return -1;
}

int32_t
VectorOfPointersToPatternEntry::lastIndexOf(const PatternEntry* value) const
{
    int32_t i;

    if (value == NULL)
    {
        for (i = fSize - 1; i >= 0; i -= 1)
        {
            if (fElements[i] == NULL)
            {
                return i;
            }
        }
    }
    else
    {
        for (i = fSize - 1; i >= 0; i -= 1)
        {
            if (fElements[i] != NULL && value->equals(*fElements[i]))
            {
                return i;
            }
        }
    }

    return -1;
}

void
VectorOfPointersToPatternEntry::resize(int32_t  newSize)
{
    int32_t     newCapacity;

    newCapacity = newSize / GROWTH_RATE;
    if (newCapacity < 10)
        newCapacity = 10;
    newCapacity += newSize;

    PatternEntry**      newArray = 0;
    newArray = new PatternEntry*[newCapacity];
    if (!newArray) {
        fBogus = TRUE;
        return;
    }
    PatternEntry**      iter = newArray;
    PatternEntry**      cutover = &(newArray[fCapacity]);
    PatternEntry**      end = &(newArray[newCapacity]);
    PatternEntry**      from = fElements;

    while (iter < cutover)
        *iter++ = *from++;
    while (iter < end)
        *iter++ = 0;

    delete [] fElements;
    fElements = newArray;
    fSize = newSize;
    fCapacity = newCapacity;
}
