Under Original/Normal_Java/ one would find the original Labyrinth project ported...
[IRC.git] / Robust / src / Benchmarks / Java-Single / Labyrinth / mlp / Normal_Java / List_t.java
1 /* =============================================================================
2  *
3  * List_t.java
4  * -- Sorted singly linked list
5  * -- Options: duplicate allowed  
6  *    (DLIST_NO_DUPLICATES) is no implemented yet (default: allow duplicates)
7  *
8  * =============================================================================
9  *
10  * Copyright (C) Stanford University, 2006.  All Rights Reserved.
11  * Author: Chi Cao Minh
12  *
13  * =============================================================================
14  *
15  * For the license of bayes/sort.h and bayes/sort.c, please see the header
16  * of the files.
17  * 
18  * ------------------------------------------------------------------------
19  * 
20  * For the license of kmeans, please see kmeans/LICENSE.kmeans
21  * 
22  * ------------------------------------------------------------------------
23  * 
24  * For the license of ssca2, please see ssca2/COPYRIGHT
25  * 
26  * ------------------------------------------------------------------------
27  * 
28  * For the license of lib/mt19937ar.c and lib/mt19937ar.h, please see the
29  * header of the files.
30  * 
31  * ------------------------------------------------------------------------
32  * 
33  * For the license of lib/rbtree.h and lib/rbtree.c, please see
34  * lib/LEGALNOTICE.rbtree and lib/LICENSE.rbtree
35  * 
36  * ------------------------------------------------------------------------
37  * 
38  * Unless otherwise noted, the following license applies to STAMP files:
39  * 
40  * Copyright (c) 2007, Stanford University
41  * All rights reserved.
42  * 
43  * Redistribution and use in source and binary forms, with or without
44  * modification, are permitted provided that the following conditions are
45  * met:
46  * 
47  *     * Redistributions of source code must retain the above copyright
48  *       notice, this list of conditions and the following disclaimer.
49  * 
50  *     * Redistributions in binary form must reproduce the above copyright
51  *       notice, this list of conditions and the following disclaimer in
52  *       the documentation and/or other materials provided with the
53  *       distribution.
54  * 
55  *     * Neither the name of Stanford University nor the names of its
56  *       contributors may be used to endorse or promote products derived
57  *       from this software without specific prior written permission.
58  * 
59  * THIS SOFTWARE IS PROVIDED BY STANFORD UNIVERSITY ``AS IS'' AND ANY
60  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
61  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
62  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD UNIVERSITY BE LIABLE
63  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
64  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
65  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
66  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
67  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
68  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
69  * THE POSSIBILITY OF SUCH DAMAGE.
70  *
71  * =============================================================================
72  */
73
74
75 public class List_t {
76
77     public List_Node head;
78     boolean isCoordinate;
79     int size;
80
81     public List_t() {
82         head = new List_Node();
83     }
84
85
86     /* =======================================================================
87      * allocNode
88      * -- Returns null on failure
89      * =======================================================================
90      */
91     private List_Node allocNode(Object dataPtr) 
92     {
93         List_Node nodePtr = new List_Node();
94
95         if(nodePtr == null) {
96             return null;
97         }
98
99         nodePtr.dataPtr = dataPtr;
100         nodePtr.nextPtr = null;
101
102         return nodePtr;
103     }
104         
105     
106 /* =============================================================================
107  * list_alloc
108  * -- If NULL passed for 'compare' function, will compare data pointer addresses
109  * -- Returns NULL on failure
110  * =============================================================================
111  * list_t* list_alloc (long (*compare)(const void*, const void*));
112  *
113  *
114  */
115
116     public static List_t alloc(int isCoordinate) 
117     {
118         List_t listPtr = new List_t();
119
120         if(listPtr  == null) {
121             return null;
122         }
123
124         listPtr.head.dataPtr = null;
125         listPtr.head.nextPtr = null;
126         listPtr.size = 0;
127         
128         listPtr.isCoordinate = (isCoordinate==1)?true:false;
129
130         return listPtr;
131     }
132     
133 /* =============================================================================
134  * list_free
135  * -- If NULL passed for 'compare' function, will compare data pointer addresses
136  * -- Returns NULL on failure
137  * =============================================================================
138  * void list_free (list_t* listPtr);
139  */
140     public static void free(List_t listPtr) 
141     {
142         listPtr = null;
143     }
144
145 //    privae freeList
146
147 /* =============================================================================
148  * list_isEmpty
149  * -- Return TRUE if list is empty, else FALSE
150  * =============================================================================
151  * bool_t list_isEmpty (list_t* listPtr);
152  */
153     public boolean isEmpty() 
154     {
155         return (head.nextPtr == null);
156     }
157
158 /* =============================================================================
159  * list_getSize
160  * -- Returns size of list
161  * =============================================================================
162  * long list_getSize (list_t* listPtr);
163  */
164     public int getSize() {
165         return size;
166     }
167
168 /* =============================================================================
169  * findPrevious
170  * =============================================================================
171  * void* list_find (list_t* listPtr, void* dataPtr);
172  */                                                                             
173     private List_Node findPrevious(Object dataPtr) 
174     {
175         List_Node prevPtr = head;
176         List_Node nodePtr = prevPtr.nextPtr;
177
178         for(; nodePtr != null; nodePtr = nodePtr.nextPtr) {
179             if (compare(nodePtr.dataPtr,dataPtr) >= 0) {
180                 return prevPtr;
181             }
182             prevPtr = nodePtr;
183         }
184
185         return prevPtr;
186     }
187
188     /* =============================================================================
189      * list_find
190      * -- Returns NULL if not found, else returns pointer to data
191      * =============================================================================
192      * void* list_find (list_t* listPtr, void* dataPtr);
193      */
194     public Object find(Object dataPtr) {
195         List_Node nodePtr;
196         List_Node prevPtr = findPrevious(dataPtr);
197
198         nodePtr = prevPtr.nextPtr;
199
200         if((nodePtr == null) ||
201                 (compare(nodePtr.dataPtr,dataPtr) != 0)) {
202             return null;
203         }
204
205         return (nodePtr.dataPtr);
206     }
207
208     public int compare(Object obj1,Object obj2) 
209     {
210         if(isCoordinate)
211         {
212             return Coordinate.comparePair(obj1,obj2);
213         }
214         else 
215             return compareObject(obj1,obj2);
216     }
217
218 /* =============================================================================
219  * list_insert
220  * -- Return TRUE on success, else FALSE
221  * =============================================================================
222  * bool_t list_insert (list_t* listPtr, void* dataPtr);
223  */
224     public boolean insert(Object dataPtr) {
225         List_Node prevPtr;
226         List_Node nodePtr;
227         List_Node currPtr;
228
229         prevPtr = findPrevious(dataPtr);
230         currPtr = prevPtr.nextPtr;
231
232         nodePtr = allocNode(dataPtr);
233         if (nodePtr == null) {
234             return false;
235         }
236
237         nodePtr.nextPtr = currPtr;
238         prevPtr.nextPtr = nodePtr;
239         size++;
240
241         return true;
242     }
243         
244     
245 /* =============================================================================
246  * list_remove
247  * -- Returns TRUE if successful, else FALSE
248  * =============================================================================
249  * bool_t list_remove (list_t* listPtr, void* dataPtr);
250  */
251     public boolean remove(Object dataPtr) 
252     {
253         List_Node prevPtr;
254         List_Node nodePtr;
255
256         prevPtr = findPrevious(dataPtr);
257
258         nodePtr = prevPtr.nextPtr;
259
260         if((nodePtr != null) &&
261             (compare(nodePtr.dataPtr,dataPtr) == 0))
262         {
263             prevPtr.nextPtr = nodePtr.nextPtr;
264             nodePtr.nextPtr = null;
265             nodePtr = null;
266             size--;
267
268             return true;
269         }
270     
271         return false;
272     }
273
274     int compareObject(Object obj1,Object obj2) {
275         return 1;
276     }
277     
278
279 /* =============================================================================
280  * list_clear
281  * -- Removes all elements
282  * =============================================================================
283  * void list_clear (list_t* listPtr);
284  */
285     public void clear() {
286         head = new List_Node();
287         size = 0;    
288     }
289
290 /* =============================================================================
291  *
292  * End of list.java
293  *
294  * =============================================================================
295  */
296
297  /* Test list */
298
299  public static void main(String[] argv) {
300      List_t listPtr;
301      int[] data1 = new int[5];
302      int[] data2 = new int[6];
303
304      int i;
305
306      System.out.println("Starting...");
307         }
308
309 }
310
311
312