All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.python.modules.sets.BaseSet Maven / Gradle / Ivy

Go to download

Jython is an implementation of the high-level, dynamic, object-oriented language Python written in 100% Pure Java, and seamlessly integrated with the Java platform. It thus allows you to run Python on any Java platform.

There is a newer version: 2.7.4
Show newest version

package org.python.modules.sets;

import org.python.core.Py;
import org.python.core.PyException;
import org.python.core.PyIgnoreMethodTag;
import org.python.core.PyList;
import org.python.core.PyObject;
import org.python.core.PyTuple;
import org.python.core.__builtin__;
import org.python.core.PyType;

import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public abstract class BaseSet extends PyObject /*implements Set*/ {

    /**
     * The underlying container.  HashSet is used rather than Set because
     * clone is protected on Object and I didn't want to cast.
     */
    protected HashSet _set;

    /**
     * Create a new, empty set instance.
     */
    public BaseSet() {
        super();
        this._set = new HashSet();
    }

    /**
     * Create a new set instance from the values of the iterable object.
     *
     * @param data An iterable instance.
     */
    public BaseSet(PyObject data) {
        super();
        this._set = new HashSet();
        this._update(data);
    }

    public BaseSet(PyType type) {
        super(type);
        this._set = new HashSet();
    }

    /**
     * Update the underlying set with the contents of the iterable.
     *
     * @param data An iterable instance.
     * @throws PyIgnoreMethodTag Ignore.
     */
    protected void _update(PyObject data) throws PyIgnoreMethodTag {

        if(data instanceof BaseSet) {
            // Skip the iteration if both are sets
            this._set.addAll(((BaseSet)data)._set);
            return;
        }

        PyObject value = null;
        if (data.__findattr__("__iter__") != null) {
            PyObject iter = data.__iter__();
            while ((value = iter.__iternext__()) != null) {
                try {
                    this._set.add(value);
                } catch (PyException e) {
                    PyObject immutable = this.asImmutable(e, value);
                    this._set.add(immutable);
                }
            }
        } else {
            int i = 0;
            while(true) {
                try {
                    value = data.__finditem__(i++);
                    if (value == null) {
                        break;
                    }
                } catch (PyException e) {
                    if(Py.matchException(e, Py.AttributeError)) {
                        throw Py.TypeError("object not iterable");
                    }
                    throw e;
                }
                try {
                    this._set.add(value);
                } catch (PyException e) {
                    PyObject immutable = this.asImmutable(e, value);
                    this._set.add(immutable);
                }
            }
        }
    }

    /**
     * The union of this with other.
     * 

*
* (I.e. all elements that are in either set) * * @param other A BaseSet instance. * @return The union of the two sets as a new set. */ public PyObject __or__(PyObject other) { return baseset___or__(other); } final PyObject baseset___or__(PyObject other) { if (!(other instanceof BaseSet)) { throw Py.TypeError("Not Implemented"); } return baseset_union(other); } /** * The intersection of the this with other. *

*
* (I.e. all elements that are in both sets) * * @param other A BaseSet instance. * @return The intersection of the two sets as a new set. */ public PyObject __and__(PyObject other) { return baseset___and__(other); } final PyObject baseset___and__(PyObject other) { if (!(other instanceof BaseSet)) { throw Py.TypeError("Not Implemented"); } return baseset_intersection(other); } /** * The difference of the this with other. *

*
* (I.e. all elements that are in this set and not in the other) * * @param other A BaseSet instance. * @return The difference of the two sets as a new set. */ public PyObject __sub__(PyObject other) { return baseset___sub__(other); } final PyObject baseset___sub__(PyObject other) { if (!(other instanceof BaseSet)) { throw Py.TypeError("Not Implemented"); } return difference(other); } public PyObject difference(PyObject other) { return baseset_difference(other); } final PyObject baseset_difference(PyObject other) { BaseSet iterable = (other instanceof BaseSet) ? (BaseSet) other : new PySet(other); Set set = iterable._set; BaseSet o = (BaseSet) this.getType().__call__(); for (Iterator i = this._set.iterator(); i.hasNext();) { Object p = i.next(); if (!set.contains(p)) { o._set.add(p); } } return o; } /** * The symmetric difference of the this with other. *

*
* (I.e. all elements that are in exactly one of the sets) * * @param other A BaseSet instance. * @return The symmetric difference of the two sets as a new set. */ public PyObject __xor__(PyObject other) { return baseset___xor__(other); } final PyObject baseset___xor__(PyObject other) { if (!(other instanceof BaseSet)) { throw Py.TypeError("Not Implemented"); } return symmetric_difference(other); } public PyObject symmetric_difference(PyObject other) { return baseset_symmetric_difference(other); } public PyObject baseset_symmetric_difference(PyObject other) { BaseSet iterable = (other instanceof BaseSet) ? (BaseSet) other : new PySet(other); BaseSet o = (BaseSet) this.getType().__call__(); for (Iterator i = this._set.iterator(); i.hasNext();) { Object p = i.next(); if (!iterable._set.contains(p)) { o._set.add(p); } } for (Iterator i = iterable._set.iterator(); i.hasNext();) { Object p = i.next(); if (!this._set.contains(p)) { o._set.add(p); } } return o; } /** * The hashCode of the set. Only immutable instances can be hashed. * * @return The hashCode of the set. */ public abstract int hashCode(); /** * The length of the set. * * @return The length of the set. */ public int __len__() { return baseset___len__(); } final int baseset___len__() { return this._set.size(); } /** * Determines if the instance is considered true by Python. * This implementation returns true if the set is not empty. * * @return true if the set is not empty, false otherwise */ public boolean __nonzero__() { return baseset___nonzero__(); } final boolean baseset___nonzero__() { return !this._set.isEmpty(); } /** * Produce an iterable object. * * @return An iteration of the set. */ public PyObject __iter__() { return new PySetIterator(this._set); } public boolean __contains__(PyObject other) { return baseset___contains__(other); } final boolean baseset___contains__(PyObject other) { return this._set.contains(other); } public PyObject __eq__(PyObject other) { return baseset___eq__(other); } final PyObject baseset___eq__(PyObject other) { if(other instanceof BaseSet) { BaseSet bs = this._binary_sanity_check(other); return Py.newBoolean(this._set.equals(bs._set)); } return Py.Zero; } public PyObject __ne__(PyObject other) { return baseset___ne__(other); } final PyObject baseset___ne__(PyObject other) { if(other instanceof BaseSet) { BaseSet bs = this._binary_sanity_check(other); return Py.newBoolean(!this._set.equals(bs._set)); } return Py.One; } public PyObject __le__(PyObject other) { return baseset___le__(other); } final PyObject baseset___le__(PyObject other) { return this.baseset_issubset(other); } public PyObject __ge__(PyObject other) { return baseset___ge__(other); } final PyObject baseset___ge__(PyObject other) { return this.baseset_issuperset(other); } public PyObject __lt__(PyObject other) { return baseset___lt__(other); } final PyObject baseset___lt__(PyObject other) { BaseSet bs = this._binary_sanity_check(other); return Py.newBoolean(this.__len__() < bs.__len__() && this.baseset_issubset(other).__nonzero__()); } public PyObject __gt__(PyObject other) { return baseset___gt__(other); } public PyObject baseset___gt__(PyObject other) { BaseSet bs = this._binary_sanity_check(other); return Py.newBoolean(this.__len__() > bs.__len__() && this.baseset_issuperset(other).__nonzero__()); } /** * Used for pickling. Uses the module setsfactory to * export safe constructors. * * @return a tuple of (constructor, (elements)) */ public PyObject __reduce__() { return baseset___reduce__(); } final PyObject baseset___reduce__(){ String name = getType().getFullName(); PyObject factory = __builtin__.__import__("setsfactory"); PyObject func = factory.__getattr__(name); return new PyTuple(new PyObject[]{ func, new PyTuple(new PyObject[]{ new PyList((PyObject)this) }) }); } public PyObject __deepcopy__(PyObject memo) { return baseset___deepcopy__(memo); } final PyObject baseset___deepcopy__(PyObject memo) { PyObject copy = __builtin__.__import__("copy"); PyObject deepcopy = copy.__getattr__("deepcopy"); BaseSet result = (BaseSet) this.getType().__call__(); memo.__setitem__(Py.newInteger(Py.id(this)), result); for (Iterator iterator = this._set.iterator(); iterator.hasNext();) { result._set.add(deepcopy.__call__(Py.java2py(iterator.next()), memo)); } return result; } /** * Return this instance as a Java object. Only coerces to Collection and subinterfaces. * * @param c The Class to coerce to. * @return the underlying HashSet (not a copy) */ public Object __tojava__(Class c) { if (Collection.class.isAssignableFrom(c)) { return Collections.unmodifiableSet(this._set); } return super.__tojava__(c); } public PyObject baseset_union(PyObject other) { BaseSet result = (BaseSet) this.getType().__call__(this); result._update(other); return result; } public PyObject baseset_intersection(PyObject other) { PyObject little, big; if(!(other instanceof BaseSet)) { other = new PySet(other); } if (this.__len__() <= __builtin__.len(other)) { little = this; big = other; } else { little = other; big = this; } PyObject common = __builtin__.filter(big.__getattr__("__contains__"), little); return other.getType().__call__(common); } public PyObject baseset_copy() { BaseSet copy = (BaseSet) this.getType().__call__(); copy._set = (HashSet) this._set.clone(); return copy; } public PyObject baseset_issubset(PyObject other) { BaseSet bs = this._binary_sanity_check(other); if (this.__len__() > bs.__len__()) { return Py.Zero; } for (Iterator iterator = this._set.iterator(); iterator.hasNext();) { if (!bs._set.contains(iterator.next())) { return Py.Zero; } } return Py.One; } public PyObject baseset_issuperset(PyObject other) { BaseSet bs = this._binary_sanity_check(other); if (this.__len__() < bs.__len__()) { return Py.Zero; } for (Iterator iterator = bs._set.iterator(); iterator.hasNext();) { if (!this._set.contains(iterator.next())) { return Py.Zero; } } return Py.One; } final String baseset_toString() { return toString(); } public String toString() { String name = getType().getFullName(); StringBuffer buf = new StringBuffer(name).append("(["); for (Iterator i = this._set.iterator(); i.hasNext();) { buf.append(((PyObject) i.next()).__repr__().toString()); if (i.hasNext()) { buf.append(", "); } } buf.append("])"); return buf.toString(); } protected final BaseSet _binary_sanity_check(PyObject other) throws PyIgnoreMethodTag { try { return (BaseSet) other; } catch (ClassCastException e) { throw Py.TypeError("Binary operation only permitted between sets"); } } /** * If the exception e is a TypeError, attempt to convert * the object value into an ImmutableSet. * * @param e The exception thrown from a hashable operation. * @param value The object which was unhashable. * @return An ImmutableSet if available, a TypeError is thrown otherwise. */ protected final PyObject asImmutable(PyException e, PyObject value) { if (Py.matchException(e, Py.TypeError)) { PyObject transform = value.__findattr__("_as_immutable"); if (transform != null) { return transform.__call__(); } } throw e; } // public int size() { // return this._set.size(); // } // // public void clear() { // this._set.clear(); // } // // public boolean isEmpty() { // return this._set.isEmpty(); // } // // public Object[] toArray() { // return this._set.toArray(); // } // // public boolean add(Object o) { // return this._set.add(o); // } // // public boolean contains(Object o) { // return this._set.contains(o); // } // // public boolean remove(Object o) { // return this._set.remove(o); // } // // public boolean addAll(Collection c) { // return this._set.addAll(c); // } // // public boolean containsAll(Collection c) { // return this._set.containsAll(c); // } // // public boolean removeAll(Collection c) { // return this._set.removeAll(c); // } // // public boolean retainAll(Collection c) { // return this._set.retainAll(c); // } // // public Iterator iterator() { // return this._set.iterator(); // } // // public Object[] toArray(Object a[]) { // return this._set.toArray(a); // } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy