std/typeinfo
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
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