MACHINE      Rename_seq_obj(VALUE,maxobj,maxmem)

CONSTRAINTS  maxobj>0

SEES         Rename_seq_ctx, Bool_TYPE

VARIABLES

  Rename_seqtok, Rename_seqstruct, Rename_seqmem

INVARIANT

  Rename_seqtok <: Rename_SEQOBJ &
  Rename_seqstruct: Rename_seqtok --> seq(VALUE) &
  Rename_seqmem = SIGMA tt.(tt : Rename_seqtok| size(Rename_seqstruct(tt))) &
  Rename_seqmem:  NAT &  
  Rename_seqmem <= maxmem

INITIALISATION

  Rename_seqtok, Rename_seqstruct, Rename_seqmem := {},{}, 0

OPERATIONS

/******************  General query functions *********************/

  bb <-- Rename_MEM_FUL_SEQ_OBJ =
  BEGIN
    bb:=bool(Rename_seqmem=maxmem)
  END;

  bb <-- Rename_OBJ_FUL_SEQ_OBJ =
  BEGIN
    bb:=bool(card(Rename_seqtok) =  maxobj)
  END;

  bb <-- Rename_XST_SEQ_OBJ(pp) =
  PRE
    pp: Rename_SEQOBJ
  THEN
    bb:=bool(pp:Rename_seqtok)
  END;


/******************  Creating and deleting sequences **************/


  Rename_INI_SEQ_OBJ =
  BEGIN
    Rename_seqtok, Rename_seqstruct, Rename_seqmem := {},{}, 0
  END;

  pp <-- Rename_ANY_SEQ_OBJ =
  BEGIN
    pp :: Rename_SEQOBJ
  END;


  bb,pp <-- Rename_CRE_SEQ_OBJ =
  IF card(Rename_seqtok) < maxobj THEN
      ANY qq WHERE
        qq: Rename_SEQOBJ - Rename_seqtok
      THEN
        Rename_seqstruct(qq):=<> ||
        Rename_seqtok := Rename_seqtok \/ {qq} ||
        pp:=qq ||
        bb := TRUE
      END
  ELSE
      bb:= FALSE || pp :: Rename_SEQOBJ
  END;

  Rename_KIL_SEQ_OBJ(pp) =
  PRE
    pp: Rename_seqtok &
    Rename_seqmem >= size(Rename_seqstruct(pp))
  THEN
    Rename_seqstruct :=  {pp} <<| Rename_seqstruct ||
    Rename_seqtok := Rename_seqtok - {pp} ||
    Rename_seqmem := Rename_seqmem - size(Rename_seqstruct(pp))
  END;


/******************  Query functions for individual sequences **********/


  vv <-- Rename_VAL_SEQ_OBJ(pp,ii) =
  PRE
    pp:Rename_seqtok &
    ii:dom(Rename_seqstruct(pp))
  THEN 
    vv:=Rename_seqstruct(pp)(ii)
  END;

  bb <-- Rename_XST_IDX_SEQ_OBJ(pp,ii) =
  PRE
    pp: Rename_seqtok &
    ii: 1..maxmem
  THEN
    bb:=bool(ii:1..size(Rename_seqstruct(pp)))
  END;

  nn <-- Rename_LEN_SEQ_OBJ(pp)=
  PRE
    pp: Rename_seqtok
  THEN
    nn:=size(Rename_seqstruct(pp))
  END;

  bb <-- Rename_EMP_SEQ_OBJ(pp) =
  PRE
    pp: Rename_seqtok
  THEN
    bb:=bool(Rename_seqstruct(pp)=<>)
  END;

  bb <-- Rename_EQL_SEQ_OBJ(ss,tt) =
  PRE
     tt : Rename_seqtok &
     ss : Rename_seqtok
  THEN
     bb := bool(Rename_seqstruct(tt) = Rename_seqstruct(ss))
  END;

  bb,ii <-- Rename_MBR_SEQ_OBJ(tt,vv) =
  PRE
     tt : Rename_seqtok &
     vv : VALUE
  THEN
     IF vv : ran(Rename_seqstruct(tt)) THEN
        ANY kk WHERE
           kk: NAT & (Rename_seqstruct(tt))(kk) = vv
        THEN
            bb := TRUE || ii := kk  
        END 
     ELSE
        bb := FALSE || ii :: NAT
     END 
  END;


