list.c++ 2.04 KB
//====================================================================
// list.c++
//
// Copyright 1994, Silicon Graphics, Inc.
// All Rights Reserved.
//
// Author(s)
//  Kevin Smith
//
// This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
// the contents of this file may not be disclosed to third parties, copied or
// duplicated in any form, in whole or in part, without the prior written
// permission of Silicon Graphics, Inc.
//
// RESTRICTED RIGHTS LEGEND:
// Use, duplication or disclosure by the Government is subject to restrictions
// as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
// and Computer Software clause at DFARS 252.227-7013, and/or in similar or
// successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
// rights reserved under the Copyright Laws of the United States.
//====================================================================

#include <libc.h>
#include <assert.h>
#include "list.h"

List::~List ()
{ 
    while (first) {
	RemoveData((ListNode **) &first); 
    }
}

void List::AppendData (ListIter where, void *data)
{
    ListNode *newNode = new ListNode;
    assert(newNode != 0);
    newNode->thing = data;

    if (where != 0 && (*where) != NULL) {
	newNode->next = (*where)->next;
	(*where)->next = newNode;
	if ((*where) == last) {
	    last = newNode;
	}
    } else {
	newNode->next = first;
	first = newNode;
	if (last == 0) last = newNode;
    }
    count++;
}

void List::RemoveData (ListIter where)
{
    if (where == 0 || (*where) == 0) return;

    ListNode *cell;

    cell = (*where);
    (*where) = (*where)->next;
    if (cell == first) {
	first = first->next;
	if (first == 0) last = 0;
    }
    delete cell;
    count--;
}

int List::FindByKey (ListIter &iter, void *key)
{
    void *element;

    for (PointToFirst(iter); (element = GetIteratorValue (iter)) != 0; 
                             PointToNext(iter)) {
	if (KeyCompare (key, element)) 
	    return 1;
    }

    return 0;
}

int List::KeyCompare (void *key, void *element)
{
    return (key == element);
}