///|
extern "c" fn frame_pool_create_ffi(capacity : Int, frame_size : Int) -> Int = "lockwire_native_frame_pool_create"

///|
extern "c" fn frame_pool_destroy_ffi(pool_id : Int) -> Int = "lockwire_native_frame_pool_destroy"

///|
extern "c" fn frame_pool_acquire_ffi(pool_id : Int) -> Int = "lockwire_native_frame_pool_acquire"

///|
extern "c" fn frame_pool_acquire_rx_ffi(pool_id : Int) -> Int = "lockwire_native_frame_pool_acquire_rx"

///|
extern "c" fn frame_pool_release_ffi(pool_id : Int, slot : Int) -> Int = "lockwire_native_frame_pool_release"

///|
extern "c" fn frame_pool_mark_filled_ffi(
  pool_id : Int,
  slot : Int,
  length : Int,
) -> Int = "lockwire_native_frame_pool_mark_filled"

///|
extern "c" fn frame_pool_mark_sending_ffi(pool_id : Int, slot : Int) -> Int = "lockwire_native_frame_pool_mark_sending"

///|
extern "c" fn frame_pool_mark_sent_ffi(pool_id : Int, slot : Int) -> Int = "lockwire_native_frame_pool_mark_sent"

///|
extern "c" fn frame_pool_mark_received_ffi(
  pool_id : Int,
  slot : Int,
  length : Int,
) -> Int = "lockwire_native_frame_pool_mark_received"

///|
extern "c" fn frame_pool_free_count_ffi(pool_id : Int) -> Int = "lockwire_native_frame_pool_free_count"

///|
extern "c" fn frame_pool_slot_state_ffi(pool_id : Int, slot : Int) -> Int = "lockwire_native_frame_pool_slot_state"

///|
extern "c" fn frame_pool_slot_length_ffi(pool_id : Int, slot : Int) -> Int = "lockwire_native_frame_pool_slot_length"

///|
#borrow(src)
extern "c" fn frame_pool_write_ffi(
  pool_id : Int,
  slot : Int,
  offset : Int,
  src : FixedArray[Byte],
  count : Int,
) -> Int = "lockwire_native_frame_pool_write"

///|
#borrow(dst)
extern "c" fn frame_pool_read_into_ffi(
  pool_id : Int,
  slot : Int,
  offset : Int,
  dst : FixedArray[Byte],
  count : Int,
) -> Int = "lockwire_native_frame_pool_read_into"

///|
extern "c" fn frame_pool_copy_ffi(
  pool_id : Int,
  src_slot : Int,
  dst_slot : Int,
  count : Int,
) -> Int = "lockwire_native_frame_pool_copy"

///|
fn ffi_frame_pool_create(capacity : Int, frame_size : Int) -> Int {
  frame_pool_create_ffi(capacity, frame_size)
}

///|
fn ffi_frame_pool_destroy(pool_id : Int) -> Int {
  frame_pool_destroy_ffi(pool_id)
}

///|
fn ffi_frame_pool_acquire(pool_id : Int) -> Int {
  frame_pool_acquire_ffi(pool_id)
}

///|
fn ffi_frame_pool_acquire_rx(pool_id : Int) -> Int {
  frame_pool_acquire_rx_ffi(pool_id)
}

///|
fn ffi_frame_pool_release(pool_id : Int, slot : Int) -> Int {
  frame_pool_release_ffi(pool_id, slot)
}

///|
fn ffi_frame_pool_mark_filled(pool_id : Int, slot : Int, length : Int) -> Int {
  frame_pool_mark_filled_ffi(pool_id, slot, length)
}

///|
fn ffi_frame_pool_mark_sending(pool_id : Int, slot : Int) -> Int {
  frame_pool_mark_sending_ffi(pool_id, slot)
}

///|
fn ffi_frame_pool_mark_sent(pool_id : Int, slot : Int) -> Int {
  frame_pool_mark_sent_ffi(pool_id, slot)
}

///|
fn ffi_frame_pool_mark_received(pool_id : Int, slot : Int, length : Int) -> Int {
  frame_pool_mark_received_ffi(pool_id, slot, length)
}

///|
fn ffi_frame_pool_free_count(pool_id : Int) -> Int {
  frame_pool_free_count_ffi(pool_id)
}

///|
fn ffi_frame_pool_slot_state(pool_id : Int, slot : Int) -> Int {
  frame_pool_slot_state_ffi(pool_id, slot)
}

///|
fn ffi_frame_pool_slot_length(pool_id : Int, slot : Int) -> Int {
  frame_pool_slot_length_ffi(pool_id, slot)
}

///|
fn ffi_frame_pool_write(
  pool_id : Int,
  slot : Int,
  offset : Int,
  src : FixedArray[Byte],
  count : Int,
) -> Int {
  frame_pool_write_ffi(pool_id, slot, offset, src, count)
}

///|
fn ffi_frame_pool_read_into(
  pool_id : Int,
  slot : Int,
  offset : Int,
  dst : FixedArray[Byte],
  count : Int,
) -> Int {
  frame_pool_read_into_ffi(pool_id, slot, offset, dst, count)
}

///|
fn ffi_frame_pool_copy(
  pool_id : Int,
  src_slot : Int,
  dst_slot : Int,
  count : Int,
) -> Int {
  frame_pool_copy_ffi(pool_id, src_slot, dst_slot, count)
}