/******************   Sequence Operations ***********************/


  bb <-- Rename_PSH_SEQ_OBJ(pp,vv) =
  PRE
    pp:Rename_seqtok &
    vv: VALUE
    /* Rename_seqmem < maxmem */
  THEN
    IF Rename_seqmemTHEN
      Rename_seqstruct(pp):=Rename_seqstruct(pp) <- vv ||
      Rename_seqmem:=Rename_seqmem+1 ||
      bb := TRUE
    ELSE
      bb := FALSE
    END
  END;


  Rename_CLR_SEQ_OBJ(pp) =
  PRE
    pp: Rename_seqtok  /* &
    Rename_seqmem >= size(Rename_seqstruct(pp)) */
  THEN
    Rename_seqstruct(pp) := <> ||
    Rename_seqmem := Rename_seqmem - size(Rename_seqstruct(pp))
  END;


  Rename_KEP_SEQ_OBJ(pp,ii) =
  PRE
    pp:Rename_seqtok &
    ii:0..size(Rename_seqstruct(pp)) &
    Rename_seqmem >= size(Rename_seqstruct(pp))+ii
  THEN
    Rename_seqstruct(pp):=Rename_seqstruct(pp) /|\ ii ||
    Rename_seqmem:=Rename_seqmem-size(Rename_seqstruct(pp))+ii
  END;

  Rename_CUT_SEQ_OBJ(pp,ii) =
  PRE
    pp:Rename_seqtok &
    ii:0..size(Rename_seqstruct(pp)) &
    Rename_seqmem >= ii
  THEN
    Rename_seqstruct(pp):=Rename_seqstruct(pp) \|/ ii ||
    Rename_seqmem:=Rename_seqmem-ii
  END;


  Rename_REV_SEQ_OBJ(pp) =
  PRE
    pp:Rename_seqtok
  THEN
    Rename_seqstruct(pp):=rev(Rename_seqstruct(pp))
  END;


  Rename_SWP_SEQ_OBJ(pp,ii,jj) =
  PRE
    pp:Rename_seqtok &
    ii:dom(Rename_seqstruct(pp)) &
    jj:dom(Rename_seqstruct(pp))
  THEN
    Rename_seqstruct(pp):= (
     Rename_seqstruct(pp) <+  (
       {ii |-> Rename_seqstruct(pp)(jj), jj |-> Rename_seqstruct(pp)(ii) }
       )
     )
  END;

  Rename_POP_SEQ_OBJ(pp) =
  PRE
    pp:Rename_seqtok &
    Rename_seqstruct(pp)/=<> &
    Rename_seqmem > 0
  THEN
    Rename_seqstruct(pp):= front(Rename_seqstruct(pp)) ||
    Rename_seqmem:=Rename_seqmem-1
  END;

  Rename_STO_SEQ_OBJ(pp,ii,vv) =
  PRE
    pp:Rename_seqtok &
    vv:VALUE &
    ii:1..size(Rename_seqstruct(pp))
  THEN 
    Rename_seqstruct(pp)(ii):=vv
  END;

  bb <-- Rename_APP_SEQ_OBJ(pp,qq) =
  PRE
    pp:Rename_seqtok &
    qq:Rename_seqtok 
    /* Rename_seqmem+size(Rename_seqstruct(qq))<=maxmem */
  THEN
    IF
     Rename_seqmem+size(Rename_seqstruct(qq))<=maxmem
    THEN
      Rename_seqstruct(pp):= (
        Rename_seqstruct(pp)^Rename_seqstruct(qq) 
      ) ||
      Rename_seqmem:= (
       Rename_seqmem+size(Rename_seqstruct(qq)) 
      ) ||
      bb:=TRUE
    ELSE
      bb:=FALSE
    END
  END;

  bb <-- Rename_CPY_SEQ_OBJ(pp,qq) =
  PRE
    pp:Rename_seqtok &
    qq:Rename_seqtok 
    /* Rename_seqmem -  ( 
     size(Rename_seqstruct(qq)) + size(Rename_seqstruct(pp))
     ) <= maxmem  */
  THEN
    IF
     Rename_seqmem - (
       size(Rename_seqstruct(qq))+ (
         size(Rename_seqstruct(pp))
       )
     ) <= maxmem
    THEN
      Rename_seqstruct(qq):=Rename_seqstruct(pp) ||
      Rename_seqmem:= (
       Rename_seqmem-size(Rename_seqstruct(qq))+ ( 
         size(Rename_seqstruct(pp)) 
         )
      )||
      bb:=TRUE
    ELSE
      bb:=FALSE
    END
  END;


  bb <-- Rename_OVR_SEQ_OBJ(pp,qq) =
  PRE
    pp:Rename_seqtok &
    qq:Rename_seqtok 
    /* Rename_seqmem + (
     size(Rename_seqstruct(qq))-size(Rename_seqstruct(pp))
    ) <= maxmem */
  THEN
    IF
      Rename_seqmem+ (
        size(Rename_seqstruct(qq))-(
          size(Rename_seqstruct(pp))
        )
      ) <= maxmem
    THEN
      Rename_seqstruct(qq):= (
        Rename_seqstruct(qq) <+ Rename_seqstruct(pp) 
      ) ||
      Rename_seqmem:= (
       Rename_seqmem + (
         max({0,(size(Rename_seqstruct(qq))-(
          size(Rename_seqstruct(pp))
         ))}) 
       )
      ) ||
      bb:=TRUE
    ELSE
      bb:=FALSE
    END
  END;

