optimizations to IntPairMap.java
[sbp.git] / src / edu / berkeley / sbp / util / TopologicalBag.java
index 9a18eef..28166fb 100644 (file)
@@ -1,3 +1,5 @@
+// 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.*;
@@ -12,7 +14,7 @@ import java.lang.ref.*;
 //
 
 /** 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>>();
@@ -135,7 +137,7 @@ public class TopologicalBag<K,V> implements MapBag<Topology<K>,V>, VisitableMap<
         }
     }
 
-    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[]>();
@@ -157,16 +159,14 @@ public class TopologicalBag<K,V> implements MapBag<Topology<K>,V>, VisitableMap<
         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();
+                int asint = f.invoke(k);
                 for(int i=0; i<size; i++) {
                     if (min[i] <= asint && max[i] >= asint) {
                         Object[] arr = v[i];