/** * Switch backing implementation from a SmallMap to a HashMap */ private void transferBackingStore() { assert backingStore instanceof SmallMap; SmallMap<K, V> S = (SmallMap<K, V>) backingStore; backingStore = HashMapFactory.make(2 * S.size()); for (Entry<K, V> entry : S.entrySet()) { backingStore.put(entry.getKey(), entry.getValue()); } }
@Override @SuppressWarnings({ "unchecked", "unused" }) public V put(Object key, Object value) { if (key == null) { throw new IllegalArgumentException("null key"); } for (int i = 0; i < size(); i++) { if (keysAndValues[i] != null && keysAndValues[i].equals(key)) { V result = (V) keysAndValues[size() + i]; keysAndValues[size() + i] = value; return result; } } if (DEBUG_USAGE && size() >= DEBUG_MAX_SIZE) { Assertions.UNREACHABLE("too many elements in a SmallMap"); } growByOne(); keysAndValues[size() - 1] = key; keysAndValues[keysAndValues.length - 1] = value; return null; }
@Override @SuppressWarnings("unchecked") public Iterator<AbstractStatement> getStatementsThatUse(PointsToSetVariable v) { if (v == null) { throw new IllegalArgumentException("v is null"); } int number = v.getGraphNodeId(); if (number == -1) { return EmptyIterator.instance(); } Iterator<INodeWithNumber> result = delegateGraph.getSuccNodes(v); for (int i = 0; i < invImplicitUnaryMap.size(); i++) { UnaryOperator op = invImplicitUnaryMap.getKey(i); IBinaryNaturalRelation R = invImplicitUnaryMap.getValue(i); IntSet s = R.getRelated(number); if (s != null) { result = new CompoundIterator<>(new ImplicitUseIterator(op, v, s), result); } } List<AbstractStatement> list = new ArrayList<>(); while (result.hasNext()) { list.add((AbstractStatement) result.next()); } return list.iterator(); }
@Override public V put(K key, V value) { if (backingStore == null) { backingStore = new SmallMap<>(); backingStore.put(key, value); return null; } else { if (backingStore instanceof SmallMap) { V result = backingStore.put(key, value); if (backingStore.size() > cutOff) { transferBackingStore(); } return result; } else { return backingStore.put(key, value); } } }
@Test public void testSmallMap() { SmallMap<Integer, Integer> M = new SmallMap<>(); Integer I1 = Integer.valueOf(1); Integer I2 = Integer.valueOf(2); Integer I3 = Integer.valueOf(3); M.put(I1, I1); M.put(I2, I2); M.put(I3, I3); Integer I = M.get(Integer.valueOf(2)); Assert.assertTrue(I != null); Assert.assertTrue(I.equals(I2)); I = M.get(Integer.valueOf(4)); Assert.assertTrue(I == null); I = M.put(Integer.valueOf(2), Integer.valueOf(3)); Assert.assertTrue(I.equals(I2)); I = M.get(I2); Assert.assertTrue(I.equals(I3)); }
@Override protected V getItemInSlot(int slot) { return getValue(slot); } };
@Override protected K getItemInSlot(int slot) { return getKey(slot); } };
/** * advance to the next operator */ private void advanceOuter() { innerDelegate = null; while (outerKeyDelegate.hasNext()) { currentOperator = outerKeyDelegate.next(); IBinaryNaturalRelation R = implicitUnaryMap.get(currentOperator); Iterator<IntPair> it = R.iterator(); if (it.hasNext()) { innerDelegate = it; return; } } }
@Override public int getNumberOfStatementsThatDef(PointsToSetVariable v) { if (v == null) { throw new IllegalArgumentException("v is null"); } int number = v.getGraphNodeId(); if (number == -1) { return 0; } int result = delegateGraph.getPredNodeCount(v); for (IBinaryNaturalRelation R : implicitUnaryMap.values()) { IntSet s = R.getRelated(number); if (s != null) { result += s.size(); } } return result; }
@Override @SuppressWarnings("unchecked") public Iterator<AbstractStatement> getStatementsThatDef(PointsToSetVariable v) { if (v == null) { throw new IllegalArgumentException("v is null"); } int number = v.getGraphNodeId(); if (number == -1) { return EmptyIterator.instance(); } Iterator<INodeWithNumber> result = delegateGraph.getPredNodes(v); for (int i = 0; i < implicitUnaryMap.size(); i++) { UnaryOperator op = implicitUnaryMap.getKey(i); IBinaryNaturalRelation R = implicitUnaryMap.getValue(i); IntSet s = R.getRelated(number); if (s != null) { result = new CompoundIterator<>(new ImplicitDefIterator(op, s, v), result); } } List<AbstractStatement> list = new ArrayList<>(); while (result.hasNext()) { list.add((AbstractStatement) result.next()); } return list.iterator(); }
@Override public V put(K key, V value) { if (backingStore == null) { backingStore = new SmallMap<>(); backingStore.put(key, value); return null; } else { if (backingStore instanceof SmallMap) { V result = backingStore.put(key, value); if (backingStore.size() > cutOff) { transferBackingStore(); } return result; } else { return backingStore.put(key, value); } } }
@Override @SuppressWarnings({ "unchecked", "unused" }) public V put(Object key, Object value) { if (key == null) { throw new IllegalArgumentException("null key"); } for (int i = 0; i < size(); i++) { if (keysAndValues[i] != null && keysAndValues[i].equals(key)) { V result = (V) keysAndValues[size() + i]; keysAndValues[size() + i] = value; return result; } } if (DEBUG_USAGE && size() >= DEBUG_MAX_SIZE) { Assertions.UNREACHABLE("too many elements in a SmallMap"); } growByOne(); keysAndValues[size() - 1] = key; keysAndValues[keysAndValues.length - 1] = value; return null; }
@Override protected V getItemInSlot(int slot) { return getValue(slot); } };
@Override protected K getItemInSlot(int slot) { return getKey(slot); } };
/** * advance to the next operator */ private void advanceOuter() { innerDelegate = null; while (outerKeyDelegate.hasNext()) { currentOperator = outerKeyDelegate.next(); IBinaryNaturalRelation R = implicitUnaryMap.get(currentOperator); Iterator<IntPair> it = R.iterator(); if (it.hasNext()) { innerDelegate = it; return; } } }
@Override public int getNumberOfStatementsThatDef(PointsToSetVariable v) { if (v == null) { throw new IllegalArgumentException("v is null"); } int number = v.getGraphNodeId(); if (number == -1) { return 0; } int result = delegateGraph.getPredNodeCount(v); for (IBinaryNaturalRelation R : implicitUnaryMap.values()) { IntSet s = R.getRelated(number); if (s != null) { result += s.size(); } } return result; }
@Override @SuppressWarnings("unchecked") public Iterator<AbstractStatement> getStatementsThatDef(PointsToSetVariable v) { if (v == null) { throw new IllegalArgumentException("v is null"); } int number = v.getGraphNodeId(); if (number == -1) { return EmptyIterator.instance(); } Iterator<INodeWithNumber> result = delegateGraph.getPredNodes(v); for (int i = 0; i < implicitUnaryMap.size(); i++) { UnaryOperator op = implicitUnaryMap.getKey(i); IBinaryNaturalRelation R = implicitUnaryMap.getValue(i); IntSet s = R.getRelated(number); if (s != null) { result = new CompoundIterator<>(new ImplicitDefIterator(op, s, v), result); } } List<AbstractStatement> list = new ArrayList<>(); while (result.hasNext()) { list.add((AbstractStatement) result.next()); } return list.iterator(); }
@Override public V put(K key, V value) { if (backingStore == null) { backingStore = new SmallMap<>(); backingStore.put(key, value); return null; } else { if (backingStore instanceof SmallMap) { V result = backingStore.put(key, value); if (backingStore.size() > cutOff) { transferBackingStore(); } return result; } else { return backingStore.put(key, value); } } }