New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
mod_sorted_list.f90 in vendors/XMLIO_SERVER/current/src/XMLIO – NEMO

source: vendors/XMLIO_SERVER/current/src/XMLIO/mod_sorted_list.f90 @ 1897

Last change on this file since 1897 was 1897, checked in by flavoni, 14 years ago

importing XMLIO_SERVER vendor

File size: 3.7 KB
Line 
1MODULE mod_sorted_list
2
3  PRIVATE
4 
5  TYPE node
6   INTEGER :: key
7   INTEGER :: value
8   LOGICAL :: has_value
9   TYPE(node),POINTER :: child1
10   TYPE(node),POINTER :: child2
11  END TYPE node
12
13TYPE, PUBLIC :: sorted_list
14  PRIVATE
15  TYPE(vector_node),POINTER :: tree => NULL()
16  TYPE(node),POINTER        :: first => NULL()
17  INTEGER :: size = 0
18  LOGICAL :: is_init=.FALSE.
19END TYPE sorted_list 
20
21  PUBLIC :: sorted_list__new, sorted_list__add, sorted_list__find, sorted_list__delete 
22INCLUDE 'vector_node_def.inc'
23
24CONTAINS
25
26INCLUDE 'vector_node_contains.inc'
27 
28  SUBROUTINE node__new(Pt_n)
29  IMPLICIT NONE
30    TYPE(node), POINTER :: Pt_n
31   
32    Pt_n%has_value=.FALSE.
33    Pt_n%child1=>NULL()
34    pt_n%child2=>NULL()
35  END SUBROUTINE node__new
36 
37 
38  SUBROUTINE sorted_list__new(Pt_sl)
39  IMPLICIT NONE
40    TYPE(sorted_list), POINTER :: Pt_sl
41    TYPE(node), POINTER :: Pt_n
42   
43    IF (Pt_sl%is_init) CALL sorted_list__delete(Pt_sl)
44   
45    ALLOCATE(Pt_sl%tree)
46    CALL vector_node__new(Pt_sl%tree)
47    CALL vector_node__get_new(Pt_sl%tree,Pt_n)
48    CALL node__new(Pt_n) 
49    Pt_sl%first=>Pt_n
50    Pt_sl%Size=0
51    Pt_sl%is_init=.TRUE.
52   
53  END SUBROUTINE  sorted_list__new
54 
55  SUBROUTINE sorted_list__delete(Pt_sl)
56  IMPLICIT NONE
57    TYPE(sorted_list), POINTER :: Pt_sl
58    TYPE(node), POINTER :: Pt_n
59
60    IF (Pt_sl%is_init) THEN
61      CALL vector_node__delete(Pt_sl%tree)
62      DEALLOCATE(Pt_sl%tree)
63      Pt_sl%is_init=.FALSE.
64    ENDIF
65   
66  END SUBROUTINE  sorted_list__delete
67
68   
69  SUBROUTINE sorted_list__Add(Pt_sl,key,value)
70  IMPLICIT NONE
71    TYPE(sorted_list), POINTER :: Pt_sl
72    INTEGER,INTENT(IN)  :: key
73    INTEGER,INTENT(IN)  :: value
74
75    LOGICAL               :: Out
76    TYPE(node), POINTER   :: current
77    TYPE(node), POINTER   :: new 
78   
79   
80    CALL vector_node__get_new(Pt_sl%tree,new)
81    CALL node__new(new)
82    current=>Pt_sl%first
83   
84     
85    Out=.FALSE.
86   
87    DO WHILE (.NOT. out)
88      IF (current%has_value) THEN
89        IF (key > current%key) THEN
90          IF (ASSOCIATED(current%child2)) THEN
91            current=>current%child2
92          ELSE
93            current%child2=>new
94            out=.FALSE.
95          ENDIF
96        ELSE
97          IF (ASSOCIATED(current%child1)) THEN
98            current=>current%child1
99          ELSE
100            current%child1=>new
101            out=.FALSE.
102          ENDIF
103        ENDIF
104      ELSE
105        current%has_value=.TRUE.
106        current%key=key
107        current%value=value
108        out=.TRUE.
109      ENDIF
110    ENDDO
111   
112    Pt_sl%Size=Pt_sl%Size+1
113       
114  END SUBROUTINE sorted_list__Add
115
116 
117  SUBROUTINE sorted_list__find(Pt_sl,key,value,success)
118  IMPLICIT NONE
119    TYPE(sorted_list),POINTER   :: Pt_sl
120    INTEGER,INTENT(IN)          :: key
121    INTEGER,INTENT(OUT)         :: value
122    LOGICAL,INTENT(OUT)         :: success
123   
124    LOGICAL               :: Out
125    TYPE(node), POINTER   :: current
126   
127    current=>Pt_sl%first
128    Out=.FALSE.
129    Success=.FALSE.
130   
131    DO WHILE (.NOT. out)
132      IF (current%has_value) THEN
133        IF (key == current%key) THEN
134          value=current%value
135          success=.TRUE.
136          out=.TRUE.
137        ELSE IF (key > current%key) THEN
138          IF (ASSOCIATED(current%child2)) THEN
139            current=>current%child2
140          ELSE
141            out=.TRUE.
142          ENDIF
143        ELSE
144          IF (ASSOCIATED(current%child1)) THEN
145            current=>current%child1
146          ELSE
147            out=.TRUE.
148          ENDIF
149        ENDIF
150      ELSE
151        out=.TRUE. 
152      ENDIF
153    ENDDO
154
155  END SUBROUTINE sorted_list__find
156
157 
158  SUBROUTINE sorted_list__get_first(Pt_sl,Pt_n)
159  IMPLICIT NONE
160    TYPE(sorted_list),POINTER   :: Pt_sl
161    TYPE(node),POINTER          :: Pt_n
162
163    Pt_n=>Pt_sl%tree%at(1)%Pt
164  END SUBROUTINE sorted_list__get_first 
165
166
167END MODULE mod_sorted_list
Note: See TracBrowser for help on using the repository browser.