reference/ocr-simple/list.cc
author viric@llimona
Thu, 18 May 2006 23:12:51 +0200
changeset 0 6b8091ca909a
permissions -rw-r--r--
Init from working directory of svn repository.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     1
// list.cc 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     2
//
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     3
//     	Routines to manage a singly-linked list of "things".
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     4
//
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     5
// 	A "ListElement" is allocated for each item to be put on the
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     6
//	list; it is de-allocated when the item is removed. This means
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     7
//      we don't need to keep a "next" pointer in every object we
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     8
//      want to put on a list.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     9
// 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    10
//     	NOTE: Mutual exclusion must be provided by the caller.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    11
//  	If you want a synchronized list, you must use the routines 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    12
//	in synchlist.cc.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    13
//
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    14
// Copyright (c) 1992-1993 The Regents of the University of California.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    15
// All rights reserved.  See copyright.h for copyright notice and limitation 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    16
// of liability and disclaimer of warranty provisions.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    17
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    18
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    19
#include "list.h"
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    20
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    21
//----------------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    22
// ListElement::ListElement
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    23
// 	Initialize a list element, so it can be added somewhere on a list.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    24
//
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    25
//	"itemPtr" is the item to be put on the list.  It can be a pointer
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    26
//		to anything.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    27
//	"sortKey" is the priority of the item, if any.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    28
//----------------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    29
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    30
ListElement::ListElement(void *itemPtr, int sortKey)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    31
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    32
     item = itemPtr;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    33
     key = sortKey;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    34
     next = NULL;	// assume we'll put it at the end of the list 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    35
     previous = NULL;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    36
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    37
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    38
//----------------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    39
// List::List
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    40
//	Initialize a list, empty to start with.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    41
//	Elements can now be added to the list.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    42
//----------------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    43
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    44
List::List()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    45
{ 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    46
    first = last = NULL;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    47
    length = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    48
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    49
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    50
//----------------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    51
// List::~List
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    52
//	Prepare a list for deallocation.  If the list still contains any 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    53
//	ListElements, de-allocate them.  However, note that we do *not*
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    54
//	de-allocate the "items" on the list -- this module allocates
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    55
//	and de-allocates the ListElements to keep track of each item,
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    56
//	but a given item may be on multiple lists, so we can't
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    57
//	de-allocate them here.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    58
//----------------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    59
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    60
List::~List()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    61
{ 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    62
    while (Remove() != NULL)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    63
	;	 // delete all the list elements
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    64
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    65
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    66
//----------------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    67
// List::Append
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    68
//      Append an "item" to the end of the list.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    69
//      
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    70
//	Allocate a ListElement to keep track of the item.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    71
//      If the list is empty, then this will be the only element.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    72
//	Otherwise, put it at the end.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    73
//
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    74
//	"item" is the thing to put on the list, it can be a pointer to 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    75
//		anything.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    76
//----------------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    77
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    78
void
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    79
List::Append(void *item)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    80
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    81
    ListElement *element = new ListElement(item, 0);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    82
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    83
    if (IsEmpty()) {		// list is empty
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    84
	first = element;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    85
	last = element;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    86
    } else {			// else put it after last
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    87
	last->next = element;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    88
	element->previous = last;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    89
	last = element;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    90
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    91
    length++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    92
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    93
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    94
//----------------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    95
// List::Prepend
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    96
//      Put an "item" on the front of the list.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    97
//      
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    98
//	Allocate a ListElement to keep track of the item.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    99
//      If the list is empty, then this will be the only element.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   100
//	Otherwise, put it at the beginning.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   101
//
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   102
//	"item" is the thing to put on the list, it can be a pointer to 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   103
//		anything.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   104
//----------------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   105
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   106
void
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   107
List::Prepend(void *item)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   108
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   109
    ListElement *element = new ListElement(item, 0);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   110
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   111
    if (IsEmpty()) {		// list is empty
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   112
	first = element;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   113
	last = element;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   114
    } else {			// else put it before first
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   115
	element->next = first;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   116
	first->previous = element;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   117
	first = element;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   118
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   119
    length++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   120
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   121
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   122
//----------------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   123
// List::Remove
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   124
//      Remove the first "item" from the front of the list.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   125
// 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   126
// Returns:
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   127
//	Pointer to removed item, NULL if nothing on the list.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   128
//----------------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   129
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   130
void *
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   131
List::Remove()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   132
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   133
    return SortedRemove(NULL);  // Same as SortedRemove, but ignore the key
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   134
    length--;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   135
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   136
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   137
//----------------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   138
// List::Mapcar
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   139
//	Apply a function to each item on the list, by walking through  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   140
//	the list, one element at a time.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   141
//
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   142
//	Unlike LISP, this mapcar does not return anything!
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   143
//
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   144
//	"func" is the procedure to apply to each element of the list.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   145
//----------------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   146
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   147
void
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   148
List::Mapcar(VoidFunctionPtr func)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   149
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   150
    for (ListElement *ptr = first; ptr != NULL; ptr = ptr->next) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   151
       (*func)((int)ptr->item);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   152
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   153
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   154
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   155
//----------------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   156
// List::IsEmpty
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   157
//      Returns TRUE if the list is empty (has no items).
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   158
//----------------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   159
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   160
bool
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   161
List::IsEmpty() 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   162
{ 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   163
    if (first == NULL)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   164
        return TRUE;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   165
    else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   166
	return FALSE; 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   167
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   168
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   169
//----------------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   170
// List::SortedInsert
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   171
//      Insert an "item" into a list, so that the list elements are
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   172
//	sorted in increasing order by "sortKey".
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   173
//      
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   174
//	Allocate a ListElement to keep track of the item.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   175
//      If the list is empty, then this will be the only element.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   176
//	Otherwise, walk through the list, one element at a time,
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   177
//	to find where the new item should be placed.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   178
//
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   179
//	"item" is the thing to put on the list, it can be a pointer to 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   180
//		anything.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   181
//	"sortKey" is the priority of the item.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   182
//----------------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   183
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   184
void
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   185
List::SortedInsert(void *item, int sortKey)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   186
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   187
    ListElement *element = new ListElement(item, sortKey);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   188
    ListElement *ptr;		// keep track
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   189
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   190
    if (IsEmpty()) {	// if list is empty, put
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   191
        first = element;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   192
        last = element;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   193
    } else if (sortKey < first->key) {	
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   194
		// item goes on front of list
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   195
	element->next = first;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   196
	first->previous = element;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   197
	first = element;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   198
    } else {		// look for first elt in list bigger than item
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   199
        for (ptr = first; ptr->next != NULL; ptr = ptr->next) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   200
            if (sortKey < ptr->next->key) {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   201
		element->next = ptr->next;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   202
		element->previous = ptr;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   203
		ptr->next->previous = element;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   204
	        ptr->next = element;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   205
		return;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   206
	    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   207
	}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   208
	last->next = element;		// item goes at end of list
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   209
	element->previous = last;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   210
	last = element;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   211
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   212
    length++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   213
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   214
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   215
//----------------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   216
// List::SortedRemove
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   217
//      Remove the first "item" from the front of a sorted list.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   218
// 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   219
// Returns:
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   220
//	Pointer to removed item, NULL if nothing on the list.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   221
//	Sets *keyPtr to the priority value of the removed item
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   222
//	(this is needed by interrupt.cc, for instance).
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   223
//
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   224
//	"keyPtr" is a pointer to the location in which to store the 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   225
//  priority of the removed item.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   226
//----------------------------------------------------------------------
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   227
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   228
void *
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   229
List::SortedRemove(int *keyPtr)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   230
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   231
    ListElement *element = first;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   232
    void *thing;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   233
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   234
    if (IsEmpty()) 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   235
	return NULL;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   236
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   237
    thing = first->item;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   238
    if (first == last) {	// list had one item, now has none 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   239
        first = NULL;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   240
	last = NULL;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   241
    } else {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   242
        first = element->next;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   243
	if (first != NULL)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   244
	  first->previous = NULL;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   245
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   246
    if (keyPtr != NULL)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   247
        *keyPtr = element->key;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   248
    delete element;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   249
    length--;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   250
    return thing;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   251
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   252
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   253
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   254
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   255
void List::insertAfter(ListElement * listEl, void *item)   
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   256
 // insert a new item after this one
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   257
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   258
    ListElement *newElement = new ListElement(item, 0);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   259
    newElement->next = listEl->next;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   260
    newElement->previous = listEl;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   261
    listEl->next = newElement;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   262
    if (last == listEl)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   263
      last = newElement;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   264
    length++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   265
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   266
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   267
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   268
void List::insertBefore(ListElement * listEl, void *item)   
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   269
 // insert a new item before this one
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   270
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   271
    ListElement *newElement = new ListElement(item, 0);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   272
    newElement->next = listEl;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   273
    newElement->previous = listEl->previous;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   274
    listEl->previous = newElement;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   275
    if (first == listEl)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   276
      first = newElement;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   277
    length++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   278
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   279
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   280
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   281
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   282
void List::removeAt(ListElement * listEl)   
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   283
     // removes listEl from the list. Do not delete it from memory
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   284
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   285
    if(first != listEl)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   286
      (listEl->previous)->next = listEl->next;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   287
    else 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   288
      first = listEl->next;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   289
    if(last != listEl)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   290
      (listEl->next)->previous = listEl->previous;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   291
    else 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   292
      last = listEl->previous;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   293
//    delete listEl;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   294
    length --;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   295
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   296
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   297
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   298
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   299
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   300
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   301
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   302
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   303
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   304
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   305
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   306
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   307
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   308
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   309
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   310
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   311
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   312
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   313
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   314