//----------------------------------------------------------------------
//  IMPLEMENTATION FILE (clist.cpp)
//  This module exports a class for maintaining lists of
//  single characters
//  List representation: a char vector
//----------------------------------------------------------------------
#include "clist.h"

// Private members of class:
//    int  currPos;         // Subscript representing current position
//                             (-1 if list is empty)
//    int  lastPos;         // Subscript of last item in list
//                             (-1 if list is empty)
//    char data[MAX_LENG];  // Vector representing the list
//
// CLASSINV:  -1 <= lastPos < MAX_LENG
//         && -1 <= currPos <= MAX_LENG

CharList::CharList()
    //..................................................................
    // Constructor
    // POST: Empty list created
    //..................................................................
{
    lastPos = currPos = -1;
}

Boolean CharList::IsEmpty() const
    //..................................................................
    // POST: FCTVAL == (lastPos == -1)
    //..................................................................
{
    return (lastPos == -1);
}

Boolean CharList::IsFull() const
    //..................................................................
    // POST: FCTVAL == (lastPos == MAX_LENG-1)
    //..................................................................
{
    return (lastPos == MAX_LENG-1);
}

void CharList::Reset()
    //..................................................................
    // PRE:  lastPos != -1
    // POST: currPos == 0
    //..................................................................
{
    currPos = 0;
}

Boolean CharList::EndOfList() const
    //..................................................................
    // POST: FCTVAL == (currPos > lastPos)
    //..................................................................
{
    return (currPos > lastPos);
}

void CharList::Advance()
    //..................................................................
    // PRE:  lastPos != -1  &&  currPos <= lastPos
    // POST: currPos == (currPos<entry>) + 1
    //..................................................................
{
    currPos++;
}

char CharList::CurrentItem() const
    //..............................................................
    // PRE:  lastPos != -1  &&  currPos <= lastPos
    // POST: FCTVAL == data[currPos]
    //..................................................................
{
    return data[currPos];
}

void CharList::InsertBefore( /* in */ char someChar )
    //..................................................................
    // PRE:  Assigned(someChar)  &&  lastPos < MAX_LENG-1
    // POST: (lastPos == -1) --> currPos == 0
    //    && (lastPos>=0) --> data[currPos..lastPos<entry>] shifted down
    //    && data[currPos] == someChar  &&  lastPos == lastPos<entry> + 1
    //..................................................................
{
    if (lastPos == -1)
        currPos = 0;
    else {
        int i;
        for (i = lastPos; i >= currPos; i--)
            data[i+1] = data[i];
    }
    data[currPos] = someChar;
    lastPos++;
}

void CharList::InsertAfter( /* in */ char someChar )
    //..................................................................
    // PRE:  Assigned(someChar)  &&  0 <= lastPos < MAX_LENG-1
    //   &&  currPos <= lastPos
    // POST: data[currPos<entry>+1..lastPos<entry>] shifted down
    //    && data[currPos<entry>+1] == someChar
    //    && currPos == currPos<entry>+1  &&  lastPos == lastPos<entry>+1
    //..................................................................
{
    int i;
    for (i = lastPos; i >= currPos+1; i--)
        data[i+1] = data[i];
    data[++currPos] = someChar;
    lastPos++;
}

void CharList::Delete()
    //..................................................................
    // PRE:  lastPos != -1  &&  currPos <= lastPos
    // POST: data[currPos+1..lastPos<entry>] shifted up
    //    && lastPos == lastPos<entry> - 1
    //..................................................................
{
    int i;
    for (i = currPos; i < lastPos; i++)
        data[i] = data[i+1];
    lastPos--;
}

