An open API service indexing awesome lists of open source software.

https://github.com/sharksforarms/variyak

macro to call variadic functions using data from a container
https://github.com/sharksforarms/variyak

rust-macro variadic

Last synced: 4 months ago
JSON representation

macro to call variadic functions using data from a container

Awesome Lists containing this project

README

          

# Variyak

[![Latest Version](https://img.shields.io/crates/v/variyak.svg)](https://crates.io/crates/variyak)
[![Rust Documentation](https://docs.rs/variyak/badge.svg)](https://docs.rs/variyak)
[![Actions Status](https://github.com/sharksforarms/variyak/workflows/CI/badge.svg)](https://github.com/sharksforarms/variyak/actions)

This crate provides a macro `call_variadic` which can be used to construct boilerplate code
to call variadic functions using data from a container such as a Vec.

Example:

```rust
#![feature(c_variadic)]

use variyak::call_variadic;

fn main() {
let data = vec![1, 2];
let arg = 0;

mod test {
#[no_mangle]
pub unsafe extern "C" fn my_func(_fixed: u32, mut _args: ...) -> bool {
true
}
}

unsafe {
assert!(call_variadic!(
test::my_func(arg, ...) // function to call, `...` is the variadic arguments
data, // container identifier
n, // index identifier
data[n], // argument expression: get `argument` at index `n`
2, // maximum number of arguments to expand
));
}

unsafe {
use test::my_func;
assert!(call_variadic!(my_func(arg, ...), data, n, data[n], 2));
assert!(call_variadic!(my_func(arg, ...), data, n, data[n], 2));
assert!(call_variadic!(my_func(arg, arg, ..., arg), data, n, data[n], 2));
assert!(call_variadic!(my_func(arg, ..., arg), data, n, data[n], 2));
assert!(call_variadic!(my_func(arg, 42 + 27, ..., arg, 10usize), data, n, data[n], 2));
};
}
```