# std/typeinfo

Theme:

- Manual
- Standard library
- Index
- Compiler docs
- Fusion docs
- devel, stable

Search:
Source Edit

This module implements an interface to Nim's runtime type information (RTTI). See the marshal module for an example of what this allows you to do.

Note: Even though `Any` and its operations hide the nasty low level details from its users, it remains inherently unsafe! Also, Nim's runtime type information will evolve and may eventually be deprecated. As an alternative approach to programmatically understanding and manipulating types, consider using the macros module to work with the types' AST representation at compile time. See for example the getTypeImpl proc. As an alternative approach to storing arbitrary types at runtime, consider using generics.

Example:

    import std/typeinfo
    var x: Any

    var i = 42
    x = i.toAny
    assert x.kind == akInt
    assert x.getInt == 42

    var s = @[1, 2, 3]
    x = s.toAny
    assert x.kind == akSequence
    assert x.len == 3

# Imports

assertions, strimpl

# Types

    Any = object
      when defined(js):
      else:

  A type that can represent any nim value.
  Danger: The wrapped value can be modified with its wrapper! This means that `Any` keeps a non-traced pointer to its wrapped value and must not live longer than its wrapped value.
  Source Edit

    AnyKind = enum
      akNone = 0,               ## invalid
      akBool = 1,               ## bool
      akChar = 2,               ## char
      akEnum = 14,              ## enum
      akArray = 16,             ## array
      akObject = 17,            ## object
      akTuple = 18,             ## tuple
      akSet = 19,               ## set
      akRange = 20,             ## range
      akPtr = 21,               ## ptr
      akRef = 22,               ## ref
      akSequence = 24,          ## sequence
      akProc = 25,              ## proc
      akPointer = 26,           ## pointer
      akString = 28,            ## string
      akCString = 29,           ## cstring
      akInt = 31,               ## int
      akInt8 = 32,              ## int8
      akInt16 = 33,             ## int16
      akInt32 = 34,             ## int32
      akInt64 = 35,             ## int64
      akFloat = 36,             ## float
      akFloat32 = 37,           ## float32
      akFloat64 = 38,           ## float64
      akFloat128 = 39,          ## float128
      akUInt = 40,              ## uint
      akUInt8 = 41,             ## uint8
      akUInt16 = 42,            ## uin16
      akUInt32 = 43,            ## uint32
      akUInt64 = 44              ## uint64

  The kind of `Any`. Source Edit

