Package ghidra.program.model.data

# Class DataTypeImpl

java.lang.Object
ghidra.program.model.data.AbstractDataType
ghidra.program.model.data.DataTypeImpl

All Implemented Interfaces:
  `DataType`

Direct Known Subclasses:
  `ArrayDataType`, `BuiltIn`, `DefaultDataType`, `GenericDataType`, `MissingBuiltInDataType`

public abstract class DataTypeImpl extends AbstractDataType
Base implementation for dataTypes. NOTE: Settings are immutable when a DataTypeManager has not been specified (i.e., null).

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `protected Settings`
  `defaultSettings`

  ### Fields inherited from class ghidra.program.model.data.AbstractDataType

  `categoryPath, dataMgr, name`

  ### Fields inherited from interface ghidra.program.model.data.DataType

  `CONFLICT_SUFFIX, DEFAULT, NO_LAST_CHANGE_TIME, NO_SOURCE_SYNC_TIME, TYPEDEF_ATTRIBUTE_PREFIX, TYPEDEF_ATTRIBUTE_SUFFIX, VOID`

- ## Constructor Summary

  Constructors
  Modifier
  Constructor
  Description
  `protected`
  `DataTypeImpl(CategoryPath path, String name, DataTypeManager dataMgr)`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `void`
  `addParent(DataType dt)`
  Inform this data type that it has the given parent
  TODO: This method is reserved for internal DB use.
  `final boolean`
  `equals(Object obj)`
  `int`
  `getAlignedLength()`
  Get the aligned-length of this datatype as a number of 8-bit bytes.
  `int`
  `getAlignment()`
  Gets the alignment to be used when aligning this datatype within another datatype.
  `Settings`
  `getDefaultSettings()`
  Gets the settings for this data type.
  `long`
  `getLastChangeTime()`
  Get the timestamp corresponding to the last time this type was changed within its datatype manager
  `long`
  `getLastChangeTimeInSourceArchive()`
  Get the timestamp corresponding to the last time this type was sync'd within its source archive
  `Collection<DataType>`
  `getParents()`
  Get the parents of this datatype.
  `String`
  `getPathName()`
  Get the full category path name that includes this datatype's name.
  `SettingsDefinition[]`
  `getSettingsDefinitions()`
  Get the list of settings definitions available for use with this datatype.
  `SourceArchive`
  `getSourceArchive()`
  Get the source archive where this type originated
  `UniversalID`
  `getUniversalID()`
  Get the universal ID for this datatype.
  `Class<?>`
  `getValueClass(Settings settings)`
  Get the Class of the value Object to be returned by this datatype (see `DataType.getValue(MemBuffer, Settings, int)`).
  `int`
  `hashCode()`
  `protected void`
  `notifyAlignmentChanged()`
  Notify all parents that this datatype's alignment has changed
  `protected void`
  `notifyDeleted()`
  Notify all parents that this datatype has been deleted
  `protected void`
  `notifyNameChanged(String oldName)`
  Notify all parents that this datatype's name has changed
  `protected final void`
  `notifyParents(Consumer<DataType> consumer)`
  `protected void`
  `notifyReplaced(DataType replacement)`
  Notify any parents that I have been replaced.
  `protected void`
  `notifySizeChanged()`
  Notify all parents that the size of this datatype has changed or other significant change that may affect a parent containing this datatype.
  `void`
  `removeParent(DataType dt)`
  Remove a parent datatype
  `void`
  `replaceWith(DataType dataType)`
  For datatypes that support change, this method replaces the internals of this datatype with the internals of the given datatype.
  `void`
  `setDescription(String description)`
  Sets a String briefly describing this DataType.
  `void`
  `setLastChangeTime(long lastChangeTime)`
  Sets the lastChangeTime for this datatype.
  `void`
  `setLastChangeTimeInSourceArchive(long lastChangeTimeInSourceArchive)`
  Sets the lastChangeTimeInSourceArchive for this datatype.
  `void`
  `setSourceArchive(SourceArchive archive)`
  Set the source archive where this type originated

  ### Methods inherited from class ghidra.program.model.data.AbstractDataType

  `dataTypeAlignmentChanged, dataTypeDeleted, dataTypeNameChanged, dataTypeReplaced, dataTypeSizeChanged, dependsOn, encodeRepresentation, encodeValue, getCategoryPath, getDataOrganization, getDataOrganization, getDataTypeManager, getDataTypePath, getDefaultAbbreviatedLabelPrefix, getDefaultLabelPrefix, getDefaultLabelPrefix, getDefaultOffcutLabelPrefix, getDisplayName, getDocs, getMnemonic, getName, getTypeDefSettingsDefinitions, hasLanguageDependantLength, isDeleted, isEncodable, isNotYetDefined, isZeroLength, setCategoryPath, setName, setNameAndCategory, toString`

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

  `clone, finalize, getClass, notify, notifyAll, wait, wait, wait`

  ### Methods inherited from interface ghidra.program.model.data.DataType

  `clone, copy, getDescription, getLength, getRepresentation, getValue, isEquivalent`

