soot
Class PatchingChain<E extends Unit>

java.lang.Object
  extended by java.util.AbstractCollection<E>
      extended by soot.PatchingChain<E>
All Implemented Interfaces:
Serializable, Iterable<E>, Collection<E>, Chain<E>
Direct Known Subclasses:
SPatchingChain

public class PatchingChain<E extends Unit>
extends AbstractCollection<E>
implements Chain<E>

An implementation of a Chain which can contain only Units, and handles patching to deal with element insertions and removals. This is done by calling Unit.redirectJumpsToThisTo at strategic times.

See Also:
Serialized Form

Nested Class Summary
protected  class PatchingChain.PatchingIterator
           
 
Field Summary
protected  Chain<E> innerChain
           
 
Constructor Summary
PatchingChain(Chain<E> aChain)
          Constructs a PatchingChain from the given Chain.
 
Method Summary
 boolean add(E o)
          Adds the given object to this Chain.
 void addFirst(E u)
          Adds the given object at the beginning of the Chain.
 void addLast(E u)
          Adds the given object at the end of the Chain.
 boolean contains(Object u)
          Returns true if this patching chain contains the specified element.
 boolean follows(E a, E b)
          Returns true if object a follows object b in the Chain.
 E getFirst()
          Returns the first object in this Chain.
 E getLast()
          Returns the last object in this Chain.
 Chain<E> getNonPatchingChain()
          Returns the inner chain used by the PatchingChain.
 E getPredOf(E point)
          Returns the object immediately preceding point.
 E getSuccOf(E point)
          Returns the object immediately following point.
 void insertAfter(Chain<E> toInsert, E point)
          Inserts toInsert in the Chain after point.
 void insertAfter(E toInsert, E point)
          Inserts toInsert in the Chain after point.
 void insertAfter(List<E> toInsert, E point)
          Inserts toInsert in the Chain after point.
 void insertBefore(Chain<E> toInsert, E point)
          Inserts toInsert in the Chain before point.
 void insertBefore(E toInsert, E point)
          Inserts toInsert in the Chain before point.
 void insertBefore(List<E> toInsert, E point)
          Inserts toInsert in the Chain before point.
 void insertBeforeNoRedirect(E toInsert, E point)
          Inserts toInsert in the Chain before point WITHOUT redirecting jumps.
 Iterator<E> iterator()
          Returns an iterator over this Chain.
 Iterator<E> iterator(E u)
          Returns an iterator over this Chain, starting at the given object.
 Iterator<E> iterator(E head, E tail)
          Returns an iterator over this Chain, starting at head and reaching tail (inclusive).
 boolean remove(Object obj)
          Removes the given object from this Chain.
 void removeFirst()
          Removes the first object from this Chain.
 void removeLast()
          Removes the last object from this Chain.
 int size()
          Returns the size of this Chain.
 Iterator<E> snapshotIterator()
          Returns an iterator over a copy of this chain.
 void swapWith(E out, E in)
          Replaces out in the Chain by in.
 
Methods inherited from class java.util.AbstractCollection
addAll, clear, containsAll, isEmpty, removeAll, retainAll, toArray, toArray, toString
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface java.util.Collection
addAll, clear, containsAll, equals, hashCode, isEmpty, removeAll, retainAll, toArray, toArray
 

Field Detail

innerChain

protected Chain<E extends Unit> innerChain
Constructor Detail

PatchingChain

public PatchingChain(Chain<E> aChain)
Constructs a PatchingChain from the given Chain.

Method Detail

getNonPatchingChain

public Chain<E> getNonPatchingChain()
Returns the inner chain used by the PatchingChain. In general, this should not be used. However, direct access to the inner chain may be necessary if you wish to perform certain operations (such as control-flow manipulations) without interference from the patching algorithms.


add

public boolean add(E o)
Adds the given object to this Chain.

Specified by:
add in interface Collection<E extends Unit>
Overrides:
add in class AbstractCollection<E extends Unit>

swapWith

public void swapWith(E out,
                     E in)
Replaces out in the Chain by in.

Specified by:
swapWith in interface Chain<E extends Unit>

insertAfter

public void insertAfter(E toInsert,
                        E point)
Inserts toInsert in the Chain after point.