/************************ Persistent storage facilities *****************/

/***********  save/restore host byte order ***********/

  Rename_SAV_SEQ_OBJ =
  BEGIN
    skip
  END;

  Rename_RST_SEQ_OBJ =
  ANY
    sseqn,sseqo,stotseq
  WHERE
    sseqn <: Rename_SEQOBJ &
    sseqo: sseqn --> seq(VALUE) &
    stotseq:  NAT 
  THEN
    Rename_seqstruct := sseqo ||
    Rename_seqtok := sseqn ||
    Rename_seqmem := stotseq
  END;

/***********  save/restore network byte order ***********/

  Rename_SAVN_SEQ_OBJ =
  BEGIN
    skip
  END;

  Rename_RSTN_SEQ_OBJ =
  ANY
    sseqn,sseqo,stotseq
  WHERE
    sseqn <: Rename_SEQOBJ &
    sseqo: sseqn --> seq(VALUE) &
    stotseq:  NAT 
  THEN
    Rename_seqstruct := sseqo ||
    Rename_seqtok := sseqn ||
    Rename_seqmem := stotseq
  END;

/************************** Browsing ************************************/

  nn,pp <-- Rename_FIRST_SEQ_OBJ =  
  IF not(Rename_seqtok = {}) THEN
     pp :: Rename_seqtok || 
     nn := card(Rename_seqtok) 
  ELSE
     pp :: Rename_SEQOBJ ||
     nn := 0
  END;

  nn,qq <-- Rename_NEXT_SEQ_OBJ(mm,pp) = 
  PRE
    pp : Rename_seqtok &
    mm : NAT1
  THEN
    nn := mm-1 ||
    qq :: Rename_seqtok
  END;


/********************** Input Output facilities ************************/

  Rename_OUTPUT_SEQ_OBJ(SS,pp) =  
  PRE
    SS<: VALUE &
    pp: Rename_seqtok
  THEN
    skip
  END;

  bb <-- Rename_INPUT_SEQ_OBJ(SS,pp,ll) = 
  PRE
    SS<: VALUE &
    pp: Rename_seqtok &
    ll: 1..250
  THEN
     IF Rename_seqmem + ll <= maxmem THEN
       ANY ss WHERE
         ss : seq(VALUE) &
         size(ss) = ll
       THEN
         Rename_seqstruct(pp) := Rename_seqstruct(pp) ^ ss ||
         Rename_seqmem := Rename_seqmem + ll ||
         bb := TRUE
       END
     ELSE
     bb := FALSE
   END
  END

END


Analysed Constructs

Hypertext Constructs Page

On-line Help

Help Contents Page
Index

Document Last Updated: Wed Aug 25 17:36:52 1999

B-Toolkit Beta 4.55