# Procs

    proc `[]`(x: Any): Any {....raises: [], tags: [], forbids: [].}

  Dereference operator for `Any`. `x` needs to represent a ptr or a ref. Source Edit

    proc `[]`(x: Any; fieldName: string): Any {....raises: [ValueError], tags: [],
        forbids: [].}

  Gets a field of `x`. `x` needs to represent an object or a tuple. Source Edit

    proc `[]`(x: Any; i: int): Any {....raises: [ValueError], tags: [], forbids: [].}

  Accessor for an any `x` that represents an array or a sequence. Source Edit

    proc `[]=`(x, y: Any) {....raises: [], tags: [], forbids: [].}

  Dereference operator for `Any`. `x` needs to represent a ptr or a ref. Source Edit

    proc `[]=`(x: Any; fieldName: string; value: Any) {....raises: [ValueError],
        tags: [], forbids: [].}

  Sets a field of `x`. `x` needs to represent an object or a tuple. Source Edit

    proc `[]=`(x: Any; i: int; y: Any) {....raises: [ValueError], tags: [], forbids: [].}

  Accessor for an any `x` that represents an array or a sequence. Source Edit

    proc assign(x, y: Any) {....raises: [], tags: [], forbids: [].}

  Copies the value of `y` to `x`. The assignment operator for `Any` does NOT do this; it performs a shallow copy instead! Source Edit

    proc base(x: Any): Any {....raises: [], tags: [], forbids: [].}

  Returns the base type of `x` (useful for inherited object types). Source Edit

    proc baseTypeKind(x: Any): AnyKind {.inline, ...raises: [], tags: [], forbids: [].}

  Gets the base type's kind. If `x` has no base type, `akNone` is returned. Source Edit

    proc baseTypeSize(x: Any): int {.inline, ...raises: [], tags: [], forbids: [].}

  Returns the size of `x`'s base type. If `x` has no base type, 0 is returned. Source Edit

    proc extendSeq(x: Any) {....raises: [], tags: [], forbids: [].}

  Performs `setLen(x, x.len+1)`. `x` needs to represent a `seq`. Source Edit

    proc getBiggestFloat(x: Any): BiggestFloat {....raises: [], tags: [], forbids: [].}

  Retrieves the float value out of `x`. `x` needs to represent some float. The value is extended to `BiggestFloat`. Source Edit

    proc getBiggestInt(x: Any): BiggestInt {....raises: [], tags: [], forbids: [].}

  Retrieves the integer value out of `x`. `x` needs to represent some integer, a bool, a char, an enum or a small enough bit set. The value might be sign-extended to `BiggestInt`. Source Edit

    proc getBiggestUint(x: Any): uint64 {....raises: [], tags: [], forbids: [].}

  Retrieves the unsigned integer value out of `x`. `x` needs to represent an unsigned integer. Source Edit

    proc getBool(x: Any): bool {....raises: [], tags: [], forbids: [].}

  Retrieves the `bool` value out of `x`. `x` needs to represent a `bool`. Source Edit

    proc getChar(x: Any): char {....raises: [], tags: [], forbids: [].}

  Retrieves the `char` value out of `x`. `x` needs to represent a `char`. Source Edit

    proc getCString(x: Any): cstring {....raises: [], tags: [], forbids: [].}

  Retrieves the `cstring` value out of `x`. `x` needs to represent a `cstring`. Source Edit

    proc getEnumField(x: Any): string {....raises: [], tags: [], forbids: [].}

  Gets the enum field name as a string. `x` needs to represent an enum. Source Edit

    proc getEnumField(x: Any; ordinalValue: int): string {....raises: [], tags: [],
        forbids: [].}

  Gets the enum field name as a string. `x` needs to represent an enum but is only used to access the type information. The field name of `ordinalValue` is returned. Source Edit

    proc getEnumOrdinal(x: Any; name: string): int {....raises: [], tags: [],
        forbids: [].}

  Gets the enum field ordinal from `name`. `x` needs to represent an enum but is only used to access the type information. In case of an error `low(int)` is returned. Source Edit

    proc getFloat(x: Any): float {....raises: [], tags: [], forbids: [].}

  Retrieves the `float` value out of `x`. `x` needs to represent a `float`. Source Edit

    proc getFloat32(x: Any): float32 {....raises: [], tags: [], forbids: [].}

  Retrieves the `float32` value out of `x`. `x` needs to represent a `float32`. Source Edit

    proc getFloat64(x: Any): float64 {....raises: [], tags: [], forbids: [].}

  Retrieves the `float64` value out of `x`. `x` needs to represent a `float64`. Source Edit

    proc getInt(x: Any): int {....raises: [], tags: [], forbids: [].}

  Retrieves the `int` value out of `x`. `x` needs to represent an `int`. Source Edit

    proc getInt8(x: Any): int8 {....raises: [], tags: [], forbids: [].}

  Retrieves the `int8` value out of `x`. `x` needs to represent an `int8`. Source Edit

    proc getInt16(x: Any): int16 {....raises: [], tags: [], forbids: [].}

  Retrieves the `int16` value out of `x`. `x` needs to represent an `int16`. Source Edit

    proc getInt32(x: Any): int32 {....raises: [], tags: [], forbids: [].}

  Retrieves the `int32` value out of `x`. `x` needs to represent an `int32`. Source Edit

    proc getInt64(x: Any): int64 {....raises: [], tags: [], forbids: [].}

  Retrieves the `int64` value out of `x`. `x` needs to represent an `int64`. Source Edit

    proc getPointer(x: Any): pointer {....raises: [], tags: [], forbids: [].}

  Retrieves the pointer value out of `x`. `x` needs to be of kind `akString`, `akCString`, `akProc`, `akRef`, `akPtr`, `akPointer` or `akSequence`. Source Edit

    proc getString(x: Any): string {....raises: [], tags: [], forbids: [].}

  Retrieves the `string` value out of `x`. `x` needs to represent a `string`. Source Edit

    proc getUInt(x: Any): uint {....raises: [], tags: [], forbids: [].}

  Retrieves the `uint` value out of `x`. `x` needs to represent a `uint`. Source Edit

    proc getUInt8(x: Any): uint8 {....raises: [], tags: [], forbids: [].}

  Retrieves the `uint8` value out of `x`. `x` needs to represent a `uint8`. Source Edit

    proc getUInt16(x: Any): uint16 {....raises: [], tags: [], forbids: [].}

  Retrieves the `uint16` value out of `x`. `x` needs to represent a `uint16`. Source Edit

    proc getUInt32(x: Any): uint32 {....raises: [], tags: [], forbids: [].}

  Retrieves the `uint32` value out of `x`. `x` needs to represent a `uint32`. Source Edit

    proc getUInt64(x: Any): uint64 {....raises: [], tags: [], forbids: [].}

  Retrieves the `uint64` value out of `x`. `x` needs to represent a `uint64`. Source Edit

    proc inclSetElement(x: Any; elem: int) {....raises: [], tags: [], forbids: [].}

  Includes an element `elem` in `x`. `x` needs to represent a Nim bitset. Source Edit

    proc invokeNew(x: Any) {....raises: [], tags: [], forbids: [].}

  Performs `new(x)`. `x` needs to represent a `ref`. Source Edit

    proc invokeNewSeq(x: Any; len: int) {....raises: [], tags: [], forbids: [].}

  Performs `newSeq(x, len)`. `x` needs to represent a `seq`. Source Edit

    proc isNil(x: Any): bool {....raises: [], tags: [], forbids: [].}

  `isNil` for an `x` that represents a cstring, proc or some pointer type. Source Edit

    proc kind(x: Any): AnyKind {.inline, ...raises: [], tags: [], forbids: [].}

  Gets the type kind. Source Edit

    proc len(x: Any): int {....raises: [], tags: [], forbids: [].}

  `len` for an any `x` that represents an array or a sequence. Source Edit

    proc setBiggestFloat(x: Any; y: BiggestFloat) {....raises: [], tags: [],
        forbids: [].}

  Sets the float value of `x`. `x` needs to represent some float. Source Edit

    proc setBiggestInt(x: Any; y: BiggestInt) {....raises: [], tags: [], forbids: [].}

  Sets the integer value of `x`. `x` needs to represent some integer, a bool, a char, an enum or a small enough bit set. Source Edit

    proc setBiggestUint(x: Any; y: uint64) {....raises: [], tags: [], forbids: [].}

  Sets the unsigned integer value of `x`. `x` needs to represent an unsigned integer. Source Edit

    proc setObjectRuntimeType(x: Any) {....raises: [], tags: [], forbids: [].}

  This needs to be called to set `x`'s runtime object type field. Source Edit

    proc setPointer(x: Any; y: pointer) {....raises: [], tags: [], forbids: [].}

  Sets the pointer value of `x`. `x` needs to be of kind `akString`, `akCString`, `akProc`, `akRef`, `akPtr`, `akPointer` or `akSequence`. Source Edit

    proc setString(x: Any; y: string) {....raises: [], tags: [], forbids: [].}

  Sets the `string` value of `x`. `x` needs to represent a `string`. Source Edit

    proc size(x: Any): int {.inline, ...raises: [], tags: [], forbids: [].}

  Returns the size of `x`'s type. Source Edit

    proc skipRange(x: Any): Any {....raises: [], tags: [], forbids: [].}

  Skips the range information of `x`. Source Edit

    proc toAny[T](x: var T): Any {.inline.}

  Constructs an `Any` object from `x`. This captures `x`'s address, so `x` can be modified with its `Any` wrapper! The caller needs to ensure that the wrapper does not live longer than `x`! Source Edit

# Iterators

    iterator elements(x: Any): int {....raises: [], tags: [], forbids: [].}

  Iterates over every element of `x`. `x` needs to represent a `set`. Source Edit

    iterator fields(x: Any): tuple[name: string, any: Any] {....raises: [], tags: [],
        forbids: [].}

  Iterates over every active field of `x`. `x` needs to represent an object or a tuple. Source Edit