From: <zy...@us...> - 2007-12-24 17:34:42
|
Revision: 3860 http://jython.svn.sourceforge.net/jython/?rev=3860&view=rev Author: zyasoft Date: 2007-12-24 09:34:38 -0800 (Mon, 24 Dec 2007) Log Message: ----------- Applied same changes as in PyStringMap.java to clean up code. Appears to pass the regrtest at the same level - certainly quite fundamental. Modified Paths: -------------- branches/modern/src/org/python/core/PyDictionary.java Modified: branches/modern/src/org/python/core/PyDictionary.java =================================================================== --- branches/modern/src/org/python/core/PyDictionary.java 2007-12-24 16:33:57 UTC (rev 3859) +++ branches/modern/src/org/python/core/PyDictionary.java 2007-12-24 17:34:38 UTC (rev 3860) @@ -1,5 +1,6 @@ // Copyright (c) Corporation for National Research Initiatives package org.python.core; +import java.util.*; /** * A builtin python dictionary. @@ -577,13 +578,13 @@ } //~ END GENERATED REGION -- DO NOT EDIT SEE gexpose.py - protected java.util.Map table; + private final Map table; /** * Create an empty dictionary. */ public PyDictionary() { - this(java.util.Collections.synchronizedMap(new java.util.HashMap())); + this(Collections.synchronizedMap(new HashMap())); } /** @@ -592,7 +593,7 @@ */ public PyDictionary(PyType subtype) { super(subtype); - table = java.util.Collections.synchronizedMap(new java.util.HashMap()); + table = Collections.synchronizedMap(new HashMap()); } /** @@ -600,8 +601,8 @@ * @param t the hashtable used. The supplied hashtable is used as * is and must only contain PyObject key:value pairs. */ - public PyDictionary(java.util.Map t) { - table = java.util.Collections.synchronizedMap(new java.util.HashMap(t)); + public PyDictionary(Map t) { + table = Collections.synchronizedMap(new HashMap(t)); } /** @@ -756,8 +757,8 @@ StringBuffer buf = new StringBuffer("{"); synchronized(table) { - for (java.util.Iterator it = table.entrySet().iterator(); it.hasNext(); ) { - java.util.Map.Entry entry = (java.util.Map.Entry)it.next(); + for (Iterator it = table.entrySet().iterator(); it.hasNext(); ) { + Map.Entry entry = (Map.Entry)it.next(); buf.append(((PyObject)entry.getKey()).__repr__().toString()); buf.append(": "); buf.append(((PyObject)entry.getValue()).__repr__().toString()); @@ -1047,12 +1048,13 @@ final PyObject dict_popitem() { synchronized(table) { - java.util.Iterator it = table.entrySet().iterator(); + Iterator it = table.entrySet().iterator(); if (!it.hasNext()) throw Py.KeyError("popitem(): dictionary is empty"); - java.util.Map.Entry entry = (java.util.Map.Entry)it.next(); + Map.Entry entry = (Map.Entry)it.next(); it.remove(); - return new PyTuple(new PyObject[] { (PyObject)entry.getKey(), (PyObject)entry.getValue() }); + return new PyTuple(new PyObject[] + { (PyObject)entry.getKey(), (PyObject)entry.getValue() }); } } @@ -1065,15 +1067,16 @@ } final PyList dict_items() { - int n = table.size(); - java.util.Vector l = new java.util.Vector(n); + List lst = null; synchronized(table) { - for (java.util.Iterator it = table.entrySet().iterator(); it.hasNext(); ) { - java.util.Map.Entry entry = (java.util.Map.Entry)it.next(); - l.addElement(new PyTuple(new PyObject[] { (PyObject)entry.getKey(), (PyObject)entry.getValue() })); + lst = new ArrayList(table.size()); + for (Iterator it = table.entrySet().iterator(); it.hasNext(); ) { + Map.Entry entry = (Map.Entry)it.next(); + lst.add(new PyTuple(new PyObject[] + { (PyObject)entry.getKey(), (PyObject)entry.getValue() })); } } - return new PyList(l); + return new PyList(lst); } /** @@ -1084,7 +1087,7 @@ } final PyList dict_keys() { - return new PyList(new java.util.Vector(table.keySet())); + return new PyList(new ArrayList(table.keySet())); } /** @@ -1095,7 +1098,7 @@ } final PyList dict_values() { - return new PyList(new java.util.Vector(table.values())); + return new PyList(new ArrayList(table.values())); } /** @@ -1145,8 +1148,8 @@ // just a lightweight wrapper for now... class PDCollectionIter extends PyIterator { - private java.util.Iterator iterator; - public PDCollectionIter(java.util.Collection c) { + private final Iterator iterator; + public PDCollectionIter(Collection c) { this.iterator = c.iterator(); } @@ -1158,16 +1161,17 @@ } class PDEntriesIter extends PyIterator { - private java.util.Iterator iterator; - public PDEntriesIter(java.util.Set s) { + private Iterator iterator; + public PDEntriesIter(Set s) { this.iterator = s.iterator(); } public PyObject __iternext__() { if (!iterator.hasNext()) return null; - java.util.Map.Entry entry = (java.util.Map.Entry)iterator.next(); - return new PyTuple(new PyObject[] { (PyObject)entry.getKey(), (PyObject)entry.getValue() }); + Map.Entry entry = (Map.Entry)iterator.next(); + return new PyTuple(new PyObject[] + { (PyObject)entry.getKey(), (PyObject)entry.getValue() }); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cg...@us...> - 2007-12-28 02:17:13
|
Revision: 3879 http://jython.svn.sourceforge.net/jython/?rev=3879&view=rev Author: cgroves Date: 2007-12-27 18:17:12 -0800 (Thu, 27 Dec 2007) Log Message: ----------- The Map.Entry from iterators returned by ConcurrentHashMap.entrySet is a single object that has its key and value filled in by each call to next. So storing an entry from that iterator for later removal from the set doesn't work because by the end of the iteration, the entry has different values. To get around this, store the original key and value in PyToJavaMapEntry so it can be used after the iteration. Modified Paths: -------------- branches/modern/src/org/python/core/PyDictionary.java Modified: branches/modern/src/org/python/core/PyDictionary.java =================================================================== --- branches/modern/src/org/python/core/PyDictionary.java 2007-12-28 00:25:12 UTC (rev 3878) +++ branches/modern/src/org/python/core/PyDictionary.java 2007-12-28 02:17:12 UTC (rev 3879) @@ -1244,6 +1244,51 @@ } } +/** Basic implementation of Entry that just holds onto a key and value and returns them. */ +class SimpleEntry<K, V> implements Entry<K, V> { + + public SimpleEntry(K key, V value){ + this.key = key; + this.value = value; + } + + public K getKey() { + return key; + } + + public V getValue() { + return value; + } + + public boolean equals(Object o) { + if(!(o instanceof Map.Entry)) { + return false; + } + Map.Entry e = (Map.Entry)o; + return eq(key, e.getKey()) && eq(value, e.getValue()); + } + + private static boolean eq(Object o1, Object o2) { + return o1 == null ? o2 == null : o1.equals(o2); + } + + public int hashCode() { + return ((key == null) ? 0 : key.hashCode()) ^ ((value == null) ? 0 : value.hashCode()); + } + + public String toString() { + return key + "=" + value; + } + + public V setValue(V val) { + throw new UnsupportedOperationException("Not supported by this view"); + } + + protected K key; + + protected V value; +} + /** * Wrapper for a Entry object returned from the java.util.Set * object which in turn is returned by the entrySet method of @@ -1253,13 +1298,11 @@ * objects that contain java Objects for a value so that on the java * side they can be reliable compared. */ -class PyToJavaMapEntry implements Entry { +class PyToJavaMapEntry extends SimpleEntry { - private Entry entry; - /** Create a copy of the Entry with Py.None coverted to null */ PyToJavaMapEntry(Entry entry) { - this.entry = entry; + super(entry.getKey(), entry.getValue()); } public boolean equals(Object o) { @@ -1268,69 +1311,36 @@ return o.equals(me); } + // tojava is called in getKey and getValue so the raw key and value can be + // used to create a new SimpleEntry in getEntry. public Object getKey() { - return PyDictionary.tojava(entry.getKey()); + return PyDictionary.tojava(key); } public Object getValue() { - return PyDictionary.tojava(entry.getValue()); + return PyDictionary.tojava(value); } - public int hashCode() { - // formula for the hash code is taken from the Entry documentation. - // Given the source we assume that key is not null. - Object val = entry.getValue(); - return getKey().hashCode() ^ (val == null ? 0 : val.hashCode()); - } - - public Object setValue(Object value) { - return entry.setValue(Py.java2py(value)); - } - + /** + * @return an entry that returns the original values given to this entry. + */ public Entry getEntry() { - return entry; + return new SimpleEntry(key, value); } } /** - * MapEntry Object for java MapEntry objects passed to the - * java.util.Set interface which is returned by the entrySet method of - * PyDictionary. Essentially like PyTojavaMapEntry, but going the - * other way converting java Objects to PyObjects. + * MapEntry Object for java MapEntry objects passed to the java.util.Set + * interface which is returned by the entrySet method of PyDictionary. + * Essentially like PyTojavaMapEntry, but going the other way converting java + * Objects to PyObjects. */ -class JavaToPyMapEntry implements Entry { - private PyObject key; - private PyObject val; - +class JavaToPyMapEntry extends SimpleEntry { + public JavaToPyMapEntry(Entry entry) { - this.key = Py.java2py(entry.getKey()); - this.val = Py.java2py(entry.getValue()); + super(Py.java2py(entry.getKey()), Py.java2py(entry.getValue())); } - - public boolean equals(Object o) { - if (o == null || !(o instanceof Entry)) return false; - Entry oe = (Entry)o; - // The objects comming in will always be a Entry from a - // PyDictionary, so getKey and getValue will always be PyObjects - return oe.getKey().equals(key) && oe.getValue().equals(val); - } - - public int hashCode() { - return key.hashCode() ^ val.hashCode(); - } - - public Object getKey() { - return key; - } - - public Object getValue() { - return val; - } - - public Object setValue(Object val) { - throw new UnsupportedOperationException("Not supported by this view"); - } } /** @@ -1338,7 +1348,6 @@ * java.util.Map */ class PyMapKeyValSet extends PyMapSet { - PyMapKeyValSet(Collection coll) { super(coll); @@ -1367,18 +1376,20 @@ PyMapEntrySet(Collection coll) { super(coll); - } + } // We know that PyMapEntrySet will only contains Entrys, so // if the object being passed in is null or not a Entry, then // return null which will match nothing for remove and contains methods. Object toPython(Object o) { - if (o == null || !(o instanceof Entry)) return null; - if (o instanceof PyToJavaMapEntry) + if(o == null || !(o instanceof Entry)) + return null; + if(o instanceof PyToJavaMapEntry) { // Use the original entry from PyDictionary return ((PyToJavaMapEntry)o).getEntry(); - else + } else { return new JavaToPyMapEntry((Entry)o); + } } Object toJava(Object o) { @@ -1398,16 +1409,14 @@ * functionality such that changes to the wrapper set or reflected in * PyDictionary. */ -abstract class PyMapSet extends AbstractSet -{ +abstract class PyMapSet extends AbstractSet { - Collection coll; - PyMapSet(Collection coll) { this.coll = coll; } abstract Object toJava(Object obj); + abstract Object toPython(Object obj); public int size() { @@ -1452,6 +1461,8 @@ public Iterator iterator() { return new PySetIter(coll.iterator()); } + + private final Collection coll; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <zy...@us...> - 2008-01-14 14:00:19
|
Revision: 4025 http://jython.svn.sourceforge.net/jython/?rev=4025&view=rev Author: zyasoft Date: 2008-01-14 06:00:12 -0800 (Mon, 14 Jan 2008) Log Message: ----------- Restored PyDictionary.__contains__ optimization from r3473, got lost in larger changes Modified Paths: -------------- branches/modern/src/org/python/core/PyDictionary.java Modified: branches/modern/src/org/python/core/PyDictionary.java =================================================================== --- branches/modern/src/org/python/core/PyDictionary.java 2008-01-14 08:46:22 UTC (rev 4024) +++ branches/modern/src/org/python/core/PyDictionary.java 2008-01-14 14:00:12 UTC (rev 4025) @@ -922,6 +922,10 @@ return table.containsKey(key); } + public boolean __contains__(PyObject o) { + return dict___contains__(o); + } + final boolean dict___contains__(PyObject o) { return dict_has_key(o); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |