[pypy-commit] lang-js default: added utility classes Map and MapDict

stepahn noreply at buildbot.pypy.org
Fri Dec 28 11:32:06 CET 2012


Author: Stephan <stephan at stzal.com>
Branch: 
Changeset: r110:1cb189adee2a
Date: 2011-07-17 21:34 +0200
http://bitbucket.org/pypy/lang-js/changeset/1cb189adee2a/

Log:	added utility classes Map and MapDict

diff --git a/js/test/test_map.py b/js/test/test_map.py
new file mode 100644
--- /dev/null
+++ b/js/test/test_map.py
@@ -0,0 +1,70 @@
+import py
+
+from js.utils import Map, MapDict
+
+class TestMap(object):
+    def test_addname(self):
+        m = Map()
+        m.addname('foo')
+        m.addname('bar')
+        assert m.indexes['foo'] == 0
+        assert m.indexes['bar'] == 1
+
+    def test_addname_return_index(self):
+        m = Map()
+        assert m.addname('foo') == 0
+        assert m.addname('bar') == 1
+
+
+    def test_indexof(self):
+        m = Map()
+        m.indexes['foo'] = 0
+        m.indexes['bar'] = 1
+        assert m.indexof('foo') == 0
+        assert m.indexof('bar') == 1
+        assert m.indexof('baz') == Map.NOT_FOUND
+
+class TestMapDict(object):
+    def test_set(self):
+        m = MapDict(2)
+        m.set('foo', 4)
+        m.set('bar', 8)
+        assert m.indexes['foo'] == 0
+        assert m.indexes['bar'] == 1
+        assert m.values[0] == 4
+        assert m.values[1] == 8
+
+    def test_set_max_size(self):
+        m = MapDict(2)
+        m.set('foo', 4)
+        m.set('bar', 8)
+        py.test.raises(IndexError, m.set, 'baz', 15)
+
+    def test_setindex(self):
+        m = MapDict(2)
+        m.setindex(0, 4)
+        m.setindex(1, 8)
+        assert m.values[0] == 4
+        assert m.values[1] == 8
+
+    def test_get(self):
+        m = MapDict(2)
+        m.indexes['foo'] = 0
+        m.indexes['bar'] = 1
+        m.values[0] = 4
+        m.values[1] = 8
+        assert m.get('foo') == 4
+        assert m.get('bar') == 8
+
+    def test_getindex(self):
+        m = MapDict(2)
+        m.values[0] = 4
+        m.values[1] = 8
+        assert m.getindex(0) == 4
+        assert m.getindex(1) == 8
+        assert m.getindex(1) == 8
+
+    def test_get_key_error(self):
+        m = MapDict(2)
+        py.test.raises(KeyError, m.getindex, Map.NOT_FOUND)
+        py.test.raises(KeyError, m.get, 'foo')
diff --git a/js/utils.py b/js/utils.py
--- a/js/utils.py
+++ b/js/utils.py
@@ -40,3 +40,37 @@
 
     def check_stack(self):
         assert self.stack_pointer == 1
+
+class Map(object):
+    NOT_FOUND = -1
+    def __init__(self):
+        self.indexes = {}
+
+    def indexof(self, name):
+        return self.indexes.get(name, self.NOT_FOUND)
+
+    def addname(self, name):
+        if name not in self.indexes:
+            self.indexes[name] = len(self.indexes)
+        return self.indexof(name)
+
+class MapDict(Map):
+    def __init__(self, size = 99):
+        Map.__init__(self)
+        self.values = [None] * size
+
+    def get(self, name):
+        idx = self.indexof(name)
+        return self.getindex(idx)
+
+    def getindex(self, idx):
+        if idx < 0:
+            raise KeyError
+        return self.values[idx]
+
+    def set(self, name, value):
+        idx = self.addname(name)
+        self.setindex(idx, value)
+
+    def setindex(self, idx, value):
+        self.values[idx] = value


More information about the pypy-commit mailing list