;+
; Function: csvector
;
;
; Purpose: This procedure implements the create,add, and read
; methods for a traditional computer science
; data structure: the vector.The vector
; list of elements of any type and of any length.
;
; Advantages over array:
; 1. store heterogenous elements of any type in a list.
; 2. Lists can grow as large as memory and you don't
; need to know how big it will be in advance
; 3. You don't need to worry about how the data is stored
;
; Disadvantages over array:
; 1. You can't directly apply operations to the data
; structure
; 2. You are forced to use abstraction
;
;
; Inputs: arg1:the meaning of the argument varies with syntax
; arg2:the meaning of the argument varies with syntax
;
; Keywords: read(optional): set this if you want
; to read an element
; length(optional): set this if you want
; to read the length
; free(optional): set this if you want to free the
; vector's memory without
; creating a leak, it will return
; the number of elements free'd
;
; Outputs: a vector, the internal representation is
; abstracted, use the methods to access this data structure
;
; Syntax(each method is followed by examples):
;
; create:
; v = csvector(some_element)
; v = csvector(1)
; v = csvector([1,2])
; v = csvector({a:1,b:2})
; add:
; vector = csvector(some_element,vector)
; v = csvector(1,v)
; v = csvector('a',v)
; v = csvector([1,2],v)
; read:
; element = csvector(element_index,vector,/read)
; e = csvector(0,v,/read) ;first element
; e = csvector(csvector(v,/L)-1,v,/r) ;last element
; length:
; length = csvector(vector,/length)
; l = csvector(v,/l)
; l = csvector(v,/length)
; free:
; num = csvector(vector,/free)
; temp = csvector(v,/free)
;
;
;
; NOTES: in the event of overflow during add the vector.a
; component will double in size
;
; Add/Create stores a copy of the element not the element itself
;
; If you want to do manual lengths and reads you can look
; at the code, but I would recommend against cause you are
; violating abstraction which means the internal representation
; could change and invalidate your code.
;
; This might be worth writing in O.O. idl as well
;
; To get type flexibility it uses a pointer for every object
; Thus if you aren't careful this function will eat your
; system memory for breakfast. Use heap_gc to clean up if you
; are running out of memory.
;
;
;-
function csvector,arg1,arg2,read=read,length=length,free=free
if keyword_set(length) then begin ;length
if ~keyword_set(arg1) then begin
message,'Illegal syntax(arg1 must be set)'
endif
if keyword_set(arg2) then begin
message,'Illegal syntax(arg2 and length are set)'
endif
if keyword_set(read) then begin
message,'Illegal syntax(length and read are set)'
endif
if keyword_set(free) then begin
message,'Illegal syntax(length and free are set)'
endif
return, arg1.l
endif else if keyword_set(free) then begin ;free
if ~keyword_set(arg1) then begin
message,'Illegal syntax(arg1 must be set)'
endif
if keyword_set(arg2) then begin
message,'Illegal syntax(arg2 and free are set)'
endif
if keyword_set(read) then begin
message,'Illegal syntax(free and read are set)'
endif
ptr_free,arg1.d
return,arg1.l
endif else if ~keyword_set(arg2) then begin ;create
if keyword_set(read) then begin
message,'Illegal syntax(read is set)'
endif
data = ptr_new(arg1)
return, {d:[data],l:1L}
endif else if keyword_set(read) then begin ;read
;check type of arg1=int
;check arg1 < arg2.l
return,*(arg2.d[arg1])
endif else begin ;add
data = ptr_new(arg1)
if arg2.l eq n_elements(arg2.d) then begin
out = {d:replicate(data,arg2.l*2L),l:arg2.l}
out.d[0:arg2.l-1L] = arg2.d[0L:arg2.l-1L]
endif else begin
out = arg2
endelse
out.d[arg2.l] = data
out.l++
return,out
endelse
end