[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