multimap_incl.sa


Generated by gen_html_sa_files from ICSI. Contact gomes@icsi.berkeley.edu for details
 
---------------------------> Sather 1.1 source file <--------------------------
-- multimap_incl.sa: Multimap include partial class
-- Author: Benedict A. Gomes <gomes@samosa.ICSI.Berkeley.EDU>
-- Copyright (C) 1995, International Computer Science Institute
-- $Id: multimap_incl.sa,v 1.6 1996/06/01 21:36:30 gomes Exp $
--
-- COPYRIGHT NOTICE: This code is provided WITHOUT ANY WARRANTY
-- and is subject to the terms of the SATHER LIBRARY GENERAL PUBLIC
-- LICENSE contained in the file: Sather/Doc/License of the
-- Sather distribution. The license is also available from ICSI,
-- 1947 Center St., Suite 600, Berkeley CA 94704, USA.


class MULTIMAP{K,E}

class MULTIMAP{K,E} is include H_MULTIMAP{K,E}; end;

partial class RO_MULTIMAP_INCL{K,E}

partial class RO_MULTIMAP_INCL{K,E} is -- Partial class for multi-maps include COMPARE{E}; -- --------- CORE FEATURES (must define) --------- stub size: INT; -- The number of elements in this multimap stub n_inds: INT; -- Return the total number of indices stub elt!: E; -- Yield elements (unordered) stub ind!: K; -- Yield element indices (unordered) stub pair!: TUP{K,E}; -- Yield pairs of index,element stub target!(once k:K): E; -- Yield the targets of the index "k" stub n_targets(k:K): INT; -- Return the number of targets for index "k" -- ------ Access/Measurement -------------- targets(k: K): BAG{E} is res ::= #BAG{E}; loop res.insert(target!(k)) end; return res; end; inds: ARRAY{K} is -- Return an index array which is the same size as self and -- is set to the values of the indices sz: INT := n_inds; res: ARRAY{K} := #(sz); i: INT := 0; loop until!(i >= sz); res[i] := ind!; i := i + 1; end; return res; end; target!: E is loop yield elt! end; end; -- ------ Queries/Comparison -------------- has_ind(k: K): BOOL is return n_targets(k) > 0 end; -- Return true if the index "k" has at least one target in this -- multimap has_elt(e: E): BOOL is return has(e) end; has(e: E): BOOL is -- Return true if this multimap has the element "e" loop t ::= elt!; if elt_eq(t,e) then return true end; end; return false; end; equals(b: $RO_MULTIMAP{K,E}): BOOL is -- Returns true if all of "e"'s elements are equal to self's elts -- Ordering is an issue. Should be redefined to be more -- precise for particular descendants if n_inds /= b.n_inds then return false end; if size /= b.size then return false end; loop e ::= ind!; if n_targets(e) /= b.n_targets(e) then return false end; end; return true ; end; elt_if(test:ROUT{E}:BOOL,out res:E):BOOL is -- Return the first element that satisfies "test" in "res" -- Return true if a element was found, false otherwise loop r ::= elt!; if test.call(r) then res := r; return true; end; end; return false; end; ind_if(test:ROUT{E}:BOOL):K is -- Return the index of the leftmost element that satisfies `test', -- or void if there is none. -- Must be changed to use an out argument loop r::=ind!; loop e ::= target!(r); if test.call(e) then return r end end; end; return void end; -- ------ Cursor -------------------------- filter!(once f:ROUT{E}:BOOL): E pre ~void(self) is -- Yield all elements that satisfy the boolean predicate "f" loop e ::= target!; if f.call(e) then yield e end end end; filter_not!(once f:ROUT{E}:BOOL): E pre ~void(self) is -- Yield all elements that do not satisfy the boolean predicate "f" loop e ::= target!; if ~f.call(e) then yield e end end end; -- ------ Conversion ---------------------- str: STR is -- Prints out a string version of the array of the components -- that are under $STR, and their associated indices res ::= #FSTR("{"); loop p ::= pair!; res := res+",".separate!("["+ind_str(p.t1)+"]="+elt_str(p.t2)); end; res := res +"}"; return(res.str); end; str_of_elts: STR is -- Prints out a string version of the array of the components -- that are under $STR, and their associated indices res ::= #FSTR(""); loop res:=res+",".separate!(elt_str(elt!)); end; return(res.str); end; -- ------ Basic Operations ---------------- private ind_str(i: K): STR is typecase i when $STR then return i.str else return "Unprintable Index" end; end; private elt_str(e: E): STR is typecase e when $STR then return e.str else return "Unprintable Element" end; end; end;

partial class MULTIMAP_INCL{K,E}

partial class MULTIMAP_INCL{K,E} is -- Partial class for full fledged multi-maps include RO_MULTIMAP_INCL{K,E}; end;