+// Copyright 2006-2007 all rights reserved; see LICENSE file for BSD-style license
+
package edu.berkeley.sbp.util;
import edu.berkeley.sbp.util.*;
import edu.berkeley.sbp.*;
//
/** a mapping from topologies over <tt>K</tt> to <i>sets of</i> values of type <tt>V</tt> */
-public class TopologicalBag<K,V> implements MapBag<Topology<K>,V>, VisitableMap<K,V> {
+public class TopologicalBag<K,V> implements MapBag<Topology<K>,V>, VisitableMap<K,V>, Serializable {
// CRUCIAL INVARIANT: keys in this hashmap MUST be disjoint or the universe will implode
private final HashMap<Topology<K>,HashSet<V>> h = new HashMap<Topology<K>,HashSet<V>>();
private HashMap<K,Iterable<V>> cache = new HashMap<K,Iterable<V>>();
public Iterable<V> getAll(Topology<K> k) { return h.get(k); }
- public <B,C> void invoke(K k, Invokable<V,B,C> ivbc, B b, C c) {
+ public <B> void invoke(K k, Invokable<V,B> ivbc, B b) {
for(Topology<K> t : h.keySet())
if (t.contains(k))
for(V v : h.get(t))
- ivbc.invoke(v, b, c);
+ ivbc.invoke(v, b);
}
public Iterable<V> get(K k) {
}
}
- public VisitableMap<K,V> optimize() {
+ public VisitableMap<K,V> optimize(final Functor<K,Integer> f) {
ArrayList<Long> min_ = new ArrayList<Long>();
ArrayList<Long> max_ = new ArrayList<Long>();
ArrayList<Object[]> v_ = new ArrayList<Object[]>();
final Object[][] v = new Object[size][]; v_.toArray(v);
return new VisitableMap<K,V>() {
public boolean contains(K k) {
- IntegerMappable im = (IntegerMappable)k;
- int asint = im.toInt();
+ int asint = f.invoke(k);
for(int i=0; i<size; i++)
if (min[i] <= asint && max[i] >= asint && v[i].length > 0)
return true;
return false;
}
- public <B,C> void invoke(K k, Invokable<V,B,C> ivbc, B b, C c) {
- IntegerMappable im = (IntegerMappable)k;
- int asint = im.toInt();
+ public <B> void invoke(K k, Invokable<V,B> ivbc, B b) {
+ int asint = f.invoke(k);
for(int i=0; i<size; i++) {
if (min[i] <= asint && max[i] >= asint) {
Object[] arr = v[i];
for(int j=0; j<arr.length; j++)
- ivbc.invoke((V)arr[j], b, c);
+ ivbc.invoke((V)arr[j], b);
}
}
}