- ## Field Details

  - ### defaultSettings

    protected Settings defaultSettings

- ## Constructor Details

  - ### DataTypeImpl

    protected DataTypeImpl(CategoryPath path, String name, DataTypeManager dataMgr)

- ## Method Details

  - ### getValueClass

    public Class<?> getValueClass(Settings settings)
    Description copied from interface: `DataType`
    Get the Class of the value Object to be returned by this datatype (see `DataType.getValue(MemBuffer, Settings, int)`).
    Parameters:
      `settings` - the relevant settings to use or null for default.
    Returns:
      Class of the value to be returned by this datatype or null if it can vary or is unspecified. Types which correspond to a string or char array will return the String class.

  - ### getDefaultSettings

    public Settings getDefaultSettings()
    Description copied from interface: `DataType`
    Gets the settings for this data type. The settings may have underlying default settings and may in turn become defaults for instance-specific settings (e.g., Data or DataTypeComponent). It is important to note that these settings are tied to a specific DataType instantiation so it is important to understand the scope of its use. Example: The `BuiltInDataTypeManager` has its own set of DataType instances which are separate from those which have been instantiated or resolved to a specific Program/Archive `DataTypeManager`. Settings manipulation may be disabled by default in some instances.
    Returns:
      the settings for this dataType.

  - ### getSettingsDefinitions

    public SettingsDefinition[] getSettingsDefinitions()
    Description copied from interface: `DataType`
    Get the list of settings definitions available for use with this datatype.

    In the case of a `TypeDef`, the return list will include the `TypeDefSettingsDefinition` list from the associated base data type.

    Unlike `TypeDefSettingsDefinition` standard settings definitions generally support default, component-default and data-instance use. In addition, standard settings definitions are never considered during `DataType.isEquivalent(DataType)` checking or during the resolve process.

    Returns:
      list of the settings definitions for this datatype.

  - ### getPathName

    public String getPathName()
    Description copied from interface: `DataType`
    Get the full category path name that includes this datatype's name.

    If the category is null, then this just the datatype's name is returned.

    Specified by:
      `getPathName` in interface `DataType`
    Overrides:
      `getPathName` in class `AbstractDataType`
    Returns:
      the path, or just this type's name

  - ### getAlignedLength

    public int getAlignedLength()
    Description copied from interface: `DataType`
    Get the aligned-length of this datatype as a number of 8-bit bytes.

    For primitive datatypes this is equivalent to the C/C++ "sizeof" operation within source code and should be used when determining `Array` element length or component sizing for a `Composite`. For `Pointer`, `Composite` and `Array` types this will return the same value as `DataType.getLength()`.

    Example: For x86 32-bit gcc an 80-bit `long double` `raw data length` of 10-bytes will fit within a floating point register while its `aligned-length` of 12-bytes is used by the gcc compiler for data/array/component allocations to maintain alignment (i.e., `sizeof(long double)` ).

    NOTE: Other than the `VoidDataType`, no datatype should ever return 0, even if `DataType.isZeroLength()`, and only `Dynamic` / `FactoryDataType` / `FunctionDefinition` datatypes should return -1. If `DataType.isZeroLength()` is true a length of 1 should be returned.

    Returns:
      byte length of binary encoding.

  - ### getAlignment

    public int getAlignment()
    Description copied from interface: `DataType`
    Gets the alignment to be used when aligning this datatype within another datatype.
    Returns:
      this datatype's alignment.

  - ### addParent

    public void addParent(DataType dt)
    Description copied from interface: `DataType`
    Inform this data type that it has the given parent
    TODO: This method is reserved for internal DB use.
    Specified by:
      `addParent` in interface `DataType`
    Overrides:
      `addParent` in class `AbstractDataType`
    Parameters:
      `dt` - parent data type

  - ### removeParent

    public void removeParent(DataType dt)
    Description copied from interface: `DataType`
    Remove a parent datatype

    TODO: This method is reserved for internal DB use.

    Specified by:
      `removeParent` in interface `DataType`
    Overrides:
      `removeParent` in class `AbstractDataType`
    Parameters:
      `dt` - parent datatype

  - ### getParents

    public Collection<DataType> getParents()
    Description copied from interface: `DataType`
    Get the parents of this datatype. NOTE: This method is intended to be used on a DB-managed datatype only and is not fully supported for use with non-DB datatype instances.
    Specified by:
      `getParents` in interface `DataType`
    Overrides:
      `getParents` in class `AbstractDataType`
    Returns:
      parents of this datatype

  - ### notifySizeChanged

    protected void notifySizeChanged()
    Notify all parents that the size of this datatype has changed or other significant change that may affect a parent containing this datatype.

  - ### notifyAlignmentChanged

    protected void notifyAlignmentChanged()
    Notify all parents that this datatype's alignment has changed

  - ### notifyNameChanged

    protected void notifyNameChanged(String oldName)
    Notify all parents that this datatype's name has changed
    Parameters:
      `oldName` -

  - ### notifyDeleted

    protected void notifyDeleted()
    Notify all parents that this datatype has been deleted

  - ### notifyReplaced

    protected void notifyReplaced(DataType replacement)
    Notify any parents that I have been replaced.
    Parameters:
      `replacement` - replacement data type

  - ### notifyParents

    protected final void notifyParents(Consumer<DataType> consumer)

  - ### getLastChangeTime

    public long getLastChangeTime()
    Description copied from interface: `DataType`
    Get the timestamp corresponding to the last time this type was changed within its datatype manager
    Specified by:
      `getLastChangeTime` in interface `DataType`
    Overrides:
      `getLastChangeTime` in class `AbstractDataType`
    Returns:
      timestamp of last change within datatype manager

  - ### getLastChangeTimeInSourceArchive

    public long getLastChangeTimeInSourceArchive()
    Description copied from interface: `DataType`
    Get the timestamp corresponding to the last time this type was sync'd within its source archive
    Specified by:
      `getLastChangeTimeInSourceArchive` in interface `DataType`
    Overrides:
      `getLastChangeTimeInSourceArchive` in class `AbstractDataType`
    Returns:
      timestamp of last sync with source archive

  - ### getSourceArchive

    public SourceArchive getSourceArchive()
    Description copied from interface: `DataType`
    Get the source archive where this type originated
    Specified by:
      `getSourceArchive` in interface `DataType`
    Overrides:
      `getSourceArchive` in class `AbstractDataType`
    Returns:
      source archive object

  - ### setSourceArchive

    public void setSourceArchive(SourceArchive archive)
    Description copied from interface: `DataType`
    Set the source archive where this type originated
    Specified by:
      `setSourceArchive` in interface `DataType`
    Overrides:
      `setSourceArchive` in class `AbstractDataType`
    Parameters:
      `archive` - source archive object

  - ### getUniversalID

    public UniversalID getUniversalID()
    Description copied from interface: `DataType`
    Get the universal ID for this datatype.

    This value is intended to be a unique identifier across all programs and archives. The same ID indicates that two datatypes were originally the same one. Keep in mind names, categories, and component makeup may differ and have changed since there origin.

    Specified by:
      `getUniversalID` in interface `DataType`
    Overrides:
      `getUniversalID` in class `AbstractDataType`
    Returns:
      datatype UniversalID

  - ### replaceWith

    public void replaceWith(DataType dataType)
    Description copied from interface: `DataType`
    For datatypes that support change, this method replaces the internals of this datatype with the internals of the given datatype.

    The datatypes must be of the same "type" (i.e. structure can only be replacedWith another structure.

    Specified by:
      `replaceWith` in interface `DataType`
    Overrides:
      `replaceWith` in class `AbstractDataType`
    Parameters:
      `dataType` - the datatype that contains the internals to upgrade to.

  - ### setLastChangeTime

    public void setLastChangeTime(long lastChangeTime)
    Description copied from interface: `DataType`
    Sets the lastChangeTime for this datatype.

    Normally, this is updated automatically when a datatype is changed, but when committing or updating while synchronizing an archive, the lastChangeTime may need to be updated externally.

    Specified by:
      `setLastChangeTime` in interface `DataType`
    Overrides:
      `setLastChangeTime` in class `AbstractDataType`
    Parameters:
      `lastChangeTime` - the time to use as the lastChangeTime for this datatype

  - ### setLastChangeTimeInSourceArchive

    public void setLastChangeTimeInSourceArchive(long lastChangeTimeInSourceArchive)
    Description copied from interface: `DataType`
    Sets the lastChangeTimeInSourceArchive for this datatype.

    This is used by when a datatype change is committed back to its source archive.

    Specified by:
      `setLastChangeTimeInSourceArchive` in interface `DataType`
    Overrides:
      `setLastChangeTimeInSourceArchive` in class `AbstractDataType`
    Parameters:
      `lastChangeTimeInSourceArchive` - the time to use as the lastChangeTimeInSourceArchive for this datatype

  - ### setDescription

    public void setDescription(String description) throws UnsupportedOperationException
    Sets a String briefly describing this DataType.
    If a data type that extends this class wants to allow the description to be changed, then it must override this method.
    Specified by:
      `setDescription` in interface `DataType`
    Overrides:
      `setDescription` in class `AbstractDataType`
    Parameters:
      `description` - a one-liner describing this DataType.
    Throws:
      `UnsupportedOperationException` - if the description is not allowed to be set for this data type.

  - ### hashCode

    public int hashCode()
    Overrides:
      `hashCode` in class `Object`

  - ### equals

    public final boolean equals(Object obj)
    Overrides:
      `equals` in class `Object`