Specified by:
insertAfter in interface Chain<E extends Unit>

insertAfter

public void insertAfter(List<E> toInsert,
                        E point)
Inserts toInsert in the Chain after point.

Specified by:
insertAfter in interface Chain<E extends Unit>

insertAfter

public void insertAfter(Chain<E> toInsert,
                        E point)
Description copied from interface: Chain
Inserts toInsert in the Chain after point. (It would probably be better to make Chain implement List)

Specified by:
insertAfter in interface Chain<E extends Unit>

insertBefore

public void insertBefore(List<E> toInsert,
                         E point)
Inserts toInsert in the Chain before point.

Specified by:
insertBefore in interface Chain<E extends Unit>

insertBefore

public void insertBefore(Chain<E> toInsert,
                         E point)
Inserts toInsert in the Chain before point.

Specified by:
insertBefore in interface Chain<E extends Unit>

insertBefore

public void insertBefore(E toInsert,
                         E point)
Inserts toInsert in the Chain before point.

Specified by:
insertBefore in interface Chain<E extends Unit>

insertBeforeNoRedirect

public void insertBeforeNoRedirect(E toInsert,
                                   E point)
Inserts toInsert in the Chain before point WITHOUT redirecting jumps.


follows

public boolean follows(E a,
                       E b)
Returns true if object a follows object b in the Chain.

Specified by:
follows in interface Chain<E extends Unit>

remove

public boolean remove(Object obj)
Removes the given object from this Chain.

Specified by:
remove in interface Collection<E extends Unit>
Specified by:
remove in interface Chain<E extends Unit>
Overrides:
remove in class AbstractCollection<E extends Unit>

contains

public boolean contains(Object u)
Returns true if this patching chain contains the specified element.

Specified by:
contains in interface Collection<E extends Unit>
Overrides:
contains in class AbstractCollection<E extends Unit>

addFirst

public void addFirst(E u)
Adds the given object at the beginning of the Chain.

Specified by:
addFirst in interface Chain<E extends Unit>

addLast

public void addLast(E u)
Adds the given object at the end of the Chain.

Specified by:
addLast in interface Chain<E extends Unit>

removeFirst

public void removeFirst()
Removes the first object from this Chain.

Specified by:
removeFirst in interface Chain<E extends Unit>

removeLast

public void removeLast()
Removes the last object from this Chain.

Specified by:
removeLast in interface Chain<E extends Unit>

getFirst

public E getFirst()
Returns the first object in this Chain.

Specified by:
getFirst in interface Chain<E extends Unit>

getLast

public E getLast()
Returns the last object in this Chain.

Specified by:
getLast in interface Chain<E extends Unit>

getSuccOf

public E getSuccOf(E point)
Returns the object immediately following point.

Specified by:
getSuccOf in interface Chain<E extends Unit>

getPredOf

public E getPredOf(E point)
Returns the object immediately preceding point.

Specified by:
getPredOf in interface Chain<E extends Unit>

snapshotIterator

public Iterator<E> snapshotIterator()
Returns an iterator over a copy of this chain. This avoids ConcurrentModificationExceptions from being thrown if the underlying Chain is modified during iteration. Do not use this to remove elements which have not yet been iterated over!

Specified by:
snapshotIterator in interface Chain<E extends Unit>

iterator

public Iterator<E> iterator()
Returns an iterator over this Chain.

Specified by:
iterator in interface Iterable<E extends Unit>
Specified by:
iterator in interface Collection<E extends Unit>
Specified by:
iterator in interface Chain<E extends Unit>
Specified by:
iterator in class AbstractCollection<E extends Unit>

iterator

public Iterator<E> iterator(E u)
Returns an iterator over this Chain, starting at the given object.

Specified by:
iterator in interface Chain<E extends Unit>

iterator

public Iterator<E> iterator(E head,
                            E tail)
Returns an iterator over this Chain, starting at head and reaching tail (inclusive).

Specified by:
iterator in interface Chain<E extends Unit>

size

public int size()
Returns the size of this Chain.

Specified by:
size in interface Collection<E extends Unit>
Specified by:
size in interface Chain<E extends Unit>
Specified by:
size in class AbstractCollection<E extends Unit>