Package ghidra.app.util.viewer.util

# Class AddressIndexMap

java.lang.Object
ghidra.app.util.viewer.util.AddressIndexMap

Direct Known Subclasses:
  `AddressIndexMapConverter`

public class AddressIndexMap extends Object
This class maps a set of address ranges into a contiguous set of indexes from 0 to the total size of the address set. This is used primarily by the listing panel to simplify the display and scrolling logic. Because of the nature of the listing display, not all addresses have displayable content. For example, a closed data structure can consume thousands of addresses where only the first address has anything to display while the structure is closed. This can cause poor scrollbar behavior. To fix this, a new method `removeUnviewableAddressRanges(AddressSet)` was added that removes those ranges from the index mapping, but the original addresses are also maintained for purposes of determining "gap" addresses (an address is a gap address if the original address set does not include its immediate predecessor.) The original addresses are also used so that this index mapping can be reset and then given a different set of address ranges to remove as not viewable. (Useful for when data is open/closed or created/deleted)

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `static BigInteger`
  `DEFAULT_UNVIEWABLE_GAP_SIZE`
  `static BigInteger`
  `PERCENT_DIVIDER`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `AddressIndexMap()`
  Constructs an empty AddressIndexMap
  `AddressIndexMap(AddressSetView addrSet)`
  Constructs an AddressIndexMap for the given address set.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `Address`
  `getAddress(BigInteger index)`
  Returns the i'th address in the set.
  `AddressSet`
  `getAddressSet(FieldSelection sel)`
  Returns the Address set corresponding to the set of indexes
  `FieldSelection`
  `getFieldSelection(AddressSetView set)`
  Returns a FieldSelection containing the set of indexes represented by the given address set
  `BigInteger`
  `getIndex(Address addr)`
  Returns the index for the given address.
  `BigInteger`
  `getIndexAtOrAfter(Address addr)`
  Returns the index for the given address.
  `BigInteger`
  `getIndexCount()`
  Returns the total number of addresses
  `AddressSetView`
  `getIndexedAddressSet()`
  Returns the total set of addresses in this index mapping (not including those that have been closed)
  `BigInteger`
  `getMaxIndex(Address addr)`
  Returns the the maximum address for the range containing the given address.
  `BigInteger`
  `getMinIndex(Address addr)`
  Returns the the minimum address for the range containing the given address.
  `BigInteger`
  `getMiniumUnviewableGapSize()`
  Returns the suggested minimum size of address ranges that contain no viewable code units (i.e.
  `AddressSetView`
  `getOriginalAddressSet()`
  Returns the total set of addresses in this map include addresses that have been closed
  `boolean`
  `isGapAddress(Address address)`
  Returns true if the given address is the first address after gap of missing addresses.
  `boolean`
  `isGapIndex(BigInteger index)`
  Returns true if address of the given index is not the successor of the previous index's address.
  `void`
  `removeUnviewableAddressRanges(AddressSet addressSet)`
  Removes the given addresses from the set of addresses that get mapped into indexes.
  `AddressIndexMap`
  `reset()`
  Resets the mapping to the entire original address set.

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

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

- ## Field Details

  - ### PERCENT_DIVIDER

    public static BigInteger PERCENT_DIVIDER

  - ### DEFAULT_UNVIEWABLE_GAP_SIZE

    public static BigInteger DEFAULT_UNVIEWABLE_GAP_SIZE

- ## Constructor Details

  - ### AddressIndexMap

    public AddressIndexMap()
    Constructs an empty AddressIndexMap

  - ### AddressIndexMap

    public AddressIndexMap(AddressSetView addrSet)
    Constructs an AddressIndexMap for the given address set.
    Parameters:
      `addrSet` - the address set to index.

- ## Method Details

  - ### getIndexCount

    public BigInteger getIndexCount()
    Returns the total number of addresses
    Returns:
      the number of addresses in the view

  - ### isGapIndex

    public boolean isGapIndex(BigInteger index)
    Returns true if address of the given index is not the successor of the previous index's address.
    Parameters:
      `index` - the index to test for gap in the address set.
    Returns:
      true if the given index represents the first address after a gap in the address set.

  - ### isGapAddress

    public boolean isGapAddress(Address address)
    Returns true if the given address is the first address after gap of missing addresses.
    Parameters:
      `address` - the address to check for being a gap address
    Returns:
      true if the given address is the first address after gap of missing addresses.

  - ### getAddress

    public Address getAddress(BigInteger index)
    Returns the i'th address in the set.
    Parameters:
      `index` - the index of the address to retrieve.
    Returns:
      the address associated with the given index

  - ### getIndex

    public BigInteger getIndex(Address addr)
    Returns the index for the given address. If the address is not mapped, null will be returned
    Parameters:
      `addr` - the address for which to retrieve the index.
    Returns:
      the index associated with the given address.

  - ### getIndexAtOrAfter

    public BigInteger getIndexAtOrAfter(Address addr)
    Returns the index for the given address. If the address is not mapped, the result is defined as follows: if the address is less than the smallest address in the map, then null is returned if the address is greater the the largest address in the map, then a value one bigger than the index of the largest address in the map. if the address is in a "gap", then the index of the next largest address that is in the map is returned.
    Parameters:
      `addr` - the address for which to retrieve the index.
    Returns:
      the associated index for the given address or if there is none, then the index of then next address greater than the given address or null if there is none.

  - ### getAddressSet

    public AddressSet getAddressSet(FieldSelection sel)
    Returns the Address set corresponding to the set of indexes
    Parameters:
      `sel` - the FieldSelection containing the set of indexes to include.
    Returns:
      the AddressSet for the given field selection.

  - ### getFieldSelection

    public FieldSelection getFieldSelection(AddressSetView set)
    Returns a FieldSelection containing the set of indexes represented by the given address set
    Parameters:
      `set` - the set of addresses to convert into a set of indexes.
    Returns:
      a FieldSelection for the given address set.

  - ### getOriginalAddressSet

    public AddressSetView getOriginalAddressSet()
    Returns the total set of addresses in this map include addresses that have been closed
    Returns:
      the total set of addresses in the map including addresses that have been closed

  - ### getIndexedAddressSet

    public AddressSetView getIndexedAddressSet()
    Returns the total set of addresses in this index mapping (not including those that have been closed)
    Returns:
      the total set of addresses in this index mapping (not including those that have been closed)

  - ### getMaxIndex

    public BigInteger getMaxIndex(Address addr)
    Returns the the maximum address for the range containing the given address.
    Parameters:
      `addr` - the address to find its containing range's max address.
    Returns:
      the the maximum address for the range containing the given address.

  - ### getMinIndex

    public BigInteger getMinIndex(Address addr)
    Returns the the minimum address for the range containing the given address.
    Parameters:
      `addr` - the address to find its containing range's min address.
    Returns:
      the the minimum address for the range containing the given address.

  - ### removeUnviewableAddressRanges

    public void removeUnviewableAddressRanges(AddressSet addressSet)
    Removes the given addresses from the set of addresses that get mapped into indexes. This is used to remove large number of addresses that are contained in closed data in order to make scrollbars scroll smoothly.

    The original address set is maintained to determine the gap addresses and also for resetting the index map to the entire set of addresses

    Parameters:
      `addressSet` - the set of addresses to remove from the set of addresses that get mapped.

  - ### getMiniumUnviewableGapSize

    public BigInteger getMiniumUnviewableGapSize()
    Returns the suggested minimum size of address ranges that contain no viewable code units (i.e. collapsed data). Ranges larger that this should be removed from the index mapping to get better scrollbar behavior. Currently this is 1% of the total viewed address space.
    Returns:
      the suggested minimum size for a range of addresses with no viewable content.

  - ### reset

    public AddressIndexMap reset()
    Resets the mapping to the entire original address set.