Как мне указать, что пользовательские данные предоставляются до параметра обратного вызова в Vala?

У меня есть C API, который выглядит так:

typedef void (*cprcen_channel_callback) (CPRC_abuf *abuf, void *user_data);
int CPRCEN_engine_set_callback(CPRCEN_engine *eng, CPRCEN_channel_handle chan,
    void *userdata, cprcen_channel_callback callback);

Как видите, CPRCEN_engine_set_callback Функция принимает пользовательские данные перед обратным вызовом, тогда как по умолчанию Vala ожидает, что они придут после. Я знаю о CCode атрибута delegate_target_pos параметр, но независимо от того, какую позицию я указываю, userdata значение предоставляется в качестве первого аргумента вместо третьего в сгенерированном вызове функции. Я просто не могу обернуться вокруг логики позиционирования параметров Vala.

Вот как я хотел бы, чтобы привязка в конечном итоге выглядела:

[CCode(cname = "cprcen_channel_callback", has_target = true)]
public delegate void ChannelCallback(AudioBuffer abuf);

[Compact]
[CCode(cname = "CPRCEN_engine")]
public class Engine {
    [CCode(cname = "CPRCEN_engine_set_callback")]
    public int set_channel_callback(ChannelHandle chan, ChannelCallback callback);
}

Как мне сделать эту работу?

1 ответ

Решение

1.5 должно сработать:

[CCode(cname = "CPRCEN_engine_set_callback")]
public int set_channel_callback(ChannelHandle chan, [CCode (delegate_target_pos = 1.5)] ChannelCallback callback);

Логика довольно проста. 1.5 находится между первым аргументом (chan) и вторым (callback). Если вы хотите, чтобы между вторым и третьим вы могли использовать 2.5, и так далее.

Вещи только начинают немного усложняться, когда вы хотите, чтобы они предшествовали экземпляру - в этом случае вы должны использовать что-то между 0 и 1 (например, 0,5) и использовать атрибут CCode instance_pos, чтобы установить для экземпляра значение меньше 1, но больше чем 0,5 (например, 0,9).

Другие вопросы по тегам