71 lines
1.4 KiB
C++
71 lines
1.4 KiB
C++
|
|
#include "future.h"
|
||
|
|
struct promise
|
||
|
|
{
|
||
|
|
struct future f;
|
||
|
|
void * ctx;
|
||
|
|
promise_ctx_destroy_cb* cb_ctx_destroy;
|
||
|
|
};
|
||
|
|
struct future
|
||
|
|
{
|
||
|
|
void * user;
|
||
|
|
future_success_cb * cb_success;
|
||
|
|
future_failed_cb * cb_failed;
|
||
|
|
};
|
||
|
|
|
||
|
|
inline struct future* promise_to_future(struct promise* p)
|
||
|
|
{
|
||
|
|
return p->f;
|
||
|
|
}
|
||
|
|
inline struct promise* future_to_promise(struct future* f)
|
||
|
|
{
|
||
|
|
return (struct promise*)f;
|
||
|
|
}
|
||
|
|
struct future* future_create(future_success_cb * cb_success, future_failed_cb * cb_failed, void * user)
|
||
|
|
{
|
||
|
|
struct promise* p=ALLOC(struct promise, 1);
|
||
|
|
p->f.user=user;
|
||
|
|
p->f.cb_success=cb_success;
|
||
|
|
p->f.cb_failed=cb_failed;
|
||
|
|
return p->f;
|
||
|
|
}
|
||
|
|
void future_destroy(struct future * f)
|
||
|
|
{
|
||
|
|
struct promise* promise=future_to_promise(f);
|
||
|
|
if(promise->cb_ctx_destroy!=NULL)
|
||
|
|
{
|
||
|
|
promise->cb_ctx_destroy(promise);
|
||
|
|
}
|
||
|
|
memset(promise,0,sizeof(struct promise));
|
||
|
|
free(promise);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
void promise_failed(struct promise* p, enum e_future_error error, const char* what)
|
||
|
|
{
|
||
|
|
p->f.cb_failed(error, what,p->f.user);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
void promise_success(struct promise* p, void *result)
|
||
|
|
{
|
||
|
|
p->f.cb_success(result, p->f.user);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
void promise_set_ctx(struct promise* p,void* ctx, promise_ctx_destroy_cb* cb)
|
||
|
|
{
|
||
|
|
p->ctx=ctx;
|
||
|
|
p->cb_ctx_destroy=cb;
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
void* promise_get_ctx(struct promise* p)
|
||
|
|
{
|
||
|
|
return p->ctx;
|
||
|
|
}
|
||
|
|
void* promise_dettach_ctx(struct promise* p)
|
||
|
|
{
|
||
|
|
void* ctx=p->ctx;
|
||
|
|
p->ctx=NULL;
|
||
|
|
p->cb_ctx_destroy=NULL;
|
||
|
|
return ctx;
|
||
|
|
}
|
||
|
|
|