Взаимодействие с Си и C++
Си
object f64
val min "DBL_MIN" : f64
val max "DBL_MAX" : f64
val epsilon "DBL_EPSILON" : f64
Внешние константы DBL_MIN
, DBL_MAX
и DBL_EPSILON
представлены полями объекта f64
.
Типы
type i32 @c
type CChar "char"
Атрибут @c
нужен в случае, если имя типа совпадает с внешним.
type VkInstance = MutPtr
type CString = ptr CChar
Именованный кортеж с единственным элементом в Си коде представлен как тип элемента, поэтому в объявлениях внешних функций VkInstance
и CString
можно использовать вместо void*
и char const*
.
typealias DebugUtilsMessengerCallbackExt = fn
(message_severity : DebugUtilsMessageSeverityFlagsExt)
* (message_types : DebugUtilsMessageTypeFlagsExt)
* (callback_data : ptr DebugUtilsMessengerCallbackDataExt)
* (user_data : MutPtr) -> u32
typealias CharFun = fn GlfwWindow * u32 -> Unit
Псевдонимы для типов указателей на функцию.
type SampleCountFlags = flags
| 1
| 2
| 4
| 8
| 16
| 32
| 64
Символы флагов могут быть числами или начинаться с цифры.
type InstanceCreateInfo = struct
type : StructureType
next : Ptr
flags : InstanceCreateFlags
application_info : ptr ApplicationInfo
enabled_layer_count : u32
enabled_layer_names : ptr CString
enabled_extension_count : u32
enabled_extension_names : ptr CString
type ClearValue = union
color : ClearColorValue
depth_stencil : ClearDepthStencilValue
Структуры и объединения соответствуют одноимённым конструкциям Си.
Функции
module vk
def create_semaphore "vkCreateSemaphore"
(device : VkDevice)
(create_info : ptr SemaphoreCreateInfo)
(allocator : Allocator)
(semaphore : mut ptr VkSemaphore) : Result
endmodule
Библиотечная функция vkCreateSemaphore
доступна под именем vk/create_semaphore
.
def create_semaphore (device : VkDevice) =
let semaphore_create_info = SemaphoreCreateInfo
type = StructureType/SemaphoreCreateInfo
next = null
flags = SemaphoreCreateFlags@zero
let mut semaphore = null
vk/create_semaphore device semaphore_create_info@ptr null
semaphore@mut_ptr
|> assert_success
semaphore
Модификаторы @ptr
и @mut_ptr
возвращают указатель на значение, @fn
— указатель на функцию, @zero
— обнулённый блок памяти.
type f32 @c =
def sin "sinf" : f32
def cos "cosf" : f32
type f64 @c =
def sin : f64
def cos : f64
Внешняя функция может быть методом.
C++
type TileMode "SkTileMode" =
| Clamp "kClamp"
| Repeat "kRepeat"
| Mirror "kMirror"
| Decal "kDecal"
| Last "kLastTileMode" = Decal
TileMode
это перечисление.
type List<T> "std::vector" =
def add "push_back" (x : T)
let erase (iterator : Iterator) : Iterator
let begin () : Iterator
def remove_at (i : i32) =
erase (begin + i) |> ignore
List
распознаётся в качестве C++ типа, так как имя в кавычках содержит двойное двоеточие. В ином случае понадобится атрибут @cpp
.
C++ типы имеют такую же семантику перемещения, как и определённые с атрибутом @move
, и могут быть ими унаследованы.