|
cgma
|
#include <DLList.hpp>
Public Member Functions | |
| DLList (int list_size) | |
| DLList (const DLList ©_from) | |
| virtual | ~DLList () |
| void | step () |
| void | step (int n) |
| void | back () |
| void | back (int n) |
| void | reset () |
| void | last () |
| void | clean_out () |
| void | shrink (int k) |
| CubitBoolean | is_at_beginning () const |
| CubitBoolean | is_at_end () const |
| int | get_index () |
| void | set_index (int new_index) |
| void | compress () |
| void | reverse () |
| DLList & | operator= (const DLList &) |
| virtual void | merge_unique (DLList &merge_list, int merge_list_unique=CUBIT_FALSE) |
| void | intersect (DLList &merge_list) |
| int | append_unique (void *new_item) |
| SetDynamicMemoryAllocation (memoryManager) int operator<(const DLList &list) const | |
| int | operator<= (const DLList &list) const |
| int | operator> (const DLList &list) const |
| int | operator>= (const DLList &list) const |
| int | operator== (const DLList &list) const |
| int | operator!= (const DLList &list) const |
Protected Member Functions | |
| void | insert_link (void *newBody) |
| void | insert_link_first (void *new_item) |
| void | append_link (void *newBody) |
| void * | nullify_link () |
| void * | cut_link () |
| void * | extract_link () |
| CubitBoolean | omit_link (void *) |
| void * | next_item (int n=1) const |
| void * | prev_item (int n=1) const |
| void * | get_item () const |
| void * | change_item_to (void *newBody) |
| void * | move_to_and_remove_item (void *item) |
| void * | get_item_and_step () |
| void * | step_and_get_item () |
| void * | get_item_and_back () |
| CubitBoolean | move_to_item (void *body) |
| CubitBoolean | move_to_nearby_item (void *body) |
| int | distance_to_nearby_item (void *body) |
| CubitBoolean | move_between_items (void *body1, void *body2) |
| int | where_is_item (void *item) const |
Protected Attributes | |
| void * | nullItem |
| int | index |
Static Private Member Functions | |
| static const char * | type () |
Static Private Attributes | |
| static MemoryManager | memoryManager |
Definition at line 38 of file DLList.hpp.
| DLList::DLList | ( | int | list_size | ) |
Definition at line 19 of file DLList.cpp.
: ArrayBasedContainer( increment ) { index = 0; nullItem = 0; }
| DLList::DLList | ( | const DLList & | copy_from | ) |
Definition at line 26 of file DLList.cpp.
: ArrayBasedContainer ( from ) { index = from.index; listIsSorted = CUBIT_FALSE; }
| DLList::~DLList | ( | ) | [virtual] |
Definition at line 32 of file DLList.cpp.
{
}
| void DLList::append_link | ( | void * | newBody | ) | [inline, protected] |
Reimplemented in SDLList.
Definition at line 323 of file DLList.hpp.
{
assert(new_item != NULL);
// see if the list must be lengthened
if ( itemCount == listLength )
lengthen_list();
listArray[itemCount++] = new_item;
}
| int DLList::append_unique | ( | void * | new_item | ) |
| void DLList::back | ( | ) | [inline] |
| void DLList::back | ( | int | n | ) | [inline] |
Definition at line 302 of file DLList.hpp.
{ step(-n); }
| void * DLList::change_item_to | ( | void * | newBody | ) | [protected] |
Reimplemented in SDLList.
Definition at line 503 of file DLList.cpp.
| void DLList::clean_out | ( | ) | [inline] |
Reimplemented from ArrayBasedContainer.
Definition at line 386 of file DLList.hpp.
| void DLList::compress | ( | ) | [virtual] |
Reimplemented from ArrayBasedContainer.
Definition at line 525 of file DLList.cpp.
| void * DLList::cut_link | ( | ) | [protected] |
Definition at line 124 of file DLList.cpp.
{
if ( !itemCount )
{
PRINT_WARNING("Attempted link removal from empty DLList\n");
return NULL;
}
// save the current value
void *temp = listArray[index];
// compress memory
for ( int i = index; i < itemCount-1; i++ )
{
listArray[i] = listArray[i+1];
}
itemCount--;
if ( index >= itemCount )
{
index = 0;
}
return temp;
}
| int DLList::distance_to_nearby_item | ( | void * | body | ) | [protected] |
Definition at line 308 of file DLList.cpp.
| void * DLList::extract_link | ( | ) | [protected] |
Reimplemented in SDLList.
Definition at line 163 of file DLList.cpp.
{
if ( !itemCount ) {
PRINT_WARNING("Attempted link removal from empty DLList\n");
return NULL;
}
// save the current value
void *temp = listArray[index];
// assign last node to the current index
listArray[index] = listArray[itemCount - 1];
// decrement itemCount
itemCount--;
if ( index == itemCount && index != 0) {
// The choices here are index at beginning or end.
// End seems to work better when 'extract' is being used
// with calls to 'move_to_item'.
index--;
}
return temp;
}
| int DLList::get_index | ( | ) |
| void * DLList::get_item | ( | ) | const [inline, protected] |
Definition at line 334 of file DLList.hpp.
| void * DLList::get_item_and_back | ( | ) | [protected] |
Definition at line 285 of file DLList.cpp.
| void * DLList::get_item_and_step | ( | ) | [inline, protected] |
Definition at line 346 of file DLList.hpp.
| void DLList::insert_link | ( | void * | newBody | ) | [protected] |
Definition at line 37 of file DLList.cpp.
{
assert(new_item != NULL);
// see if the list must be lengthened
if ( itemCount == listLength )
{
lengthen_list();
}
// set new index
if ( itemCount )
{
index++;
}
else
{
index = 0;
}
// the item must be put in the current index, all higher
// indexes must be bubbled up one spot
for ( int i = itemCount; i > index; i-- )
{
listArray[i] = listArray[i-1];
}
listArray[index] = new_item;
itemCount++;
}
| void DLList::insert_link_first | ( | void * | new_item | ) | [protected] |
Reimplemented in SDLList.
Definition at line 113 of file DLList.cpp.
{
// set index to -1 ... index will be set to 0 in insert_link
index = -1;
insert_link(new_item);
}
| void DLList::intersect | ( | DLList & | merge_list | ) |
| CubitBoolean DLList::is_at_beginning | ( | ) | const [inline] |
Definition at line 308 of file DLList.hpp.
{if (!index) return CUBIT_TRUE;
else return CUBIT_FALSE;}
| CubitBoolean DLList::is_at_end | ( | ) | const [inline] |
Definition at line 312 of file DLList.hpp.
{
if (itemCount == 0 || index == itemCount-1)
return CUBIT_TRUE;
else
return CUBIT_FALSE;
}
| void DLList::last | ( | ) | [inline] |
Definition at line 306 of file DLList.hpp.
| void DLList::merge_unique | ( | DLList & | merge_list, |
| int | merge_list_unique = CUBIT_FALSE |
||
| ) | [virtual] |
Reimplemented in SDLList.
Definition at line 71 of file DLList.cpp.
{
// MJP Note:
// This procedure could be much more efficient if sorted lists
// are used. However, I need this procedure at this time to merge
// DLLists that already exist. These were not created as sorted
// lists (SDLLists) and it would be painful to convert them to
// SDLLists. It would be a lot easier if one could simply sort
// a DLList based on the numeric values of its items.
// Save the current index of the merge_list
int current_index = merge_list.index;
int old_size = size();
int i, j, check_index;
void* new_item = NULL;
for (i = 0; i < merge_list.size(); i++)
{
// Get the item from the merge_list and insert it into "this"
// list if it doesn't already exist there.
new_item = merge_list.get_item_and_step();
check_index = merge_list_unique ? old_size : size();
for ( j = 0; j < check_index; j++ )
{
if ( listArray[j] == new_item )
{
check_index = -1;
break;
}
}
if ( check_index != -1 )
append_link(new_item);
}
// Restore the original index of the merge_list
merge_list.index = current_index;
}
| CubitBoolean DLList::move_between_items | ( | void * | body1, |
| void * | body2 | ||
| ) | [protected] |
Definition at line 436 of file DLList.cpp.
{
assert(item1 != NULL && item2 != NULL);
if ( !itemCount )
return CUBIT_FALSE;
for ( int i = 0; i < itemCount; i++ )
{
if ( listArray[i] == item1 )
{
//dance around looking for item2
if ( i+1 < itemCount ) {
if ( listArray[i+1] == item2 ) {
index = i+1;
return CUBIT_TRUE;
}
}
if ( i > 0 ) {
if ( listArray[i-1] == item2 ) {
index = i;
return CUBIT_TRUE;
}
}
if ( ( i+1 == itemCount && listArray[0] == item2 )
|| ( i == 0 && listArray[itemCount-1] == item2 ) )
{
index = 0;
return CUBIT_TRUE;
}
}
}
return CUBIT_FALSE;
}
| void * DLList::move_to_and_remove_item | ( | void * | item | ) | [protected] |
Definition at line 300 of file DLList.cpp.
{
if (move_to_item(item))
return cut_link();
else
return (void*) NULL;
}
| CubitBoolean DLList::move_to_item | ( | void * | body | ) | [protected] |
Definition at line 379 of file DLList.cpp.
{
int item_position = where_is_item( item );
if ( item_position >= 0 ) {
index = item_position;
return CUBIT_TRUE;
}
return CUBIT_FALSE;
}
| CubitBoolean DLList::move_to_nearby_item | ( | void * | body | ) | [protected] |
Definition at line 320 of file DLList.cpp.
{
// empty list
if (itemCount == 0)
return CUBIT_FALSE;
// Search current item first...
void **ptr_up = &(listArray[index]);
if (*ptr_up == item)
return CUBIT_TRUE;
int i_up, i_down;
i_up = i_down = index;
void **ptr_down = ptr_up;
while (1)
{
// check forward in the list
// increment
if ( ++i_up < itemCount )
ptr_up++;
else
{
i_up = 0;
ptr_up = listArray;
}
// check
if ( *ptr_up == item )
{
index = i_up;
return CUBIT_TRUE;
}
if ( i_up == i_down )
{
return CUBIT_FALSE;
}
// check backward in the list
// increment
if ( --i_down >= 0 )
ptr_down--;
else
{
i_down = itemCount-1;
ptr_down = &(listArray[i_down]);
}
// check
if ( *ptr_down == item )
{
index = i_down;
return CUBIT_TRUE;
}
if ( i_up == i_down )
{
return CUBIT_FALSE;
}
}
}
| void * DLList::next_item | ( | int | n = 1 | ) | const [inline, protected] |
Definition at line 364 of file DLList.hpp.
{
if ( !itemCount )
{
PRINT_WARNING("Attempted next of empty DLList\n");
return NULL;
}
else
{
// return the proper index
// beware of negative n leading to negative new_index
int new_index = index+n;
while (new_index < 0)
new_index += itemCount;
new_index = new_index%itemCount;
assert(listArray[new_index] != NULL);
return listArray[new_index];
}
}
| void * DLList::nullify_link | ( | ) | [protected] |
Definition at line 235 of file DLList.cpp.
| CubitBoolean DLList::omit_link | ( | void * | oldObjPtr | ) | [protected] |
Definition at line 195 of file DLList.cpp.
{
int scan_index;
int squeeze_index = 0;
CubitBoolean found = CUBIT_FALSE;
for(scan_index = 0; scan_index < itemCount; ++scan_index)
{
if(listArray[scan_index] == oldObjPtr)
{
found = CUBIT_TRUE;
if(index == scan_index) index = squeeze_index - 1;
}
else
{
if(scan_index != squeeze_index)
{
listArray[squeeze_index] = listArray[scan_index];
if(index == scan_index) index = squeeze_index;
}
++squeeze_index;
}
}
if(found)
{
itemCount = squeeze_index;
//+// If the first item was deleted and index pointed to it, make an
//+// adjustment here. If itemCount is zero, don't assign -1 again.
if (index < 0)
index = (itemCount) ? (itemCount - 1) : 0 ;
if (index >= itemCount)
index = (itemCount) ? (itemCount - 1) : 0 ;
}
return found;
}
| int DLList::operator!= | ( | const DLList & | list | ) | const |
Definition at line 595 of file DLList.cpp.
| int DLList::operator<= | ( | const DLList & | list | ) | const |
Definition at line 574 of file DLList.cpp.
{
return list >= *this;
}
Definition at line 516 of file DLList.cpp.
{
if (this != &from) {
ArrayBasedContainer::operator=(from);
index = from.index;
}
return *this;
}
| int DLList::operator== | ( | const DLList & | list | ) | const |
Definition at line 590 of file DLList.cpp.
| int DLList::operator> | ( | const DLList & | list | ) | const |
Definition at line 569 of file DLList.cpp.
| int DLList::operator>= | ( | const DLList & | list | ) | const |
Definition at line 579 of file DLList.cpp.
{
if( itemCount < list.itemCount ) return 0;
DLList temp_list = list;
for( int i = 0; i < itemCount; i++ )
if( temp_list.move_to_item( listArray[i] ) ) temp_list.extract_link();
return temp_list.itemCount == 0;
}
| void * DLList::prev_item | ( | int | n = 1 | ) | const [protected] |
Definition at line 249 of file DLList.cpp.
{
if ( !itemCount )
{
PRINT_WARNING("Attempted prev of empty DLList\n");
return NULL;
}
// return the proper index
// beware of negative n
int new_index = index - n;
while (new_index < 0)
new_index += itemCount;
// beware of negative n leading to new_index >itemCount
new_index = new_index%itemCount;
assert(listArray[new_index] != NULL);
return listArray[new_index];
}
| void DLList::reset | ( | ) | [inline] |
Definition at line 304 of file DLList.hpp.
{ index = 0; }
| void DLList::reverse | ( | ) |
| void DLList::set_index | ( | int | new_index | ) |
| void DLList::shrink | ( | int | k | ) |
Reimplemented from ArrayBasedContainer.
| void DLList::step | ( | ) | [inline] |
| void DLList::step | ( | int | n | ) | [inline] |
| void * DLList::step_and_get_item | ( | ) | [protected] |
Definition at line 270 of file DLList.cpp.
| static const char* DLList::type | ( | ) | [inline, static, private] |
Definition at line 274 of file DLList.hpp.
{ return "DLList"; }
| int DLList::where_is_item | ( | void * | item | ) | const [protected] |
Definition at line 389 of file DLList.cpp.
{
// test for null input item
assert(item != NULL);
if (itemCount == 0) return -1;
// loop through list searching for item ...
// if found set index and return true
// Search current item first...
void **ptr = &(listArray[index]);
if (*ptr == item) return index;
// Now, search from current index to end of array
int i;
for (i=index+1; i < itemCount; i++) {
ptr++;
if ( *ptr == item) {
// check if move_to_nearby would have been better
//if ( i - index > 1000 )
// PRINT_INFO(" Found, i = %d, index = %d, itemCount = %d.\n",
// i, index, itemCount);
return i;
}
}
// Now search from beginning of array to index...
ptr = listArray;
for (i = 0; i < index; i++) {
if (*ptr == item) {
// check if move_to_nearby would have been better
// if ( i + itemCount - index > 1000 )
// PRINT_INFO(" Found, i = %d, index = %d, itemCount = %d.\n",
// i, index, itemCount);
return i;
}
ptr++;
}
// item is not in array, return false
return -1;
}
int DLList::index [protected] |
Definition at line 267 of file DLList.hpp.
MemoryManager DLList::memoryManager [static, private] |
Reimplemented in SDLList.
Definition at line 277 of file DLList.hpp.
void* DLList::nullItem [protected] |
Definition at line 253 of file DLList.hpp.