package base:builtin
Overview
package builtin provides documentation for Odin's predeclared identifiers. The items documented here are not actually in package builtin but here to allow for better documentation for the language's special identifiers.
Index
Constants (22)
- nil
- false
- true
- ODIN_OS
- ODIN_ARCH
- ODIN_ENDIAN
- ODIN_BUILD_MODE
- ODIN_ERROR_POS_STYLE
- ODIN_PLATFORM_SUBTARGET
- ODIN_WINDOWS_SUBSYSTEM
- ODIN_VENDOR
- ODIN_VERSION
- ODIN_ROOT
- ODIN_DEBUG
- ODIN_DISABLE_ASSERT
- ODIN_DEFAULT_TO_NIL_ALLOCATOR
- ODIN_DEFAULT_TO_PANIC_ALLOCATOR
- ODIN_NO_CRT
- ODIN_NO_ENTRY_POINT
- ODIN_NO_RTTI
- ODIN_COMPILE_TIMESTAMP
- runtime.ODIN_PLATFORM_SUBTARGET_IOS
Types (58)
- byte
- bool
- b8
- b16
- b32
- b64
- i8
- u8
- i16
- u16
- i32
- u32
- i64
- u64
- i128
- u128
- rune
- f16
- f32
- f64
- complex32
- complex64
- complex128
- quaternion64
- quaternion128
- quaternion256
- int
- uint
- uintptr
- rawptr
- string
- cstring
- typeid
- any
- i16le
- u16le
- i32le
- u32le
- i64le
- u64le
- i128le
- u128le
- i16be
- u16be
- i32be
- u32be
- i64be
- u64be
- i128be
- u128be
- f16le
- f32le
- f64le
- f16be
- f32be
- f64be
- runtime.Maybe
- runtime.Objc_Block
Procedures (107)
- len
- cap
- size_of
- align_of
- offset_of
- offset_of_selector
- offset_of_member
- offset_of_by_string
- type_of
- type_info_of
- typeid_of
- swizzle
- complex
- quaternion
- real
- imag
- jmag
- kmag
- conj
- expand_values
- min
- max
- abs
- clamp
- soa_zip
- soa_unzip
- raw_data
- runtime.raw_soa_footer_slice
- runtime.container_of
- runtime.raw_soa_footer_dynamic_array
- runtime.init_global_temporary_allocator
- runtime.copy_slice
- runtime.make_soa_aligned
- runtime.copy_from_string
- runtime.make_soa_slice
- runtime.make_soa_dynamic_array
- runtime.copy_from_string16
- runtime.make_soa_dynamic_array_len
- runtime.make_soa_dynamic_array_len_cap
- runtime.unordered_remove
- runtime.ordered_remove
- runtime.resize_soa
- runtime.remove_range
- runtime.non_zero_resize_soa
- runtime.pop
- runtime.reserve_soa
- runtime.non_zero_reserve_soa
- runtime.pop_safe
- runtime.pop_front
- runtime.append_soa_elem
- runtime.pop_front_safe
- runtime.non_zero_append_soa_elem
- runtime.append_soa_elems
- runtime.non_zero_append_soa_elems
- runtime.delete_string
- runtime.unordered_remove_soa
- runtime.delete_cstring
- runtime.delete_dynamic_array
- runtime.delete_slice
- runtime.delete_map
- runtime.delete_string16
- runtime.ordered_remove_soa
- runtime.delete_cstring16
- runtime.new
- runtime.new_clone
- runtime.make_slice
- runtime.make_dynamic_array
- runtime.make_dynamic_array_len
- runtime.make_dynamic_array_len_cap
- runtime.make_map
- runtime.make_map_cap
- runtime.make_multi_pointer
- runtime.clear_map
- runtime.reserve_map
- runtime.shrink_map
- runtime.delete_key
- runtime.append_elem
- runtime.non_zero_append_elem
- runtime.append_elems
- runtime.non_zero_append_elems
- runtime.append_elem_string
- runtime.non_zero_append_elem_string
- runtime.append_string
- runtime.append_nothing
- runtime.inject_at_elem
- runtime.inject_at_elems
- runtime.inject_at_elem_string
- runtime.assign_at_elem
- runtime.assign_at_elems
- runtime.assign_at_elem_string
- runtime.clear_dynamic_array
- runtime.reserve_dynamic_array
- runtime.non_zero_reserve_dynamic_array
- runtime.resize_dynamic_array
- runtime.non_zero_resize_dynamic_array
- runtime.map_insert
- runtime.map_upsert
- runtime.map_entry
- runtime.card
- runtime.assert
- runtime.ensure
- runtime.panic
- runtime.unimplemented
- runtime.assert_contextless
- runtime.ensure_contextless
- runtime.panic_contextless
- runtime.unimplemented_contextless
Procedure Groups (19)
- runtime.copy
- runtime.make_soa
- runtime.clear
- runtime.reserve
- runtime.non_zero_reserve
- runtime.resize
- runtime.non_zero_resize
- runtime.append_soa
- runtime.shrink
- runtime.delete_soa
- runtime.free
- runtime.clear_soa
- runtime.free_all
- runtime.delete
- runtime.make
- runtime.append
- runtime.non_zero_append
- runtime.inject_at
- runtime.assign_at
Constants
nil ¶
nil :: … // untyped nil
nil is a predeclared identifier representing the zero value for a pointer, multi-pointer, enum, bit_set, slice, dynamic array, map, procedure, any, typeid, cstring, union, #soa array, #soa pointer, #relative type
false ¶
false :: 0 != 0 // untyped boolean
true ¶
true :: 0 == 0 // untyped boolean
ODIN_OS ¶
ODIN_OS : runtime.Odin_OS_Type : …
An enum value specifying the target platform's operating system.
// Defined internally by the compiler
Odin_OS_Type :: enum int {
Unknown,
Windows,
Darwin,
Linux,
Essence,
FreeBSD,
OpenBSD,
NetBSD,
Haiku,
WASI,
JS,
Orca,
Freestanding,
}
ODIN_ARCH ¶
ODIN_ARCH : runtime.Odin_Arch_Type : …
An enum value specifying the target platform's architecture.
// Defined internally by the compiler
Odin_Arch_Type :: enum int {
Unknown,
amd64,
i386,
arm32,
arm64,
wasm32,
wasm64p32,
riscv64,
}
ODIN_ENDIAN ¶
ODIN_ENDIAN : runtime.Odin_Endian_Type : …
An enum value specifying the target platform's endiannes.
// Defined internally by the compiler
Odin_Endian_Type :: enum int {
Unknown,
Little,
Big,
}
ODIN_BUILD_MODE ¶
ODIN_BUILD_MODE : runtime.Odin_Build_Mode_Type : …
An enum value specifying the "build-mode".
// Defined internally by the compiler
Odin_Build_Mode_Type :: enum int {
Executable,
Dynamic,
Static,
Object,
Assembly,
LLVM_IR,
}
ODIN_ERROR_POS_STYLE ¶
ODIN_ERROR_POS_STYLE : runtime.Odin_Error_Pos_Style_Type : …
An enum value specifying whether errors should be stylized in the default (MSVC-like) style or a UNIX (GCC-like) style.
Default = `path(1:2) Unix = `path:1:2:
ODIN_PLATFORM_SUBTARGET ¶
ODIN_PLATFORM_SUBTARGET : runtime.Odin_Platform_Subtarget_Type : …
An enum value specifying the selected subtarget type, only useful for Darwin targets.
// Defined internally by the compiler
Odin_Platform_Subtarget_Type :: enum int {
Default,
iPhone,
iPhoneSimulator
Android,
}
ODIN_WINDOWS_SUBSYSTEM ¶
ODIN_WINDOWS_SUBSYSTEM :: … // untyped string
A string specifying the current Windows subsystem, only useful on Windows targets.
ODIN_VENDOR ¶
ODIN_VENDOR :: … // untyped string
A string specifying the current Odin compiler vendor.
ODIN_DEBUG ¶
ODIN_DEBUG :: … // untyped boolean
Equal to true if the -debug flag has been set during compilation, otherwise false.
ODIN_DISABLE_ASSERT ¶
ODIN_DISABLE_ASSERT :: … // untyped boolean
Equal to true if the -disable-assert flag has been set during compilation, otherwise false.
ODIN_DEFAULT_TO_NIL_ALLOCATOR ¶
ODIN_DEFAULT_TO_NIL_ALLOCATOR :: … // untyped boolean
Equal to true if the -default-to-nil-allocator flag has been set during compilation or whether the current target defaults to the "nil allocator", otherwise false.
ODIN_DEFAULT_TO_PANIC_ALLOCATOR ¶
ODIN_DEFAULT_TO_PANIC_ALLOCATOR :: … // untyped boolean
Equal to true if the -default-to-panic-allocator flag has been set during compilation or whether the current target defaults to the "panic allocator", otherwise false.
ODIN_NO_CRT ¶
ODIN_NO_CRT :: … // untyped boolean
Equal to true if the -no-crt flag has been set during compilation (disallowing the C Run-Time library), otherwise false.
ODIN_NO_ENTRY_POINT ¶
ODIN_NO_ENTRY_POINT :: … // untyped boolean
Equal to true if the -no-entry-point flag has been set during compilation, otherwise false.
ODIN_NO_RTTI ¶
ODIN_NO_RTTI :: … // untyped boolean
Equal to true if the -no-rtti flag has been set during compilation (disabling Odin's Run-Time Type Information, only allowed on freestanding targets), otherwise false.
ODIN_COMPILE_TIMESTAMP ¶
ODIN_COMPILE_TIMESTAMP :: … // untyped integer
Equal to the UNIX timestamp in nanoseconds at the time of the program's compilation.
ODIN_PLATFORM_SUBTARGET_IOS ¶
ODIN_PLATFORM_SUBTARGET_IOS: bool : ODIN_PLATFORM_SUBTARGET == .iPhone || ODIN_PLATFORM_SUBTARGET == .iPhoneSimulator
Types
byte ¶
byte :: u8
byte is an alias for u8 and is equivalent to u8 in all ways. It is used as a convention to distinguish values from 8-bit unsigned integer values.
bool ¶
bool :: bool
bool is the set of boolean values, false and true. This is distinct to b8. bool has a size of 1 byte (8 bits).
b8 ¶
b8 :: b8
b8 is the set of boolean values, false and true. This is distinct to bool. b8 has a size of 1 byte (8 bits).
b16 ¶
b16 :: b16
b16 is the set of boolean values, false and true. b16 has a size of 2 bytes (16 bits).
b32 ¶
b32 :: b32
b32 is the set of boolean values, false and true. b32 has a size of 4 bytes (32 bits).
b64 ¶
b64 :: b64
b64 is the set of boolean values, false and true. b64 has a size of 8 bytes (64 bits).
i16 ¶
i16 :: i16
i16 is the set of all signed 16-bit integers with native endianness. Range -32768 through 32767.
u16 ¶
u16 :: u16
u16 is the set of all unsigned 16-bit integers with native endianness. Range 0 through 65535.
i32 ¶
i32 :: i32
i32 is the set of all signed 32-bit integers with native endianness. Range -2147483648 through 2147483647.
u32 ¶
u32 :: u32
u32 is the set of all unsigned 32-bit integers with native endianness. Range 0 through 4294967295.
i64 ¶
i64 :: i64
i64 is the set of all signed 64-bit integers with native endianness. Range -9223372036854775808 through 9223372036854775807.
u64 ¶
u64 :: u64
u64 is the set of all unsigned 64-bit integers with native endianness. Range 0 through 18446744073709551615.
i128 ¶
i128 :: i128
i128 is the set of all signed 128-bit integers with native endianness. Range -170141183460469231731687303715884105728 through 170141183460469231731687303715884105727.
u128 ¶
u128 :: u128
u128 is the set of all unsigned 128-bit integers with native endianness. Range 0 through 340282366920938463463374607431768211455.
rune ¶
rune :: rune
rune is the set of all Unicode code points. It is internally the same as i32 but distinct.
f16 ¶
f16 :: f16
f16 is the set of all IEEE-754 16-bit floating-point numbers with native endianness.
f32 ¶
f32 :: f32
f32 is the set of all IEEE-754 32-bit floating-point numbers with native endianness.
f64 ¶
f64 :: f64
f64 is the set of all IEEE-754 64-bit floating-point numbers with native endianness.
complex32 ¶
complex32 :: complex32
complex32 is the set of all complex numbers with f16 real and imaginary parts
complex64 ¶
complex64 :: complex64
complex64 is the set of all complex numbers with f32 real and imaginary parts
complex128 ¶
complex128 :: complex128
complex128 is the set of all complex numbers with f64 real and imaginary parts
quaternion64 ¶
quaternion64 :: quaternion64
quaternion64 is the set of all complex numbers with f16 real and imaginary (i, j, & k) parts
quaternion128 ¶
quaternion128 :: quaternion128
quaternion128 is the set of all complex numbers with f32 real and imaginary (i, j, & k) parts
quaternion256 ¶
quaternion256 :: quaternion256
quaternion256 is the set of all complex numbers with f64 real and imaginary (i, j, & k) parts
int ¶
int :: int
int is a signed integer type that is at least 32 bits in size. It is a distinct type, however, and not an alias for say, i32.
uint ¶
uint :: uint
uint is an unsigned integer type that is at least 32 bits in size. It is a distinct type, however, and not an alias for say, u32.
uintptr ¶
uintptr :: uintptr
uintptr is an unsigned integer type that is large enough to hold the bit pattern of any pointer.
rawptr ¶
rawptr :: rawptr
rawptr represents a pointer to an arbitrary type. It is equivalent to void * in C.
string ¶
string :: string
string is the set of all strings of 8-bit bytes, conventionally but not necessarily representing UTF-8 encoding text. A string may be empty but not nil. Elements of string type are immutable and indexable.
cstring ¶
cstring :: cstring
cstring is the set of all strings of 8-bit bytes terminated with a NUL (0) byte, conventionally but not necessarily representing UTF-8 encoding text. A cstring may be empty or nil. Elements of string type are immutable but not indexable.
typeid ¶
typeid :: typeid
typeid is a unique identifier for an Odin type at runtime. It can be mapped to relevant type information through type_info_of.
any ¶
any :: any
any can reference any data type at runtime. Internally it contains a pointer to the underlying data and its relevant typeid. This is a very useful construct in order to have a runtime type safe printing procedure.
Note: The any value is only valid for as long as the underlying data is still valid. Passing a literal to an any will allocate the literal in the current stack frame.
Note: It is highly recommend that you do not use this unless you know what you are doing. Its primary use is for printing procedures.
i16le ¶
i16le :: i16le
i16le is the set of all signed 16-bit integers with little endianness. Range -32768 through 32767.
u16le ¶
u16le :: u16le
u16le is the set of all unsigned 16-bit integers with little endianness. Range 0 through 65535.
i32le ¶
i32le :: i32le
i32le is the set of all signed 32-bit integers with little endianness. Range -2147483648 through 2147483647.
u32le ¶
u32le :: u32le
u32le is the set of all unsigned 32-bit integers with little endianness. Range 0 through 4294967295.
i64le ¶
i64le :: i64le
i64le is the set of all signed 64-bit integers with little endianness. Range -9223372036854775808 through 9223372036854775807.
u64le ¶
u64le :: u64le
u64le is the set of all unsigned 64-bit integers with little endianness. Range 0 through 18446744073709551615.
i128le ¶
i128le :: i128le
i128le is the set of all signed 128-bit integers with little endianness. Range -170141183460469231731687303715884105728 through 170141183460469231731687303715884105727.
u128le ¶
u128le :: u128le
u128le is the set of all unsigned 128-bit integers with little endianness. Range 0 through 340282366920938463463374607431768211455.
i16be ¶
i16be :: i16be
i16be is the set of all signed 16-bit integers with big endianness. Range -32768 through 32767.
u16be ¶
u16be :: u16be
u16be is the set of all unsigned 16-bit integers with big endianness. Range 0 through 65535.
i32be ¶
i32be :: i32be
i32be is the set of all signed 32-bit integers with big endianness. Range -2147483648 through 2147483647.
u32be ¶
u32be :: u32be
u32be is the set of all unsigned 32-bit integers with big endianness. Range 0 through 4294967295.
i64be ¶
i64be :: i64be
i64be is the set of all signed 64-bit integers with big endianness. Range -9223372036854775808 through 9223372036854775807.
u64be ¶
u64be :: u64be
u64be is the set of all unsigned 64-bit integers with big endianness. Range 0 through 18446744073709551615.
i128be ¶
i128be :: i128be
i128be is the set of all signed 128-bit integers with big endianness. Range -170141183460469231731687303715884105728 through 170141183460469231731687303715884105727.
u128be ¶
u128be :: u128be
u128be is the set of all unsigned 128-bit integers with big endianness. Range 0 through 340282366920938463463374607431768211455.
f16le ¶
f16le :: f16le
f16le is the set of all IEEE-754 16-bit floating-point numbers with little endianness.
f32le ¶
f32le :: f32le
f32le is the set of all IEEE-754 32-bit floating-point numbers with little endianness.
f64le ¶
f64le :: f64le
f64le is the set of all IEEE-754 64-bit floating-point numbers with little endianness.
f16be ¶
f16be :: f16be
f16be is the set of all IEEE-754 16-bit floating-point numbers with big endianness.
f32be ¶
f32be :: f32be
f32be is the set of all IEEE-754 32-bit floating-point numbers with big endianness.
f64be ¶
f64be :: f64be
f64be is the set of all IEEE-754 64-bit floating-point numbers with big endianness.
Objc_Block ¶
Objc_Block :: struct($T: typeid) { … // See source for fields }
Represents an Objective-C block with a given procedure signature T
Procedures
len ¶
len :: proc(v: Array_Type) -> int {…}
The len built-in procedure returns the length of v according to its type:
Array: the number of elements in v. Pointer to (any) array: the number of elements in `v^` (even if `v` is `nil`). Slice, dynamic array, or map: the number of elements in `v`; if `v` is `nil`, `len(v)` is zero. String: the number of bytes in `v` Enumerated array: the number elements in v.` Enum type: the number of enumeration fields. #soa array: the number of elements in `v`; if `v` is `nil`, `len(v)` is zero. #simd vector: the number of elements in `v`.
For some arguments, such as a string literal or a simple array expression, the result can be constant.
cap ¶
cap :: proc(v: Array_Type) -> int {…}
The cap built-in procedure returns the length of v according to its type:
Array: the number of elements in v. Pointer to (any) array: the number of elements in `v^` (even if `v` is `nil`). Dynamic array, or map: the reserved number of elements in `v`; if `v` is `nil`, `len(v)` is zero. Enum type: equal to `max(Enum)-min(Enum)+1`. #soa dynamic array: the reserved number of elements in `v`; if `v` is `nil`, `len(v)` is zero.
For some arguments, such as a string literal or a simple array expression, the result can be constant.
size_of ¶
size_of :: proc($T: typeid) -> int {…}
size_of takes an expression or type, and returns the size in bytes of the type of the expression if it was hypothetically instantiated as a variable. The size does not include any memory possibly referenced by a value. For instance, if a slice was given, size_of returns the size of the internal slice data structure and not the size of the memory referenced by the slice. For a struct, the size includes any padding introduced by field alignment (if not specified with #packed. Other types follow similar rules. The return value of size_of is a compile time known integer constant.
align_of ¶
align_of :: proc($T: typeid) -> int {…}
align_of takes an expression or type, and returns the alignment in bytes of the type of the expression if it was hypothetically instantiated as a variable v. It is the largest value m such that the address of v is always 0 mod m.
offset_of ¶
offset_of :: proc{offset_of_selector, offset_of_member} {…}
offset_of returns the offset in bytes with the struct of the field.
offset_of_selector ¶
offset_of_selector :: proc(selector: $T) -> uintptr {…}
e.g. offset_of(t.f), where t is an instance of the type T
offset_of_member ¶
offset_of_member :: proc($T: typeid, member: $M) -> uintptr {…}
e.g. offset_of(T, f), where T can be the type instead of a variable
offset_of_by_string ¶
e.g. offset_of(T, "f"), where T can be the type instead of a variable
type_info_of ¶
type_info_of :: proc($T: typeid) -> ^runtime.Type_Info {…}
type_info_of returns the runtime type information from a given typeid.
typeid_of ¶
typeid_of :: proc($T: typeid) -> typeid {…}
typeid_of returns the associated runtime known typeid of the specified type.
complex ¶
complex :: proc(real, imag: Float) -> Complex_Type {…}
quaternion ¶
quaternion :: proc(real, imag, jmag, kmag: Float) -> Quaternion_Type {…}
real ¶
real :: proc(v: Complex_Or_Quaternion) -> Float {…}
real returns the real part of a complex or quaternion number v. The return value will be the floating-point type corresponding to the type of v.
imag ¶
imag :: proc(v: Complex_Or_Quaternion) -> Float {…}
imag returns the i-imaginary part of a complex or quaternion number v. The return value will be the floating-point type corresponding to the type of v.
jmag ¶
jmag :: proc(v: Quaternion) -> Float {…}
jmag returns the j-imaginary part of a quaternion number v. The return value will be the floating-point type corresponding to the type of v.
kmag ¶
kmag :: proc(v: Quaternion) -> Float {…}
kmag returns the k-imaginary part of a quaternion number v. The return value will be the floating-point type corresponding to the type of v.
conj ¶
conj :: proc(v: Complex_Or_Quaternion) -> Complex_Or_Quaternion {…}
conj returns the complex conjugate of a complex or quaternion number v. This negates the imaginary component(s) whilst keeping the real component untouched.
expand_values ¶
expand_values :: proc(value: Struct_Or_Array) -> (A, B, C, ...) {…}
expand_values will return multiple values corresponding to the multiple fields of the passed struct or the multiple elements of a passed fixed length array.
min ¶
min :: proc(values: ..T) -> T {…}
min returns the minimum value of passed arguments of all the same type.
If one argument is passed and it is an enum or numeric type, then min returns the minimum value of the enum type's fields or its minimum / most negative numeric value respectively.
max ¶
max :: proc(values: ..T) -> T {…}
max returns the maximum value of passed arguments of all the same type.
If one argument is passed and it is an enum or numeric type, then max returns the maximum value of the enum type's fields or its maximum numeric value respectively.
abs ¶
abs :: proc(value: T) -> T {…}
abs returns the absolute value of passed argument.
If the argument is a complex or quaternion, this is equivalent to real(conj(value) * value).
clamp ¶
clamp :: proc(v, minimum, maximum: T) -> T {…}
clamp returns a value v clamped between minimum and maximum.
This is calculated as the following: minimum if v < minimum else maximum if v > maximum else v.
soa_zip ¶
soa_zip :: proc(slices: ...) -> #soa[]Struct {…}
soa_unzip ¶
soa_unzip :: proc(value: $S/#soa[]$E) -> (slices: ...) {…}
raw_data ¶
raw_data :: proc(value: $T) -> [^]$E {…}
raw_data returns the underlying data of a built-in data type as a multi-pointer.
raw_data([]$E) -> [^]E // slices raw_data([dynamic]$E) -> [^]E // dynamic arrays raw_data(^[$N]$E) -> [^]E // fixed array and enumerated arrays raw_data(^#simd[$N]$E) -> [^]E // simd vectors raw_data(string) -> [^]byte // string
raw_soa_footer_slice ¶
raw_soa_footer_slice :: proc(array: ^$T/#soa[]$E) -> (footer: ^Raw_SOA_Footer_Slice) {…}
container_of ¶
container_of :: proc "contextless" (ptr: $P/^$Field_Type, $T: typeid, $field_name: string) -> ^typeid {…}
Recovers the containing/parent struct from a pointer to one of its fields. Works by "walking back" to the struct's starting address using the offset between the field and the struct.
Inputs:
ptr: Pointer to the field of a container struct
T: The type of the container struct
field_name: The name of the field in the T struct
Returns:
A pointer to the container struct based on a pointer to a field in it
Example:
package container_of
import "base:runtime"
Node :: struct {
value: int,
prev: ^Node,
next: ^Node,
}
main :: proc() {
node: Node
field_ptr := &node.next
container_struct_ptr: ^Node = runtime.container_of(field_ptr, Node, "next")
assert(container_struct_ptr == &node)
assert(uintptr(field_ptr) - uintptr(container_struct_ptr) == size_of(node.value) + size_of(node.prev))
}
^Node
raw_soa_footer_dynamic_array ¶
raw_soa_footer_dynamic_array :: proc(array: ^$T/#soa[dynamic]$E) -> (footer: ^Raw_SOA_Footer_Dynamic_Array) {…}
init_global_temporary_allocator ¶
init_global_temporary_allocator :: proc(size: int, backup_allocator := context.allocator) {…}
copy_slice ¶
copy_slice :: proc "contextless" (dst, src: $T/[]$E) -> int {…}
copy_slice is a built-in procedure that copies elements from a source slice src to a destination slice dst.
The source and destination may overlap. Copy returns the number of elements copied, which will be the minimum
of len(src) and len(dst).
Prefer the procedure group copy.
make_soa_aligned ¶
make_soa_aligned :: proc($T: typeid/#soa[]$E, #any_int length, #any_int alignment: int, allocator := context.allocator, loc := #caller_location) -> (array: T, err: Allocator_Error) #optional_ok {…}
copy_from_string ¶
copy_from_string is a built-in procedure that copies elements from a source string src to a destination slice dst.
The source and destination may overlap. Copy returns the number of elements copied, which will be the minimum
of len(src) and len(dst).
Prefer the procedure group copy.
make_soa_slice ¶
make_soa_slice :: proc($T: typeid/#soa[]$E, #any_int length: int, allocator := context.allocator, loc := #caller_location) -> (array: T, err: Allocator_Error) #optional_ok {…}
make_soa_dynamic_array ¶
make_soa_dynamic_array :: proc($T: typeid/#soa[dynamic]$E, allocator := context.allocator, loc := #caller_location) -> (array: T, err: Allocator_Error) {…}
copy_from_string16 ¶
copy_from_string16 is a built-in procedure that copies elements from a source string src to a destination slice dst.
The source and destination may overlap. Copy returns the number of elements copied, which will be the minimum
of len(src) and len(dst).
Prefer the procedure group copy.
make_soa_dynamic_array_len ¶
make_soa_dynamic_array_len :: proc($T: typeid/#soa[dynamic]$E, #any_int length: int, allocator := context.allocator, loc := #caller_location) -> (array: T, err: Allocator_Error) #optional_ok {…}
make_soa_dynamic_array_len_cap ¶
make_soa_dynamic_array_len_cap :: proc($T: typeid/#soa[dynamic]$E, #any_int length, #any_int capacity: int, allocator := context.allocator, loc := #caller_location) -> (array: T, err: Allocator_Error) #optional_ok {…}
unordered_remove ¶
unordered_remove :: proc(array: ^[dynamic]$T, #any_int index: int, loc := #caller_location) {…}
unordered_remove removed the element at the specified index. It does so by replacing the current end value
with the old value, and reducing the length of the dynamic array by 1.
Note: This is an O(1) operation.
Note: If you want the elements to remain in their order, use ordered_remove.
Note: If the index is out of bounds, this procedure will panic.
ordered_remove ¶
ordered_remove :: proc(array: ^[dynamic]$T, #any_int index: int, loc := #caller_location) {…}
ordered_remove removed the element at the specified index whilst keeping the order of the other elements.
Note: This is an O(N) operation.
Note: If the elements do not have to remain in their order, prefer unordered_remove.
Note: If the index is out of bounds, this procedure will panic.
resize_soa ¶
resize_soa :: proc(array: ^$T/#soa[dynamic]$E, #any_int length: int, loc := #caller_location) -> Allocator_Error {…}
remove_range ¶
remove_range :: proc(array: ^[dynamic]$T, #any_int lo, #any_int hi: int, loc := #caller_location) {…}
remove_range removes a range of elements specified by the range lo and hi, whilst keeping the order of the other elements.
Note: This is an O(N) operation. Note: If the range is out of bounds, this procedure will panic.
non_zero_resize_soa ¶
non_zero_resize_soa :: proc(array: ^$T/#soa[dynamic]$E, #any_int length: int, loc := #caller_location) -> Allocator_Error {…}
pop ¶
pop :: proc(array: ^$T/[dynamic]$E, loc := #caller_location) -> (res: $E) {…}
pop will remove and return the end value of dynamic array array and reduces the length of array by 1.
Note: If the dynamic array has no elements (len(array) == 0), this procedure will panic.
reserve_soa ¶
reserve_soa :: proc(array: ^$T/#soa[dynamic]$E, #any_int capacity: int, loc := #caller_location) -> Allocator_Error {…}
non_zero_reserve_soa ¶
non_zero_reserve_soa :: proc(array: ^$T/#soa[dynamic]$E, #any_int capacity: int, loc := #caller_location) -> Allocator_Error {…}
pop_safe ¶
pop_safe :: proc "contextless" (array: ^$T/[dynamic]$E) -> (res: $E, ok: bool) {…}
pop_safe trys to remove and return the end value of dynamic array array and reduces the length of array by 1.
If the operation is not possible, it will return false.
pop_front ¶
pop_front :: proc(array: ^$T/[dynamic]$E, loc := #caller_location) -> (res: $E) {…}
pop_front will remove and return the first value of dynamic array array and reduces the length of array by 1.
Note: If the dynamic array as no elements (len(array) == 0), this procedure will panic.
append_soa_elem ¶
append_soa_elem :: proc(array: ^$T/#soa[dynamic]$E, #no_broadcast arg: $E, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_ok {…}
pop_front_safe ¶
pop_front_safe :: proc "contextless" (array: ^$T/[dynamic]$E) -> (res: $E, ok: bool) {…}
pop_front_safe trys to return and remove the first value of dynamic array array and reduces the length of array by 1.
If the operation is not possible, it will return false.
non_zero_append_soa_elem ¶
non_zero_append_soa_elem :: proc(array: ^$T/#soa[dynamic]$E, #no_broadcast arg: $E, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_ok {…}
append_soa_elems ¶
append_soa_elems :: proc(array: ^$T/#soa[dynamic]$E, .. #no_broadcast args: $T/..$E, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_ok {…}
non_zero_append_soa_elems ¶
non_zero_append_soa_elems :: proc(array: ^$T/#soa[dynamic]$E, .. #no_broadcast args: $T/..$E, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_ok {…}
delete_string ¶
delete_string :: proc(str: string, allocator := context.allocator, loc := #caller_location) -> Allocator_Error {…}
delete_string will try to free the underlying data of the passed string, with the given allocator if the allocator supports this operation.
Note: Prefer the procedure group delete.
unordered_remove_soa ¶
unordered_remove_soa :: proc(array: ^$T/#soa[dynamic]$E, #any_int index: int, loc := #caller_location) {…}
unordered_remove_soa removed the element at the specified index. It does so by replacing the current end value
with the old value, and reducing the length of the dynamic array by 1.
Note: This is an O(1) operation.
Note: If you the elements to remain in their order, use ordered_remove_soa.
Note: If the index is out of bounds, this procedure will panic.
delete_cstring ¶
delete_cstring :: proc(str: cstring, allocator := context.allocator, loc := #caller_location) -> Allocator_Error {…}
delete_cstring will try to free the underlying data of the passed string, with the given allocator if the allocator supports this operation.
Note: Prefer the procedure group delete.
delete_dynamic_array ¶
delete_dynamic_array :: proc(array: $T/[dynamic]$E, loc := #caller_location) -> Allocator_Error {…}
delete_dynamic_array will try to free the underlying data of the passed dynamic array, with the given allocator if the allocator supports this operation.
Note: Prefer the procedure group delete.
delete_slice ¶
delete_slice :: proc(array: $T/[]$E, allocator := context.allocator, loc := #caller_location) -> Allocator_Error {…}
delete_slice will try to free the underlying data of the passed sliced, with the given allocator if the allocator supports this operation.
Note: Prefer the procedure group delete.
delete_map ¶
delete_map :: proc(m: $T/map[$K]$V, loc := #caller_location) -> Allocator_Error {…}
delete_map will try to free the underlying data of the passed map, with the given allocator if the allocator supports this operation.
Note: Prefer the procedure group delete.
delete_string16 ¶
delete_string16 :: proc(str: string16, allocator := context.allocator, loc := #caller_location) -> Allocator_Error {…}
ordered_remove_soa ¶
ordered_remove_soa :: proc(array: ^$T/#soa[dynamic]$E, #any_int index: int, loc := #caller_location) {…}
ordered_remove_soa removed the element at the specified index whilst keeping the order of the other elements.
Note: This is an O(N) operation.
Note: If you the elements do not have to remain in their order, prefer unordered_remove_soa.
Note: If the index is out of bounds, this procedure will panic.
delete_cstring16 ¶
delete_cstring16 :: proc(str: cstring16, allocator := context.allocator, loc := #caller_location) -> Allocator_Error {…}
new ¶
new :: proc($T: typeid, allocator := context.allocator, loc := #caller_location) -> (^typeid, Allocator_Error) {…}
The new built-in procedure allocates memory. The first argument is a type, not a value, and the value return is a pointer to a newly allocated value of that type using the specified allocator, default is context.allocator
new_clone ¶
new_clone :: proc(data: $T, allocator := context.allocator, loc := #caller_location) -> (t: ^$T, err: Allocator_Error) {…}
make_slice ¶
make_slice :: proc($T: typeid/[]$E, #any_int len: int, allocator := context.allocator, loc := #caller_location) -> (T, Allocator_Error) {…}
make_slice allocates and initializes a slice. Like new, the first argument is a type, not a value.
Unlike new, make's return value is the same as the type of its argument, not a pointer to it.
Note: Prefer using the procedure group make.
make_dynamic_array ¶
make_dynamic_array :: proc($T: typeid/[dynamic]$E, allocator := context.allocator, loc := #caller_location) -> (T, Allocator_Error) {…}
make_dynamic_array allocates and initializes a dynamic array. Like new, the first argument is a type, not a value.
Unlike new, make's return value is the same as the type of its argument, not a pointer to it.
Note: Prefer using the procedure group make.
make_dynamic_array_len ¶
make_dynamic_array_len :: proc($T: typeid/[dynamic]$E, #any_int len: int, allocator := context.allocator, loc := #caller_location) -> (T, Allocator_Error) {…}
make_dynamic_array_len allocates and initializes a dynamic array. Like new, the first argument is a type, not a value.
Unlike new, make's return value is the same as the type of its argument, not a pointer to it.
Note: Prefer using the procedure group make.
make_dynamic_array_len_cap ¶
make_dynamic_array_len_cap :: proc($T: typeid/[dynamic]$E, #any_int len: int, #any_int cap: int, allocator := context.allocator, loc := #caller_location) -> (array: T, err: Allocator_Error) {…}
make_dynamic_array_len_cap allocates and initializes a dynamic array. Like new, the first argument is a type, not a value.
Unlike new, make's return value is the same as the type of its argument, not a pointer to it.
Note: Prefer using the procedure group make.
make_map ¶
make_map :: proc($T: typeid/map[$K]$E, allocator := context.allocator, loc := #caller_location) -> (m: $/map[$K]$E) {…}
make_map initializes a map with an allocator. Like new, the first argument is a type, not a value.
Unlike new, make's return value is the same as the type of its argument, not a pointer to it.
Note: Prefer using the procedure group make.
make_map_cap ¶
make_map_cap :: proc($T: typeid/map[$K]$E, #any_int capacity: int, allocator := context.allocator, loc := #caller_location) -> (m: $/map[$K]$E, err: Allocator_Error) #optional_ok {…}
make_map_cap initializes a map with an allocator and allocates space using capacity.
Like new, the first argument is a type, not a value.
Unlike new, make's return value is the same as the type of its argument, not a pointer to it.
Note: Prefer using the procedure group make.
make_multi_pointer ¶
make_multi_pointer :: proc($T: typeid/[^]$E, #any_int len: int, allocator := context.allocator, loc := #caller_location) -> (mp: $/[^]$E, err: Allocator_Error) {…}
make_multi_pointer allocates and initializes a multi-pointer. Like new, the first argument is a type, not a value.
Unlike new, make's return value is the same as the type of its argument, not a pointer to it.
This is "similar" to doing raw_data(make([]E, len, allocator)).
Note: Prefer using the procedure group make.
clear_map ¶
clear_map :: proc "contextless" (m: ^$T/map[$K]$V) {…}
clear_map will set the length of a passed map to 0
Note: Prefer the procedure group clear
reserve_map ¶
reserve_map :: proc(m: ^$T/map[$K]$V, #any_int capacity: int, loc := #caller_location) -> Allocator_Error {…}
reserve_map will try to reserve memory of a passed map to the requested element count (setting the cap).
Note: Prefer the procedure group reserve
shrink_map ¶
shrink_map :: proc(m: ^$T/map[$K]$V, loc := #caller_location) -> (did_shrink: bool, err: Allocator_Error) {…}
Shrinks the capacity of a map down to the current length.
Note: Prefer the procedure group shrink
delete_key ¶
delete_key :: proc(m: ^$T/map[$K]$V, key: $K) -> (deleted_key: $K, deleted_value: $V) {…}
The delete_key built-in procedure deletes the element with the specified key (m[key]) from the map. If m is nil, or there is no such element, this procedure is a no-op
append_elem ¶
append_elem :: proc(array: ^$T/[dynamic]$E, #no_broadcast arg: $E, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_ok {…}
non_zero_append_elem ¶
non_zero_append_elem :: proc(array: ^$T/[dynamic]$E, #no_broadcast arg: $E, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_ok {…}
append_elems ¶
append_elems :: proc(array: ^$T/[dynamic]$E, .. #no_broadcast args: $T/..$E, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_ok {…}
non_zero_append_elems ¶
non_zero_append_elems :: proc(array: ^$T/[dynamic]$E, .. #no_broadcast args: $T/..$E, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_ok {…}
append_elem_string ¶
append_elem_string :: proc(array: ^[dynamic]u8, arg: string, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_ok {…}
non_zero_append_elem_string ¶
non_zero_append_elem_string :: proc(array: ^[dynamic]u8, arg: string, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_ok {…}
append_string ¶
append_string :: proc(array: ^[dynamic]u8, .. args: ..string, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_ok {…}
The append_string built-in procedure appends multiple strings to the end of a [dynamic]u8 like type
append_nothing ¶
append_nothing :: proc(array: ^$T/[dynamic]$E, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_ok {…}
inject_at_elem ¶
inject_at_elem :: proc(array: ^$T/[dynamic]$E, #any_int index: int, #no_broadcast arg: $E, loc := #caller_location) -> (ok: bool, err: Allocator_Error) #optional_ok {…}
inject_at_elems ¶
inject_at_elems :: proc(array: ^$T/[dynamic]$E, #any_int index: int, .. #no_broadcast args: $T/..$E, loc := #caller_location) -> (ok: bool, err: Allocator_Error) #optional_ok {…}
inject_at_elem_string ¶
inject_at_elem_string :: proc(array: ^[dynamic]u8, #any_int index: int, arg: string, loc := #caller_location) -> (ok: bool, err: Allocator_Error) #optional_ok {…}
assign_at_elem ¶
assign_at_elem :: proc(array: ^$T/[dynamic]$E, #any_int index: int, #no_broadcast arg: $E, loc := #caller_location) -> (ok: bool, err: Allocator_Error) #optional_ok {…}
assign_at_elems ¶
assign_at_elems :: proc(array: ^$T/[dynamic]$E, #any_int index: int, .. #no_broadcast args: $T/..$E, loc := #caller_location) -> (ok: bool, err: Allocator_Error) #optional_ok {…}
assign_at_elem_string ¶
assign_at_elem_string :: proc(array: ^[dynamic]u8, #any_int index: int, arg: string, loc := #caller_location) -> (ok: bool, err: Allocator_Error) #optional_ok {…}
clear_dynamic_array ¶
clear_dynamic_array :: proc "contextless" (array: ^$T/[dynamic]$E) {…}
clear_dynamic_array will set the length of a passed dynamic array to 0
Note: Prefer the procedure group clear.
reserve_dynamic_array ¶
reserve_dynamic_array :: proc(array: ^$T/[dynamic]$E, #any_int capacity: int, loc := #caller_location) -> Allocator_Error {…}
non_zero_reserve_dynamic_array ¶
non_zero_reserve_dynamic_array :: proc(array: ^$T/[dynamic]$E, #any_int capacity: int, loc := #caller_location) -> Allocator_Error {…}
resize_dynamic_array ¶
resize_dynamic_array :: proc(array: ^$T/[dynamic]$E, #any_int length: int, loc := #caller_location) -> Allocator_Error {…}
resize_dynamic_array will try to resize memory of a passed dynamic array or map to the requested element count (setting the len, and possibly cap).
Note: Prefer the procedure group resize
non_zero_resize_dynamic_array ¶
non_zero_resize_dynamic_array :: proc(array: ^$T/[dynamic]$E, #any_int length: int, loc := #caller_location) -> Allocator_Error {…}
map_insert ¶
map_insert :: proc(m: ^$T/map[$K]$V, key: $K, value: $V, loc := #caller_location) -> (ptr: ^$V) {…}
map_upsert ¶
map_upsert :: proc(m: ^$T/map[$K]$V, key: $K, value: $V, loc := #caller_location) -> (prev_key: $K, value_ptr: ^$V, found_previous: bool) {…}
Explicitly inserts a key and value into a map m, the same as map_insert, but the return values differ.
prev_key will return the previous pointer of a key if it exists, check found_previous if was previously found
value_ptr will return the pointer of the memory where the insertion happens, and nil if the map failed to resize
found_previous will be true a previous key was found
map_entry ¶
map_entry :: proc(m: ^$T/map[$K]$V, key: $K, loc := #caller_location) -> (key_ptr: ^$K, value_ptr: ^$V, just_inserted: bool, err: Allocator_Error) {…}
Retrieves a pointer to the key and value for a possibly just inserted entry into the map.
If the key was not in the map m, an entry is inserted with the zero value and just_inserted will be true.
Otherwise the existing entry is left untouched and pointers to its key and value are returned.
If the map has to grow in order to insert the entry and the allocation fails, err is set and returned.
If err is nil, key_ptr and value_ptr are valid pointers and will not be nil.
WARN: User modification of the key pointed at by key_ptr should only be done if the new key is equal to (in hash) the old key.
If that is not the case you will corrupt the map.
assert ¶
assert :: proc(condition: bool, message: string = #caller_expression(condition), loc := #caller_location) {…}
ensure ¶
ensure :: proc(condition: bool, message: string = #caller_expression(condition), loc := #caller_location) {…}
Evaluates the condition and aborts the program iff the condition is
false. This routine ignores ODIN_DISABLE_ASSERT, and will always
execute.
panic ¶
panic :: proc(message: string, loc := #caller_location) -> ! {…}
unimplemented ¶
unimplemented :: proc(message: string = "", loc := #caller_location) -> ! {…}
assert_contextless ¶
assert_contextless :: proc "contextless" (condition: bool, message: string = #caller_expression(condition), loc := #caller_location) {…}
ensure_contextless ¶
ensure_contextless :: proc "contextless" (condition: bool, message: string = #caller_expression(condition), loc := #caller_location) {…}
panic_contextless ¶
panic_contextless :: proc "contextless" (message: string, loc := #caller_location) -> ! {…}
unimplemented_contextless ¶
unimplemented_contextless :: proc "contextless" (message: string = "", loc := #caller_location) -> ! {…}
Procedure Groups
copy ¶
copy :: proc{ copy_slice, copy_from_string, copy_from_string16, }
copy is a built-in procedure that copies elements from a source slice/string src to a destination slice dst.
The source and destination may overlap. Copy returns the number of elements copied, which will be the minimum
of len(src) and len(dst).
make_soa ¶
make_soa :: proc{ make_soa_slice, make_soa_dynamic_array, make_soa_dynamic_array_len, make_soa_dynamic_array_len_cap, }
clear ¶
clear :: proc{ clear_dynamic_array, clear_map, clear_soa_dynamic_array, }
clear will set the length of a passed dynamic array or map to 0
reserve ¶
reserve :: proc{ reserve_dynamic_array, reserve_map, reserve_soa, }
reserve will try to reserve memory of a passed dynamic array or map to the requested element count (setting the cap).
non_zero_reserve ¶
non_zero_reserve :: proc{ non_zero_reserve_dynamic_array, non_zero_reserve_soa, }
resize ¶
resize :: proc{ resize_dynamic_array, resize_soa, }
resize will try to resize memory of a passed dynamic array to the requested element count (setting the len, and possibly cap).
non_zero_resize ¶
non_zero_resize :: proc{ non_zero_resize_dynamic_array, non_zero_resize_soa, }
append_soa ¶
append_soa :: proc{ append_soa_elem, append_soa_elems, }
The append_soa built-in procedure appends elements to the end of an #soa dynamic array
shrink ¶
shrink :: proc{ shrink_dynamic_array, shrink_map, }
Shrinks the capacity of a dynamic array or map down to the current length, or the given capacity.
delete_soa ¶
delete_soa :: proc{ delete_soa_slice, delete_soa_dynamic_array, }
free ¶
free :: proc{ mem_free, }
free will try to free the passed pointer, with the given allocator if the allocator supports this operation.
clear_soa ¶
clear_soa :: proc{ clear_soa_dynamic_array, }
free_all ¶
free_all :: proc{ mem_free_all, }
free_all will try to free/reset all of the memory of the given allocator if the allocator supports this operation.
delete ¶
delete :: proc{ delete_string, delete_cstring, delete_dynamic_array, delete_slice, delete_map, delete_soa_slice, delete_soa_dynamic_array, delete_string16, delete_cstring16, }
delete will try to free the underlying data of the passed built-in data structure (string, cstring, dynamic array, slice, or map), with the given allocator if the allocator supports this operation.
Note: Prefer delete over the specific delete_* procedures where possible.
make ¶
make :: proc{ make_slice, make_dynamic_array, make_dynamic_array_len, make_dynamic_array_len_cap, make_map, make_map_cap, make_multi_pointer, make_soa_slice, make_soa_dynamic_array, make_soa_dynamic_array_len, make_soa_dynamic_array_len_cap, }
make built-in procedure allocates and initializes a value of type slice, dynamic array, map, or multi-pointer (only).
Similar to new, the first argument is a type, not a value. Unlike new, make's return type is the same as the
type of its argument, not a pointer to it.
Make uses the specified allocator, default is context.allocator.
append ¶
append :: proc{ append_elem, append_elems, append_elem_string, append_soa_elem, append_soa_elems, }
The append built-in procedure appends elements to the end of a dynamic array
non_zero_append ¶
non_zero_append :: proc{ non_zero_append_elem, non_zero_append_elems, non_zero_append_elem_string, non_zero_append_soa_elem, non_zero_append_soa_elems, }
inject_at ¶
inject_at :: proc{ inject_at_elem, inject_at_elems, inject_at_elem_string, }
assign_at ¶
assign_at :: proc{ assign_at_elem, assign_at_elems, assign_at_elem_string, }