Viewing contents of file '../idllib/contrib/fanning/coyotelist__define.pro'
;+
; NAME:
; COYOTELIST__DEFINE
;
; PURPOSE:
; The purpose of this program is to implement a list that
; is linked in both the forward and backward directions. There
; is no restriction as to what can be stored in a linked list
; node. The linked list is implemented as an object.
;-
PRO COYOTELIST::DELETE_ALL_NODES
; This method deletes all of the nodes.
WHILE Ptr_Valid(self.head) DO BEGIN
currentNode = *self.head
Ptr_Free, currentNode.previous
Ptr_Free, currentNode.item
self.head = currentNode.next
ENDWHILE
; Update the count.
self.count = 0
END
;------------------------------------------------------------------------
PRO COYOTELIST::ADD, item
; This method adds an item to the tail of the list.
; Be sure you have an item to add.
IF N_Elements(item) EQ 0 THEN BEGIN
ok = Dialog_Message('Must pass an ITEM to add to the list.')
RETURN
ENDIF
IF self.count EQ 0 THEN BEGIN
; Create a new node.
currentNode = Ptr_New({ COYOTELIST_NODE })
; Add the item to the node.
(*currentNode).item = Ptr_New(item)
; The head and tail point to current node.
self.head = currentNode
self.tail = currentNode
; Update the node count.
self.count = self.count + 1
ENDIF ELSE BEGIN
; Create a new node.
currentNode = Ptr_New({ COYOTELIST_NODE })
; Set the next field of the previous node.
(*self.tail).next = currentNode
; Add the item to the current node.
(*currentNode).item = Ptr_New(item)
; Set the previous field to point to previous node.
(*currentNode).previous = self.tail
; Update the tail field to point to current node.
self.tail = currentNode
; Update the node count.
self.count = self.count + 1
ENDELSE
END
;------------------------------------------------------------------------
FUNCTION COYOTELIST::GET_ITEM, index
; This method returns a pointer to the information
; stored in the list. Ask for the item by number or
; order in the list (list numbers start at 0).
; Gets last item by default.
IF N_Params() EQ 0 THEN index = self.count - 1
; Make sure there are items in the list.
IF self.count EQ 0 THEN BEGIN
ok = Dialog_Message('Nothing is currently stored in the list.')
RETURN, Ptr_New()
ENDIF
IF index GT (self.count - 1) OR index LT 0 THEN BEGIN
ok = Dialog_Message('Sorry. Requested node is not in list.')
RETURN, Ptr_New()
ENDIF
; Start at the head of the list.
currentNode = self.head
; Find the item asked for by traversing the list.
FOR j=0, index-1 DO currentNode = (*currentNode).next
; Return the pointer to the item.
RETURN, (*currentNode).item
END
;------------------------------------------------------------------------
FUNCTION COYOTELIST::GET_NODE, index
; This method returns a pointer to the asked-for node.
; Ask for the node by number or order in the list
; (node numbers start at 0).
; Gets last node by default.
IF N_Params() EQ 0 THEN index = self.count - 1
; Make sure there are items in the list.
IF self.count EQ 0 THEN BEGIN
ok = Dialog_Message('Nothing is currently stored in the list.')
RETURN, Ptr_New()
ENDIF
IF index GT (self.count - 1) OR index LT 0 THEN BEGIN
ok = Dialog_Message('Sorry. Requested node is not in list.')
RETURN, Ptr_New()
ENDIF
; Start at the head of the list.
currentNode = self.head
; Find the item asked for by traversing the list.
FOR j=0, index-1 DO currentNode = (*currentNode).next
; Return the pointer to the node.
RETURN, currentNode
END
;------------------------------------------------------------------------
FUNCTION COYOTELIST::GET_COUNT
; This method returns the number of items in the list.
RETURN, self.count
END
;------------------------------------------------------------------------
PRO COYOTELIST::HELP, Print=print
; This method performs a HELP command on the items
; in the linked list. If the PRINT keyword is set, the
; data items are printed instead.
; Are there nodes to work with?
IF NOT Ptr_Valid(self.head) THEN BEGIN
ok = Widget_Message('No nodes in Linked List.')
RETURN
ENDIF
; First node.
currentNode = *self.head
IF Keyword_Set(print) THEN Print, *currentNode.item ELSE $
Help, *currentNode.item
; The rest of the nodes. End of list indicated by null pointer.
WHILE currentNode.next NE Ptr_New() DO BEGIN
nextNode = *currentNode.next
IF Keyword_Set(print) THEN Print, *nextNode.item ELSE $
Help, *nextNode.item
currentNode = nextNode
ENDWHILE
END
;------------------------------------------------------------------------
PRO COYOTELIST::CLEANUP
; This method deletes all of the nodes and cleans up
; the objects pointers.
self->Delete_All_Nodes
Ptr_Free, self.head
Ptr_Free, self.tail
END
;------------------------------------------------------------------------
FUNCTION COYOTELIST::INIT, item
; Initialize the linked list. Add an item if required.
IF N_Params() EQ 0 THEN RETURN, 1
self->Add, item
RETURN, 1
END
;------------------------------------------------------------------------
PRO COYOTELIST__DEFINE
; The implementation of a COYOTELIST object.
struct = { COYOTELIST, $ ; The COYOTELIST object.
head:Ptr_New(), $ ; A pointer to the first node.
tail:Ptr_New(), $ ; A pointer to the last node.
count:0L $ ; The number of nodes in the list.
}
struct = { COYOTELIST_NODE, $ ; The COYOTELIST NODE structure.
previous:Ptr_New(), $ ; A pointer to the previous node.
item:Ptr_New(), $ ; A pointer to the data item.
next:Ptr_New() $ ; A pointer to the next node.
}
END
;------------------------------------------------------------------------