|
Tesseract
3.02
|
#include <elst.h>
Public Member Functions | |
| ELIST () | |
| void | internal_clear (void(*zapper)(ELIST_LINK *)) |
| bool | empty () const |
| bool | singleton () const |
| void | shallow_copy (ELIST *from_list) |
| void | internal_deep_copy (ELIST_LINK *(*copier)(ELIST_LINK *), const ELIST *list) |
| void | assign_to_sublist (ELIST_ITERATOR *start_it, ELIST_ITERATOR *end_it) |
| inT32 | length () const |
| void | sort (int comparator(const void *, const void *)) |
| ELIST_LINK * | add_sorted_and_find (int comparator(const void *, const void *), bool unique, ELIST_LINK *new_link) |
| bool | add_sorted (int comparator(const void *, const void *), bool unique, ELIST_LINK *new_link) |
Friends | |
| class | ELIST_ITERATOR |
| bool ELIST::add_sorted | ( | int | comparatorconst void *, const void *, |
| bool | unique, | ||
| ELIST_LINK * | new_link | ||
| ) | [inline] |
Definition at line 175 of file elst.h.
{
return (add_sorted_and_find(comparator, unique, new_link) == new_link);
}
| ELIST_LINK * ELIST::add_sorted_and_find | ( | int | comparatorconst void *, const void *, |
| bool | unique, | ||
| ELIST_LINK * | new_link | ||
| ) |
Definition at line 173 of file elst.cpp.
{
// Check for adding at the end.
if (last == NULL || comparator(&last, &new_link) < 0) {
if (last == NULL) {
new_link->next = new_link;
} else {
new_link->next = last->next;
last->next = new_link;
}
last = new_link;
} else {
// Need to use an iterator.
ELIST_ITERATOR it(this);
for (it.mark_cycle_pt(); !it.cycled_list(); it.forward()) {
ELIST_LINK* link = it.data();
int compare = comparator(&link, &new_link);
if (compare > 0) {
break;
} else if (unique && compare == 0) {
return link;
}
}
if (it.cycled_list())
it.add_to_end(new_link);
else
it.add_before_then_move(new_link);
}
return new_link;
}
| void ELIST::assign_to_sublist | ( | ELIST_ITERATOR * | start_it, |
| ELIST_ITERATOR * | end_it | ||
| ) |
Definition at line 78 of file elst.cpp.
{ //from list end
const ERRCODE LIST_NOT_EMPTY =
"Destination list must be empty before extracting a sublist";
#ifndef NDEBUG
if (!this)
NULL_OBJECT.error ("ELIST::assign_to_sublist", ABORT, NULL);
#endif
if (!empty ())
LIST_NOT_EMPTY.error ("ELIST.assign_to_sublist", ABORT, NULL);
last = start_it->extract_sublist (end_it);
}
| bool ELIST::empty | ( | ) | const [inline] |
| void ELIST::internal_clear | ( | void(*)(ELIST_LINK *) | zapper | ) |
Definition at line 42 of file elst.cpp.
{
//ptr to zapper functn
ELIST_LINK *ptr;
ELIST_LINK *next;
#ifndef NDEBUG
if (!this)
NULL_OBJECT.error ("ELIST::internal_clear", ABORT, NULL);
#endif
if (!empty ()) {
ptr = last->next; //set to first
last->next = NULL; //break circle
last = NULL; //set list empty
while (ptr) {
next = ptr->next;
zapper(ptr);
ptr = next;
}
}
}
| void ELIST::internal_deep_copy | ( | ELIST_LINK *(*)(ELIST_LINK *) | copier, |
| const ELIST * | list | ||
| ) |
| inT32 ELIST::length | ( | ) | const |
Definition at line 102 of file elst.cpp.
{ // count elements
ELIST_ITERATOR it(const_cast<ELIST*>(this));
inT32 count = 0;
#ifndef NDEBUG
if (!this)
NULL_OBJECT.error ("ELIST::length", ABORT, NULL);
#endif
for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ())
count++;
return count;
}
| void ELIST::shallow_copy | ( | ELIST * | from_list | ) | [inline] |
| bool ELIST::singleton | ( | ) | const [inline] |
| void ELIST::sort | ( | int | comparatorconst void *, const void * | ) |
Definition at line 126 of file elst.cpp.
{
ELIST_ITERATOR it(this);
inT32 count;
ELIST_LINK **base; //ptr array to sort
ELIST_LINK **current;
inT32 i;
#ifndef NDEBUG
if (!this)
NULL_OBJECT.error ("ELIST::sort", ABORT, NULL);
#endif
/* Allocate an array of pointers, one per list element */
count = length ();
base = (ELIST_LINK **) malloc (count * sizeof (ELIST_LINK *));
/* Extract all elements, putting the pointers in the array */
current = base;
for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) {
*current = it.extract ();
current++;
}
/* Sort the pointer array */
qsort ((char *) base, count, sizeof (*base), comparator);
/* Rebuild the list from the sorted pointers */
current = base;
for (i = 0; i < count; i++) {
it.add_to_end (*current);
current++;
}
free(base);
}
friend class ELIST_ITERATOR [friend] |