~jsvoboda/helenos/sysel

« back to all changes in this revision

Viewing changes to uspace/dist/src/sysel/lib/map.sy

  • Committer: Jiri Svoboda
  • Date: 2010-05-08 08:10:44 UTC
  • Revision ID: jiri@wiwaxia-20100508081044-5hvcjwu15rsfvgnv
Update SBI to rev. 244.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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.
 
30
class 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
end
 
94
 
 
95
class MapPair/tkey/tvalue is
 
96
        var Key : tkey;
 
97
        var Value : tvalue;
 
98
end