Source: types/AddressType.js

import { MemoryManager } from '../MemoryManager'
import { Pointer } from '../Pointer'

import { ReferenceType } from './ReferenceType'

/**
 * A class representing a string buffer type
 * @extends {ReferenceType<Pointer<number>>}
 */
export class AddressType extends ReferenceType {

  /**
   * Marshall an address into memory
   * @param {MemoryManager} memoryManager The memory manager
   * @param {number} unmarshalledIndex The index of the value to to marshall
   * @param {Array<*>} unmarshalledArgs The unmarshalled arguments
   * @returns {number} The address of the string in memory
   */
  marshall (memoryManager, unmarshalledIndex, unmarshalledArgs) {
    return unmarshalledArgs[unmarshalledIndex].contents
  }

  /**
   * Unmarshall an address
   * @param {MemoryManager} memoryManager The memory manager
   * @param {number} address The address of the string buffer in memory
   * @param {number} unmarshalledIndex The index of the unmarshalled value or -1
   * @param {Array<*>} unmarshalledArgs The unmarshalled arguments.
   * @returns {Pointer<number>} The unmarshalled string buffer
   */
  unmarshall (memoryManager, address, unmarshalledIndex, unmarshalledArgs) {
    if (unmarshalledIndex !== -1) {
      return /** @type {Pointer<number>} */ (unmarshalledArgs[unmarshalledIndex])
    } else {
      const pointer =  new Pointer(address)
      memoryManager.freeWhenFinalized(pointer, address)
      return pointer
    }
  }

  /**
   * Free allocated memory.
   * @param {MemoryManager} memoryManager The memory manager
   * @param {number} address The address of the memory to be freed
   * @param {number} unmarshalledIndex The index of the unmarshalled value or -1
   * @param {Array<*>} unmarshalledArgs The unmarshalled arguments
   * @returns {void}
   */
  free (memoryManager, address, unmarshalledIndex, unmarshalledArgs) {
    // The finalizer handles freeing.
  }

  get mangledName() {
    return 'a32'
  }
}