Patch title: Release 94 bulk changes
Abstract:
File: /pliant/language/type/set/dictionary.pli
Key:
    Removed line
    Added line
   
# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and
# modify it under the terms of the GNU General Public Licens
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be us
# but WITHOUT ANY WARRANTY; without even the implied warrant
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See 
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public 
# version 2 along with this program; if not, write to the Fr
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 


# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and
# modify it under the terms of the GNU General Public Licens
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be us
# but WITHOUT ANY WARRANTY; without even the implied warrant
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See 
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public 
# version 2 along with this program; if not, write to the Fr
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 


function hash i -> u
  arg Int i ; arg uInt u
  u := addressof:i map uInt

function hash i -> u
  arg uInt i ; arg uInt u
  u := i

function hash s -> u
  arg Str s ; arg uInt u
  u := 0
  update_hash_key u s:characters s:len


function hash s -> u
  arg Str s ; arg uInt u
  u := 0
  update_hash_key u s:characters s:len



function Dictionary key value -> t
  arg Type key value ; arg_R Type t
  has_no_side_effect


function Dictionary key value -> t
  arg Type key value ; arg_R Type t
  has_no_side_effect


  runtime_compile  Key key Value value  Dictionary (cast "(D
  runtime_compile  Key key Value value  Dictionary (cast "(Dictionary "+key:name+" "+value:name+")" Ident)  DictionaryNode (cast "(DictionaryNode "+key:name+" "+value:name+")" Ident)  hash_key (cast "hash "+key:name+" "+value:name Ident)  hash_function f  nodiv false  real addressof:value=(addressof value:real_data_type)


    type Dictionary
      field Address table
      field Int hashsize


    type Dictionary
      field Address table
      field Int hashsize
      if nodiv
        field uInt mask
      field Int count

    function build  d
      arg_w Dictionary d
      d table := null
      d hashsize := 0
      field Int count

    function build  d
      arg_w Dictionary d
      d table := null
      d hashsize := 0
      if nodiv
        d mask := 0
      d count := 0


    method d walk i v
      arg Dictionary d ; arg Int i ; arg_w Pointer:Value v
      var Int j := i
      while true
        if j=d:hashsize
      d count := 0


    method d walk i v
      arg Dictionary d ; arg Int i ; arg_w Pointer:Value v
      var Int j := i
      while true
        if j=d:hashsize
          # v :> null map Value
          (addressof Pointer:Value v) map Address := null
          if real
            v :> null map Value
          else
            (addressof Pointer:Value v) map Address := null
          return
        var Pointer:DictionaryNode n :> (d:table translate A
        if addressof:n<>null
          return
        var Pointer:DictionaryNode n :> (d:table translate A
        if addressof:n<>null
          # v :> n value
          (addressof Pointer:Value v) map Address := address
          if real
            v :> n value
          else
            (addressof Pointer:Value v) map Address := addressof Value n:value
          return
        j := j+1

    method d next v1 -> v2
      arg Dictionary d ; arg_r Value v1 ; arg_C Value v2
      var Pointer:DictionaryNode n1 :> ((addressof:v1 transl
      var Pointer:DictionaryNode n2 :> n1 next_node
      if addressof:n2<>null
          return
        j := j+1

    method d next v1 -> v2
      arg Dictionary d ; arg_r Value v1 ; arg_C Value v2
      var Pointer:DictionaryNode n1 :> ((addressof:v1 transl
      var Pointer:DictionaryNode n2 :> n1 next_node
      if addressof:n2<>null
        # v2 :> n2 value
        (addressof Pointer:Value v2) map Address := addresso
        if real
          v2 :> n2 value
        else
          (addressof Pointer:Value v2) map Address := addressof Value n2:value
      else
        d walk (hash_key n1:key)%(cast d:hashsize uInt)+1 v2


    method d walk k start v
      arg Dictionary d ; arg Key k ; arg DictionaryNode star
      var Pointer:DictionaryNode n :> start
      while addressof:n<>null
        if n:key=k
      else
        d walk (hash_key n1:key)%(cast d:hashsize uInt)+1 v2


    method d walk k start v
      arg Dictionary d ; arg Key k ; arg DictionaryNode star
      var Pointer:DictionaryNode n :> start
      while addressof:n<>null
        if n:key=k
          # v :> n value
          (addressof Pointer:Value v) map Address := address
          if real
            v :> n value
          else
            (addressof Pointer:Value v) map Address := addressof Value n:value
          return
        n :> n next_node
          return
        n :> n next_node
      # v :> null map Value
      (addressof Pointer:Value v) map Address := null
      if real
        v :> null map Value
      else
        (addressof Pointer:Value v) map Address := null

    method d first k -> v
      arg Dictionary d ; arg Key k ; arg_C Value v
      if d:hashsize<>0

    method d first k -> v
      arg Dictionary d ; arg Key k ; arg_C Value v
      if d:hashsize<>0
        var Int i := hash_key:k%(cast d:hashsize uInt)
        if nodiv
          var Int i
          if d:mask<>0
            i := hash_key:k .and. d:mask
          else
            i := hash_key:k%(cast d:hashsize uInt)
        else
          var Int i := hash_key:k%(cast d:hashsize uInt)
        var Pointer:DictionaryNode n :> (d:table translate A
        d walk k n v
      else
        var Pointer:DictionaryNode n :> (d:table translate A
        d walk k n v
      else
        # v :> null map Value
        (addressof Pointer:Value v) map Address := null
        if real
          v :> null map Value
        else
          (addressof Pointer:Value v) map Address := null
      
    method d first k default -> v
      arg_rw Dictionary d ; arg Key k ; arg Value default ; 
      v :> d first k
      if not exists:v
        v :> default   


    method d resize size
      arg_rw Dictionary d ; arg Int size
      var Address newtable := memory_zallocate size*Address:
      for (var Int i) 0 d:hashsize-1
        var Pointer:DictionaryNode n :> (d:table translate A
        while addressof:n<>null
          var Pointer:DictionaryNode n2 :> n next_node
          var Int newi := (hash_key n:key)%(cast size uInt)
          n next_node :> (newtable translate Address newi) m
          (newtable translate Address newi) map Pointer:Dict
          n :> n2
      memory_free d:table
      d table := newtable
      d hashsize := size
      
    method d first k default -> v
      arg_rw Dictionary d ; arg Key k ; arg Value default ; 
      v :> d first k
      if not exists:v
        v :> default   


    method d resize size
      arg_rw Dictionary d ; arg Int size
      var Address newtable := memory_zallocate size*Address:
      for (var Int i) 0 d:hashsize-1
        var Pointer:DictionaryNode n :> (d:table translate A
        while addressof:n<>null
          var Pointer:DictionaryNode n2 :> n next_node
          var Int newi := (hash_key n:key)%(cast size uInt)
          n next_node :> (newtable translate Address newi) m
          (newtable translate Address newi) map Pointer:Dict
          n :> n2
      memory_free d:table
      d table := newtable
      d hashsize := size
      if nodiv
        d mask := 0
        for (var Int i) 0 30
          if 2^i=d:hashsize
            d mask := d:hashsize-1
          if 2^i>=d:hashsize
            return

    method d insert k v -> v2
      arg_rw Dictionary d ; arg Key k ; arg Value v ; arg_C 
      if d:count>=d:hashsize
        d resize (max 2*d:count 16)
      var Pointer:DictionaryNode n :> (memory_allocate Dicti
      DictionaryNode build_instance addressof:n
      Key copy_instance (addressof Key k) (addressof Key n:k
      Value copy_instance (addressof Value v) (addressof Val
      var Int i := hash_key:k%(cast d:hashsize uInt)
      n next_node :> (d:table translate Address i) map Point
      (d:table translate Address i) map Pointer:DictionaryNo

    method d insert k v -> v2
      arg_rw Dictionary d ; arg Key k ; arg Value v ; arg_C 
      if d:count>=d:hashsize
        d resize (max 2*d:count 16)
      var Pointer:DictionaryNode n :> (memory_allocate Dicti
      DictionaryNode build_instance addressof:n
      Key copy_instance (addressof Key k) (addressof Key n:k
      Value copy_instance (addressof Value v) (addressof Val
      var Int i := hash_key:k%(cast d:hashsize uInt)
      n next_node :> (d:table translate Address i) map Point
      (d:table translate Address i) map Pointer:DictionaryNo
      # v2 :> n value
      (addressof Pointer:Value v2) map Address := addressof 
      if real
        v2 :> n value
      else
        (addressof Pointer:Value v2) map Address := addressof Value n:value
      d count := d:count+1


    function '-=' d v
      arg_rw Dictionary d ; arg_r Value v
      if d:hashsize=0
        return
      var Pointer:DictionaryNode n :> ((addressof:v translat
      var Int i := (hash_key n:key)%(cast d:hashsize uInt)
      var (Pointer Pointer:DictionaryNode) ptr :>> (d:table 
      while addressof:ptr<>addressof:n
        ptr :>> ptr next_node
      ptr :> n next_node
      DictionaryNode destroy_instance addressof:n
      memory_free addressof:n
      d count := d:count-1
  
    method d remove v -> v2
      arg_rw Dictionary d ; arg_r Value v ; arg_C Value v2
      d count := d:count+1


    function '-=' d v
      arg_rw Dictionary d ; arg_r Value v
      if d:hashsize=0
        return
      var Pointer:DictionaryNode n :> ((addressof:v translat
      var Int i := (hash_key n:key)%(cast d:hashsize uInt)
      var (Pointer Pointer:DictionaryNode) ptr :>> (d:table 
      while addressof:ptr<>addressof:n
        ptr :>> ptr next_node
      ptr :> n next_node
      DictionaryNode destroy_instance addressof:n
      memory_free addressof:n
      d count := d:count-1
  
    method d remove v -> v2
      arg_rw Dictionary d ; arg_r Value v ; arg_C Value v2
      # v2 :> d next v
      (addressof Pointer:Value v2) map Address := addressof 
      if real
        v2 :> d next v
      else
        (addressof Pointer:Value v2) map Address := addressof Value (d next v)
      d -= v


export Dictionary
      d -= v


export Dictionary