elt_alg.sa


Generated by gen_html_sa_files from ICSI. Contact gomes@icsi.berkeley.edu for details
 
------------------------->  GNU Sather - sourcefile  <-------------------------
-- Copyright (C) 1994 by International Computer Science Institute            --
-- This file is part of the GNU Sather library. It is free software; you may --
-- redistribute  and/or modify it under the terms of the GNU Library General --
-- Public  License (LGPL)  as published  by the  Free  Software  Foundation; --
-- either version 2 of the license, or (at your option) any later version.   --
-- This  library  is distributed  in the  hope that it will  be  useful, but --
-- WITHOUT ANY WARRANTY without even the implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE. See Doc/LGPL for more details.       --
-- The license text is also available from:  Free Software Foundation, Inc., --
-- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA                     --
-------------->  Please email comments to <bug-sather@gnu.org>  <--------------


class ELT_ALG{ETP,CTP<$ELT{ETP}}

class ELT_ALG{ETP,CTP<$ELT{ETP}} is -- Some helper routines that may be used by classes that provide an -- elt! iterator. unique!(c:CTP):ETP is -- Yield the unique elements of 'c' already_seen:ARRAY{ETP} := #(5); num_seen:INT := 0; arr_size:INT := 5; loop e ::= c.elt!; is_seen:BOOL := false; loop i ::= num_seen.times!; if ELT_EQ{ETP}::elt_eq(already_seen[i],e) then is_seen := true end; end; if ~is_seen then if arr_size <= num_seen then arr_size := 2*arr_size; already_seen := already_seen.resize(arr_size); end; already_seen[num_seen] := e; num_seen := num_seen+1; yield e end; end; end; filter!(c:CTP, once f:ROUT{ETP}:BOOL): ETP pre ~void(c) is -- Yield all elements that satisfy the boolean predicate "f" loop e ::= c.elt!; if f.call(e) then yield e end end end; filter_not!(c:CTP, once f:ROUT{ETP}:BOOL): ETP pre ~void(c) is -- Yield all elements that do not satisfy the boolean predicate "f" loop e ::= c.elt!; if ~f.call(e) then yield e end end end; elt_if(c:CTP,test:ROUT{ETP}:BOOL,out res:ETP):BOOL is -- Return true if the container has an element that satisfies the -- predicate 'test'. The out argument 'res' is set to the -- return value loop r ::= c.elt!; if test.call(r) then res:=r; return true; end; end; return false; end; count_if(c:CTP, test:ROUT{ETP}:BOOL):INT is -- The number of elements which satisfy `test'. r::=0; loop if test.call(c.elt!) then r:=r+1 end end; return r end; some(c:CTP, test:ROUT{ETP}:BOOL):BOOL is -- True if some element of self satisfies `test'. -- Self may be void. loop if test.call(c.elt!) then return true end end; return false end; every(c:CTP,test:ROUT{ETP}:BOOL):BOOL is -- True if every element of self satisfies `test'. -- Self may be void. loop if ~test.call(c.elt!) then return false end end; return true end; notany(c:CTP,test:ROUT{ETP}:BOOL):BOOL is -- True if none of the elements of self satisfies `test'. -- Self may be void. loop if test.call(c.elt!) then return false end end; return true end; notevery(c:CTP, test:ROUT{ETP}:BOOL):BOOL is -- True if not every element of self satisfies `test'. -- Self may be void. loop if ~test.call(c.elt!) then return true end end; return false end; str(arr:$ELT{ETP}):STR is -- Print out a string version of the array res ::= #FSTR("{"); i ::= 0; loop e ::= arr.elt!; if i > 0 then res := res+","+elt_str(e,i); else res := res + elt_str(e,i); end; i := i + 1; end; res := res+"}"; return(res.str); end; elt_str(e: $OB,i: INT): STR is typecase e when $STR then return e.str else return "Unprintable:"+i.str end; end; end;

class ELT_ALG{ETP}

class ELT_ALG{ETP} is include ELT_ALG{ETP,$ELT{ETP}}; end;