\ ==============================================================================
\
\ hnt_expl - the base hash table example in the ffl
\
\ Copyright (C) 2007 Dick van Oudheusden
\
\ This library is free software; you can redistribute it and/or
\ modify it under the terms of the GNU General Public
\ License 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 the GNU
\ General Public License for more details.
\
\ You should have received a copy of the GNU General Public
\ License along with this library; if not, write to the Free
\ Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
\
\ ==============================================================================
\
\ $Date: 2007-12-09 07:23:14 $ $Revision: 1.4 $
\
\ ==============================================================================
include ffl/hnt.fs
include ffl/hni.fs
\ Example: store scientific constants in a hash table
\ Extend the base node with a float for storing the value of the constant
begin-structure sc%
hnn%
+field sc>ht \ Node extends the base node
ffield: sc>value \ Value of constant
end-structure
\ Create the hash table in the dictionary with an initial size of 10
10 hnt-create sc-table
\ Word for adding the value
: sc-add ( r c-addr u -- = value key )
2dup sc-table hnt-search \ Search if the key is already present in the hash table
dup nil<> IF \ If the key is already present Then
nip nip nip \ Remove the key and hash value from stack
sc>value f! \ Update the node in the hash table with the value
ELSE \ Else
drop \ Drop nil
sc% allocate throw \ Allocate a new sc% node
>r
r@ hnn-init \ Initialise the new sc% node with the key and hash
r@ sc>value f! \ Save the value in the node
r> sc-table hnt-insert \ Store the sc% node in the hash table
THEN
;
\ Add the constants
3.14158E+0 s" pi" sc-add
2.71828E+0 s" euler" sc-add
1.61803E+0 s" golden" sc-add
\ Word for printing the scientific constant
: sc-emit ( sc% -- )
dup hnn-key@ type ." -> " sc>value f@ f. cr
;
\ Print all scientific constants
' sc-emit sc-table hnt-execute \ Execute the word sc-emit for all entries in the hash table
\ Example hash table iterator
\ Create the hash table iterator in the dictionary
sc-table hni-create sc-iter \ Create an iterator named sc-iter on the sc-table hash table
\ Moving the iterator
sc-iter hni-first \ Move the iterator to the first record
nil<> [IF] \ If record exists Then ..
sc-iter hni-key type \ Type the key ..
.( => )
sc-iter hni-get sc>value f@ f. \ .. and the value
cr
[THEN]
sc-iter hni-next \ Move the iterator to the next record
nil<> [IF] \ If record exists Then ..
sc-iter hni-key type \ Type the key ..
.( => )
sc-iter hni-get sc>value f@ f. \ .. and the value
cr
[ELSE]
.( No next record in the hash table) cr
[THEN]
Generated by fsdocgen 0.1.0