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

org.aksw.commons.collection.rangeset.AsRangesBase Maven / Gradle / Ivy

There is a newer version: 0.9.9
Show newest version
package org.aksw.commons.collection.rangeset;

import java.util.AbstractSet;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;

import com.google.common.collect.AbstractIterator;
import com.google.common.collect.Iterators;
import com.google.common.collect.Range;

public class AsRangesBase>
    extends AbstractSet> {

    protected Set> aset;
    protected Set> bset;
    protected Comparator> endpointComparator;

    public AsRangesBase(
            Set> aset,
            Set> bset,
            Comparator> endpointComparator) {
        this.aset = aset;
        this.bset = bset;
        this.endpointComparator = endpointComparator;
    }

//		@Override
//		public boolean contains(Object o) {
//			boolean r;
//			if (o instanceof Range) {
//				Range range = (Range)o;
//				first.
//
//
//			} else {
//				r = false;
//			}
//
//			return result;
//		}

    @Override
    public Iterator> iterator() {
        return new AbstractIterator>() {

            Iterator> ait = aset.iterator();
            Iterator> bit = bset.iterator();

            Range a = ait.hasNext() ? ait.next() : null;
            Range b = bit.hasNext() ? bit.next() : null;

            // Take and merge ranges from ait and bit as long as they are connected
            @Override
            protected Range computeNext() {
                Range r = null;

                loop: while (true) {
                    // Find out whether a or b has the 'lower' lower-endpoint (or higher upper w.r.t. the comparator); -2 means both are null
                    int c = a != null
                            ? (b != null ? endpointComparator.compare(a, b) : -1)
                            : (b != null ? 1 : -2);

                    switch (c) {
                    case -1:
                    case 0:
                        if (r == null) {
                            r = a;
                            a = ait.hasNext() ? ait.next() : null;
                        } else if (r.isConnected(a)) {
                            r = r.span(a);
                            a = ait.hasNext() ? ait.next() : null;
                        } else {
                            break loop;
                        }
                        break;
                    case 1:
                        if (r == null) {
                            r = b;
                            b = bit.hasNext() ? bit.next() : null;
                        } else if (r.isConnected(b)) {
                            r = r.span(b);
                            b = bit.hasNext() ? bit.next() : null;
                        } else {
                            break loop;
                        }
                        break;
                    case -2:
                        break loop;
                    default:
                        throw new RuntimeException("Should not happen");
                    }
                }

                if (r == null) {
                    r = endOfData();
                }
                return r;
            }
        };
    }

    @Override
    public int size() {
        return Iterators.size(iterator());
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy