Package ghidra.graph

# Class MutableGDirectedGraphWrapper<V,E extends GEdge<V>>

java.lang.Object
ghidra.graph.MutableGDirectedGraphWrapper<V,E>

Type Parameters:
  `V` - the vertex type
  `E` - the edge type

All Implemented Interfaces:
  `GDirectedGraph<V,E>`, `GImplicitDirectedGraph<V,E>`

public class MutableGDirectedGraphWrapper<V,E extends GEdge<V>> extends Object implements GDirectedGraph<V,E>
A class that can wrap a `GDirectedGraph` and allows for vertex and edge additions without changing the underlying graph.

Warning: As mentioned above, this graph is meant for additive operations. In its current form, removal operations will not work. To facilitate removals, this class will have to be updated to track removed vertices and edges, using them to correctly report the state of the graph for methods like `containsVertex(Object)` and `containsEdge(GEdge)`.

Implementation Note: there is some 'magic' in this class to add 'dummy' vertices to the graph. To facilitate this, the mutated graph in this class does not have the `V` type, but rather is typed on Object. This means that this class can only be used generically, with templated types (like by algorithms and such). Any usage of this class that expects concrete implementations to be returned can trigger ClassCastExceptions.

- ## Nested Class Summary

  Nested Classes
  Modifier and Type
  Class
  Description
  `static class`
  `MutableGDirectedGraphWrapper.DummyEdge`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `MutableGDirectedGraphWrapper(GDirectedGraph<V,E> delegate)`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `E`
  `addDummyEdge(V start, V end)`
  `V`
  `addDummyVertex(String name)`
  `void`
  `addEdge(E e)`
  Add an edge
  `boolean`
  `addVertex(V v)`
  Add a vertex
  `boolean`
  `containsEdge(E e)`
  Test if the graph contains a given edge
  `boolean`
  `containsEdge(V from, V to)`
  Test if the graph contains an edge from one given vertex to another
  `boolean`
  `containsVertex(V v)`
  Test if the graph contains a given vertex
  `GDirectedGraph<V,E>`
  `copy()`
  Copy this graph.
  `GDirectedGraph<V,E>`
  `emptyCopy()`
  Creates a new instance of this graph with no vertices or edges.
  `E`
  `findEdge(V start, V end)`
  Locates the edge object for the two vertices
  `int`
  `getEdgeCount()`
  Count the number of edges in the graph
  `Collection<E>`
  `getEdges()`
  Retrieve all the edges
  `Collection<E>`
  `getInEdges(V v)`
  Compute the incident edges that end at the given vertex
  `Collection<E>`
  `getOutEdges(V v)`
  Compute the incident edges that start at the given vertex
  `Collection<V>`
  `getPredecessors(V v)`
  Compute a vertex's predecessors
  `Collection<V>`
  `getSuccessors(V v)`
  Compute a vertex's successors
  `int`
  `getVertexCount()`
  Count the number of vertices in the graph
  `Collection<V>`
  `getVertices()`
  Retrieve all the vertices
  `boolean`
  `isDummy(E e)`
  `boolean`
  `isDummy(V v)`
  `boolean`
  `isEmpty()`
  Test if the graph is empty, i.e., contains no vertices or edges
  `boolean`
  `removeEdge(E e)`
  Removes an edge
  `void`
  `removeEdges(Iterable<E> edges)`
  Removes the given edges from the graph
  `boolean`
  `removeVertex(V v)`
  Remove a vertex
  `void`
  `removeVertices(Iterable<V> vertices)`
  Removes the given vertices from the graph

  ### Methods inherited from class java.lang.Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

  ### Methods inherited from interface ghidra.graph.GDirectedGraph

  `getIncidentEdges`

- ## Constructor Details

  - ### MutableGDirectedGraphWrapper

    public MutableGDirectedGraphWrapper(GDirectedGraph<V,E> delegate)

- ## Method Details

  - ### addDummyVertex

    public V addDummyVertex(String name)

  - ### isDummy

    public boolean isDummy(V v)

  - ### isDummy

    public boolean isDummy(E e)

  - ### addDummyEdge

    public E addDummyEdge(V start, V end)

  - ### addVertex

    public boolean addVertex(V v)
    Description copied from interface: `GDirectedGraph`
    Add a vertex
    Specified by:
      `addVertex` in interface `GDirectedGraph<V,E extends GEdge<V>>`
    Parameters:
      `v` - the vertex
    Returns:
      true if the add was successful, false otherwise

  - ### removeVertex

    public boolean removeVertex(V v)
    Description copied from interface: `GDirectedGraph`
    Remove a vertex
    Specified by:
      `removeVertex` in interface `GDirectedGraph<V,E extends GEdge<V>>`
    Parameters:
      `v` - the vertex
    Returns:
      true

  - ### removeVertices

    public void removeVertices(Iterable<V> vertices)
    Description copied from interface: `GDirectedGraph`
    Removes the given vertices from the graph
    Specified by:
      `removeVertices` in interface `GDirectedGraph<V,E extends GEdge<V>>`
    Parameters:
      `vertices` - the vertices to remove

  - ### removeEdges

    public void removeEdges(Iterable<E> edges)
    Description copied from interface: `GDirectedGraph`
    Removes the given edges from the graph
    Specified by:
      `removeEdges` in interface `GDirectedGraph<V,E extends GEdge<V>>`
    Parameters:
      `edges` - the edges to remove

  - ### addEdge

    public void addEdge(E e)
    Description copied from interface: `GDirectedGraph`
    Add an edge
    Specified by:
      `addEdge` in interface `GDirectedGraph<V,E extends GEdge<V>>`
    Parameters:
      `e` - the edge

  - ### removeEdge

    public boolean removeEdge(E e)
    Description copied from interface: `GDirectedGraph`
    Removes an edge
    Specified by:
      `removeEdge` in interface `GDirectedGraph<V,E extends GEdge<V>>`
    Parameters:
      `e` - the edge
    Returns:
      true if the graph contained the given edge

  - ### getVertices

    public Collection<V> getVertices()
    Description copied from interface: `GDirectedGraph`
    Retrieve all the vertices
    Specified by:
      `getVertices` in interface `GDirectedGraph<V,E extends GEdge<V>>`
    Returns:
      the vertices

  - ### getEdges

    public Collection<E> getEdges()
    Description copied from interface: `GDirectedGraph`
    Retrieve all the edges
    Specified by:
      `getEdges` in interface `GDirectedGraph<V,E extends GEdge<V>>`
    Returns:
      the edges

  - ### containsVertex

    public boolean containsVertex(V v)
    Description copied from interface: `GDirectedGraph`
    Test if the graph contains a given vertex
    Specified by:
      `containsVertex` in interface `GDirectedGraph<V,E extends GEdge<V>>`
    Parameters:
      `v` - the vertex
    Returns:
      true if the vertex is in the graph, or false

  - ### containsEdge

    public boolean containsEdge(E e)
    Description copied from interface: `GDirectedGraph`
    Test if the graph contains a given edge
    Specified by:
      `containsEdge` in interface `GDirectedGraph<V,E extends GEdge<V>>`
    Parameters:
      `e` - the ege
    Returns:
      true if the edge is in the graph, or false

  - ### containsEdge

    public boolean containsEdge(V from, V to)
    Description copied from interface: `GDirectedGraph`
    Test if the graph contains an edge from one given vertex to another
    Specified by:
      `containsEdge` in interface `GDirectedGraph<V,E extends GEdge<V>>`
    Parameters:
      `from` - the source vertex
      `to` - the destination vertex
    Returns:
      true if such an edge exists, or false

  - ### findEdge

    public E findEdge(V start, V end)
    Description copied from interface: `GDirectedGraph`
    Locates the edge object for the two vertices
    Specified by:
      `findEdge` in interface `GDirectedGraph<V,E extends GEdge<V>>`
    Parameters:
      `start` - the start vertex
      `end` - the end vertex
    Returns:
      the edge

  - ### isEmpty

    public boolean isEmpty()
    Description copied from interface: `GDirectedGraph`
    Test if the graph is empty, i.e., contains no vertices or edges
    Specified by:
      `isEmpty` in interface `GDirectedGraph<V,E extends GEdge<V>>`
    Returns:
      true if the graph is empty, or false

  - ### getVertexCount

    public int getVertexCount()
    Description copied from interface: `GDirectedGraph`
    Count the number of vertices in the graph
    Specified by:
      `getVertexCount` in interface `GDirectedGraph<V,E extends GEdge<V>>`
    Returns:
      the count

  - ### getEdgeCount

    public int getEdgeCount()
    Description copied from interface: `GDirectedGraph`
    Count the number of edges in the graph
    Specified by:
      `getEdgeCount` in interface `GDirectedGraph<V,E extends GEdge<V>>`
    Returns:
      the count

  - ### getInEdges

    public Collection<E> getInEdges(V v)
    Description copied from interface: `GDirectedGraph`
    Compute the incident edges that end at the given vertex
    Specified by:
      `getInEdges` in interface `GDirectedGraph<V,E extends GEdge<V>>`
    Specified by:
      `getInEdges` in interface `GImplicitDirectedGraph<V,E extends GEdge<V>>`
    Parameters:
      `v` - the destination vertex
    Returns:
      the in-edges to the given vertex

  - ### getOutEdges

    public Collection<E> getOutEdges(V v)
    Description copied from interface: `GDirectedGraph`
    Compute the incident edges that start at the given vertex
    Specified by:
      `getOutEdges` in interface `GDirectedGraph<V,E extends GEdge<V>>`
    Specified by:
      `getOutEdges` in interface `GImplicitDirectedGraph<V,E extends GEdge<V>>`
    Parameters:
      `v` - the source vertex
    Returns:
      the out-edges from the given vertex

  - ### getPredecessors

    public Collection<V> getPredecessors(V v)
    Description copied from interface: `GDirectedGraph`
    Compute a vertex's predecessors

    The default implementation computes this from the in-edges

    Specified by:
      `getPredecessors` in interface `GDirectedGraph<V,E extends GEdge<V>>`
    Specified by:
      `getPredecessors` in interface `GImplicitDirectedGraph<V,E extends GEdge<V>>`
    Parameters:
      `v` - the destination vertex
    Returns:
      the predecessors

  - ### getSuccessors

    public Collection<V> getSuccessors(V v)
    Description copied from interface: `GDirectedGraph`
    Compute a vertex's successors

    The default implementation compute this from the out-edges

    Specified by:
      `getSuccessors` in interface `GDirectedGraph<V,E extends GEdge<V>>`
    Specified by:
      `getSuccessors` in interface `GImplicitDirectedGraph<V,E extends GEdge<V>>`
    Parameters:
      `v` - the source vertex
    Returns:
      the successors

  - ### copy

    public GDirectedGraph<V,E> copy()
    Description copied from interface: `GDirectedGraph`
    Copy this graph.

    Note: the vertices and edges in the copy may be the same instances in the new graph and not themselves copies.

    Specified by:
      `copy` in interface `GDirectedGraph<V,E extends GEdge<V>>`
    Specified by:
      `copy` in interface `GImplicitDirectedGraph<V,E extends GEdge<V>>`
    Returns:
      the new copy

  - ### emptyCopy

    public GDirectedGraph<V,E> emptyCopy()
    Description copied from interface: `GDirectedGraph`
    Creates a new instance of this graph with no vertices or edges. This is useful when you wish to build a new graph using the same type as this graph.
    Specified by:
      `emptyCopy` in interface `GDirectedGraph<V,E extends GEdge<V>>`
    Returns:
      the new copy