User:NevilleDNZ/link list template: Difference between revisions

m
remove ##s
(Sandbox source for syntax highlighting.)
 
m (remove ##s)
 
Line 23:
 
MODE CLASSLISTDATA = STRUCT(
PROC (REF LISTDATA #self#)RETLIST ##new,
PROC (REF LISTDATA #self#, ITERDATA #iter data#)RETLIST ##init,
PROC (REF LISTDATA #self#, REFDATA #pos#)REF LINKDATA get link,
PROC (REF LISTDATA #self#, REFDATA #pos#, DATA #data#)DATA ##set item,
PROC (REF LISTDATA #self#, SLICE #slice#)REF LISTDATA ##set slice,
PROC (REF LISTDATA #self#, REFDATA #pos#)REF DATA ##get item,
PROC (REF LISTDATA #self#, SLICE #slice#)LISTDATA ##get slice,
PROC (REF LISTDATA #self#, SLICE #slice#)LISTDATA ##gen slice,
PROC (REF LISTDATA #self#, REFDATA #pos#)VOID ##del item,
PROC (REF LISTDATA #self#, SLICE #in slice#)VOID ##del slice,
PROC (ITERDATA #iter#, YIELDDATA #yield#)VOID ##gen data, # merge with iter? #
PROC (ITERDATA #iter#, YIELDDATA #yield#)VOID ##rgen data, # merge with reverse? #
PROC (LISTDATA #list#, YIELDLINKDATA #yield#)VOID ##gen link,
PROC (LISTDATA #list#, YIELDLINKDATA #yield#)VOID ##rgen link,
PROC (REF LISTDATA #iter#, YIELDDATA #yield#)VOID ##iter,
PROC (REF LISTDATA #self#, YIELDDATA #yield#)VOID ##reversed,
PROC (REF LISTDATA #self#)RETLIST sort,
PROC (REF LISTDATA #self#)RETLIST reverse,
PROC (REF LISTDATA #self#)STRING ##repr,
PROC (REF LISTDATA #self#, LISTDATA #other#)INT ##cmp,
PROC (REF LISTDATA #self#, LISTDATA #other#)BOOL ##lt,
PROC (REF LISTDATA #self#, LISTDATA #other#)BOOL ##le,
PROC (REF LISTDATA #self#, LISTDATA #other#)BOOL ##eq,
PROC (REF LISTDATA #self#, LISTDATA #other#)BOOL ##ne,
PROC (REF LISTDATA #self#, LISTDATA #other#)BOOL ##ge,
PROC (REF LISTDATA #self#, LISTDATA #other#)BOOL ##gt,
PROC (REF LISTDATA #self#)INT ##len,
PROC (REF LISTDATA #self#, DATA #data#)INT count,
PROC (REF LISTDATA #self#, DATA #needle#)BOOL ##contains,
CO
PROC (REF LISTDATA #self#, DATA #data#)INT index,
Line 60:
PROC (REF LISTDATA #self#, REFDATA #pos#, DATA #data#)RETLIST insert,
CO PROC (REF LISTDATA #self#, ITERDATA #other#)RETLIST extend, CO
PROC (REF LISTDATA #self#, LISTDATA #list#)RETLIST ##add,
PROC (REF LISTDATA #self#, DATA #data#)RETLIST append,
PROC (REF LISTDATA #self#, LISTDATA #list#)RETLIST ##plusab,
PROC (REF LISTDATA #self#, INT #n#)RETLIST ##timesab,
PROC (REF LISTDATA #self#, INT #n#)RETLIST ## times,
PROC (REF LISTDATA #self#, INT #n#)RETLIST ##rtimes,
PROC (REF LISTDATA #self#)DATA pop,
PROC (REF LISTDATA #self#, DATA #data#)RETLIST minusab
Line 71:
 
CLASSLISTDATA class list data = (
# PROC ##new = # (REF LISTDATA self)RETLIST: SKIP, # ToDo #
 
# PROC ##init = # (REF LISTDATA self, ITERDATA iter data)RETLIST: (
landing OF self := HEAP LINKDATA; # In C this could be part of the STRUCT #
next OF landing OF self := prev OF landing OF self := landing OF self;
Line 130:
ESAC,
 
# PROC ##set item = # (REF LISTDATA self, REFDATA pos, DATA data)DATA: (
REF LINKDATA here := (get link OF class list data)(self, pos);
IF here IS landing OF self THEN raise index error(("Attempt to set landing.")) FI;
Line 136:
),
 
# PROC ##set slice = # (REF LISTDATA self, SLICE slice)REF LISTDATA: SKIP, # ToDo #
 
# PROC ##get item = # (REF LISTDATA self, REFDATA pos)REF DATA: (
REF LINKDATA here := (get link OF class list data)(self, pos);
IF here IS landing OF self THEN raise index error(("Attempt to get landing.")) FI;
Line 144:
),
 
# PROC ##get slice = # (REF LISTDATA self, SLICE slice)LISTDATA: SKIP, # ToDo #
# PROC ##gen slice = # (REF LISTDATA self, SLICE slice)LISTDATA: SKIP, # ToDo #
 
# PROC ##del item = # (REF LISTDATA self, REFDATA pos)VOID: (
REF LINKDATA here := (get link OF class list data)(self, pos);
IF here IS landing OF self THEN raise index error(("Attempt to delete landing.")) FI;
Line 156:
),
 
# PROC ##del slice = # (REF LISTDATA self, SLICE in slice)VOID: (
STRUCT(INT lwb, upb, by) slice = (
(lwb OF in slice|(INT i):i, (VOID):lwb OF self),
Line 171:
),
 
# PROC ##gen data = # (ITERDATA iter, YIELDDATA yield)VOID:
CASE iter IN
([]DATA array data): (
Line 193:
ESAC,
 
# PROC ##rgen data = # (ITERDATA iter, YIELDDATA yield)VOID:
CASE iter IN
([]DATA array data): (
Line 215:
ESAC,
 
# PROC ##gen link = # (LISTDATA list, YIELDLINKDATA yield)VOID: (
REF LINKDATA link := landing OF list;
WHILE
Line 224:
),
 
# PROC ##rgen link = # (LISTDATA list, YIELDLINKDATA yield)VOID: (
REF LINKDATA link := landing OF list;
WHILE
Line 233:
),
 
# PROC ##iter = # (REF LISTDATA iter, YIELDDATA yield)VOID:
# FOR LINKDATA link IN # (gen data OF class list data)(iter, # ) DO ( #
## (DATA data)VOID: (
Line 240:
# OD # ),
 
# PROC ##reversed = # (REF LISTDATA self, YIELDDATA yield)VOID:
# FOR LINKDATA link IN # (rgen data OF class list data)(self, # ) DO ( #
## (DATA data)VOID: (
Line 263:
),
 
# PROC ##repr = # (REF LISTDATA self)STRING: (
FILE f; STRING buf; associate(f, buf);
putf(f,$"("$);
Line 284:
 
# Review: this could be generalisd to handle iterators #
# PROC ##cmp = # (REF LISTDATA self, LISTDATA other)INT: (
LINKDATA link := landing OF other;
# FOR DATA data IN # (gen data OF class list data)(self, # ) DO ( #
Line 300:
),
 
# PROC ##lt = # (REF LISTDATA self, LISTDATA other)BOOL:
(cmp OF class list data )(self, other) <= 0,
 
# PROC ##le = # (REF LISTDATA self, LISTDATA other)BOOL:
(cmp OF class list data )(self, other) < 0,
 
# PROC ##eq = # (REF LISTDATA self, LISTDATA other)BOOL:
IF lwb OF self /= lwb OF other OR lwb OF self /= lwb OF other THEN
FALSE
Line 313:
FI,
 
# PROC ##ne = # (REF LISTDATA self, LISTDATA other)BOOL:
NOT (eq OF class list data)(self, other),
 
# PROC ##ge = # (REF LISTDATA self, LISTDATA other)BOOL:
(cmp OF class list data )(self, other) >= 0,
 
# PROC ##gt = # (REF LISTDATA self, LISTDATA other)BOOL:
(cmp OF class list data )(self, other) > 0,
 
# PROC ##len = # (REF LISTDATA self)INT: upb OF self - lwb OF self + 1,
 
# PROC count = # (REF LISTDATA self, DATA needle)INT: (
Line 334:
),
 
# PROC ##contains = # (REF LISTDATA self, DATA needle)BOOL:
CASE (find OF class list data)(self, needle) IN (INT): TRUE OUT FALSE ESAC,
 
Line 416:
END CO
 
# PROC ##add = # (REF LISTDATA self, LISTDATA list)RETLIST: (
REF LISTDATA out = INIT HEAP LISTDATA;
(plusab OF class list data)(out, self);
Line 425:
(insert OF class list data)(self, landing OF self, data),
 
# PROC ##plusab = # (REF LISTDATA self, LISTDATA list)RETLIST: (
# warning: x += x currently fails #
# FOR DATA data IN # (iter OF class list data)(LOC LISTDATA := list, # ) DO ( #
Line 434:
),
 
# PROC ##timesab = # (REF LISTDATA self, INT n)RETLIST: (
TO n DO # fix: this doubles list length #
(plusab OF class list data)(self, self) # !!! #
Line 441:
),
 
# PROC ## times = # (REF LISTDATA self, INT n)RETLIST: SKIP, # * ToDo #
# PROC ##rtimes = # (REF LISTDATA self, INT n)RETLIST: SKIP, # b * a ToDo #
 
# PROC pop = # (REF LISTDATA self)DATA: (