Информация об изменениях

Сообщение Re: Метод класс как С колбек от 09.04.2015 11:42

Изменено 09.04.2015 11:44 Evgeny.Panasyuk

Здравствуйте, AHOHUM, Вы писали:

AHO>Имеется С библиотека с неизменяемым интерфейсом, одна из функций выглядит так:

AHO>
AHO>typedef void(*Callback)(void * internalState, Data * data);
AHO>void addCallback(void * internalState, Callback * callback);
AHO>

AHO>internalState – сугубо внутренняя структура библиотеки, data – данные получаемые из библиотеки, т.е. никаких void * userData нет.

1. Где создаётся и удаляется internalState? На нашей стороне?
2. В callback передаётся именно тот указатель internalState который был передан в addCallback?

I. Если на оба вопроса ответ да — то можно к нему прицепом нагрузить наши данные. То есть:
struct StateWithPayload
{
    OurData payload;
    InternalState internalState;
};
А callback будет доставать payload через offsetof.

II. Есть ответ да только на второй вопрос — то можно создать отображение из *internalState в наши данные, например unordered_map<void*, OurData> — и callback будет знать из какой ячейки доставать payload.
Re: Метод класс как С колбек
Здравствуйте, AHOHUM, Вы писали:

AHO>Имеется С библиотека с неизменяемым интерфейсом, одна из функций выглядит так:

AHO>
AHO>typedef void(*Callback)(void * internalState, Data * data);
AHO>void addCallback(void * internalState, Callback * callback);
AHO>

AHO>internalState – сугубо внутренняя структура библиотеки, data – данные получаемые из библиотеки, т.е. никаких void * userData нет.

1. Где создаётся и удаляется internalState? На нашей стороне?
2. В callback передаётся именно тот указатель internalState который был передан в addCallback?

I. Если на оба вопроса ответ да — то можно к нему прицепом нагрузить наши данные. То есть:
struct StateWithPayload
{
    OurData payload;
    InternalState internalState;
};
А callback будет доставать payload через offsetof.

II. Если ответ да только на второй вопрос — то можно создать отображение из *internalState в наши данные, например unordered_map<void*, OurData> — и callback будет знать из какой ячейки доставать payload.