source: mainline/uspace/dist/src/sysel/lib/map.sy

Last change on this file was c5cb943d, checked in by Jiri Svoboda <jiri@…>, 15 years ago

Update SBI to rev. 291.

  • Property mode set to 100644
File size: 3.2 KB
Line 
1--
2-- Copyright (c) 2010 Jiri Svoboda
3-- All rights reserved.
4--
5-- Redistribution and use in source and binary forms, with or without
6-- modification, are permitted provided that the following conditions
7-- are met:
8--
9-- o Redistributions of source code must retain the above copyright
10-- notice, this list of conditions and the following disclaimer.
11-- o Redistributions in binary form must reproduce the above copyright
12-- notice, this list of conditions and the following disclaimer in the
13-- documentation and/or other materials provided with the distribution.
14-- o The name of the author may not be used to endorse or promote products
15-- derived from this software without specific prior written permission.
16--
17-- THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18-- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19-- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20-- IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21-- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22-- NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23-- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24-- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25-- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26-- THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27--
28
29-- Trivial map.
30class Map/tkey/tvalue is
31 var data : List/(MapPair/tkey/tvalue);
32
33 -- New empty map.
34 new() is
35 data = new List/(MapPair/tkey/tvalue)();
36 end
37
38 fun Set(key : tkey; value : tvalue) is
39 if KeyPresent(key) then
40 Remove(key);
41 end
42
43 var p : MapPair/tkey/tvalue;
44 p = new MapPair/tkey/tvalue();
45
46 p.Key = key;
47 p.Value = value;
48 data.Append(p);
49 end
50
51 -- Return internal list node associated with key @a key.
52 fun lookup_node(key : tkey) : ListNode/(MapPair/tkey/tvalue) is
53 var node : ListNode/(MapPair/tkey/tvalue);
54
55 node = data.First;
56 while node != nil do
57 if node.Data.Key == key then
58 return node;
59 end
60
61 node = node.Next;
62 end
63
64 return nil;
65 end
66
67 fun KeyPresent(key : tkey) : bool is
68 return lookup_node(key) != nil;
69 end
70
71 fun Get(key : tkey) : tvalue is
72 var node : ListNode/(MapPair/tkey/tvalue);
73
74 node = lookup_node(key);
75 return node.Data.Value;
76 end
77
78 fun Remove(key : tkey) is
79 var node : ListNode/(MapPair/tkey/tvalue);
80
81 node = lookup_node(key);
82 node.Remove();
83 end
84
85 prop self[key : tkey] : tvalue is
86 get is
87 return Get(key);
88 end
89 set value is
90 Set(key, value);
91 end
92 end
93
94 fun GetEnumerator() : IEnumerator/tkey is
95 return new MapEnumerator/tkey/tvalue(data.get_first());
96 end
97end
98
99class MapPair/tkey/tvalue is
100 var Key : tkey;
101 var Value : tvalue;
102end
103
104class MapEnumerator/tkey/tvalue : IEnumerator/tkey is
105 var first : ListNode/(MapPair/tkey/tvalue);
106 var current : ListNode/(MapPair/tkey/tvalue);
107 var started : bool;
108
109 new(first_node : ListNode/(MapPair/tkey/tvalue)) is
110 first = first_node;
111 current = nil;
112 started = false;
113 end
114
115 fun MoveNext() : bool is
116 if started then
117 current = current.Next;
118 else
119 current = first;
120 started = true;
121 end
122
123 return current != nil;
124 end
125
126 prop Data : tkey is
127 get is
128 return current.Data.Key;
129 end
130 end
131end
Note: See TracBrowser for help on using the repository browser.