\ ==============================================================================
\
\ bnt_expl - the binary tree 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: 2008-04-10 16:12:01 $ $Revision: 1.1 $
\
\ ==============================================================================
include ffl/bnt.fs
include ffl/bni.fs
include ffl/str.fs
\ Example: store mountain positions in a binary tree
\ Create the generic binary tree in the dictionary
bnt-create mountains
\ Setup the compare word for comparing the mountain names
: mount-compare ( str str - n = Compare the two mountain names )
str^ccompare
;
' mount-compare mountains bnt-compare!
\ Extend the generic binary tree node with mountain positions fields
begin-structure mount%
bnn%
+field mount>node \ Mountain structure extends the bnn structure
ffield: mount>lng \ Longitude position
ffield: mount>lat \ Latitude position
end-structure
\ Create the allocation word for the extended structure
: mount-new ( F: r1 r2 -- ; x bnn1 -- bnn2 = Create a new mountain position variable with position r1 r2, name c-addr u and parent bnn1 )
mount% allocate throw \ Allocate the mountain variable
>r
r@ mount>node bnn-init \ Initialise the binary tree node
r@ mount>lng f! \ Save the longitude position
r@ mount>lat f! \ Save the latitude position
r>
;
\ Add the mountain positions to the binary tree; the key is the mountain name in a (unique) dynamic string
27.98E0 86.92E0 ' mount-new str-new dup s" mount everest" rot str-set mountains bnt-insert [IF]
.( Mountain:) bnn-key@ str-get type .( added to the tree.) cr
[ELSE]
.( Mountain was not unique in tree) cr drop fdrop fdrop
[THEN]
45.92E0 6.92E0 ' mount-new str-new dup s" mont blanc" rot str-set mountains bnt-insert [IF]
.( Mountain:) bnn-key@ str-get type .( added to the tree.) cr
[ELSE]
.( Mountain was not unique in tree) cr drop fdrop fdrop
[THEN]
43.35E0 42.43E0 ' mount-new str-new dup s" mount elbrus" rot str-set mountains bnt-insert [IF]
.( Mountain:) bnn-key@ str-get type .( added to the tree.) cr
[ELSE]
.( Mountain was not unique in tree) cr drop fdrop fdrop
[THEN]
\ Find a mountain in the binary tree
str-new value mount-name
s" mont blanc" mount-name str-set
mount-name mountains bnt-get [IF]
.( Mount:) dup bnn-key@ str-get type
.( latitude:) dup mount>lat f@ f.
.( longitude:) mount>lng f@ f. cr
[ELSE]
.( Mount:) mount-name str-get type .( not in tree.) cr
[THEN]
s" vaalserberg" mount-name str-set
mount-name mountains bnt-get [IF]
.( Mount:) dup bnn-key@ str-get type
.( latitude:) dup mount>lat f@ f.
.( longitude:) mount>lng f@ f. cr
[ELSE]
.( Mount:) mount-name str-get type .( not in tree.) cr
[THEN]
\ Word for printing the mountain positions
: mount-emit ( mount -- = Print mountain )
dup bnn-key@ str-get type ." --> "
dup mount>lat f@ f. ." - "
mount>lng f@ f. cr
;
\ Print all mountain positions
' mount-emit mountains bnt-execute \ Execute the word mount-emit for all entries in the tree
\ Example mountains iterator
\ Create the tree iterator in the dictionary
mountains bni-create mount-iter \ Create an iterator named mount-iter on the mountains tree
\ Moving the iterator
mount-iter bni-first nil<>? [IF]
.( First mount:) dup bnn-key@ str-get type
.( latitude:) dup mount>lat f@ f.
.( longitude:) mount>lng f@ f. cr
[ELSE]
.( No first mountain.) cr
[THEN]
mount-iter bni-last nil<>? [IF]
.( Last mount:) dup bnn-key@ str-get type
.( latitude:) dup mount>lat f@ f.
.( longitude:) mount>lng f@ f. cr
[ELSE]
.( No last mountain.) cr
[THEN]
\ Word for freeing the tree node
: mount-free ( mount -- = Free the node in the tree )
dup bnn-key@ str-free
free throw
;
\ Cleanup the tree
' mount-free mountains bnt-clear
Generated by fsdocgen 0.1.0