1#ifndef TAMER_XADAPTER_HH
2#define TAMER_XADAPTER_HH 1
24extern char placeholder_buffer[64];
26class with_helper_rendezvous :
public functional_rendezvous,
27 public zero_argument_rendezvous_tag<with_helper_rendezvous> {
29 with_helper_rendezvous(simple_event *e,
int *s0,
int v0)
30 : functional_rendezvous(hook), e_(e), s0_(s0), v0_(v0) {
36 static void hook(functional_rendezvous *fr, simple_event *,
bool) TAMER_NOEXCEPT;
39template <
typename... TS>
40inline event<> with_helper(event<TS...> e,
int *result,
int value) {
41 with_helper_rendezvous *r =
new with_helper_rendezvous(e.__get_simple(), result, value);
48template <
size_t I,
typename VI,
typename... TS>
49class bind_rendezvous :
public functional_rendezvous,
50 public zero_argument_rendezvous_tag<bind_rendezvous<I, VI, TS...> > {
52 bind_rendezvous(event<TS...>&& e, VI vi)
53 : functional_rendezvous(hook), e_(std::move(e)), vi_(std::move(vi)) {
55 event<> make_bound() {
56 event<> bound = TAMER_MAKE_FN_ANNOTATED_EVENT(*
this);
63 static void hook(functional_rendezvous*, simple_event*,
bool) TAMER_NOEXCEPT;
66template <
size_t I,
typename VI,
typename... TS>
67void bind_rendezvous<I, VI, TS...>::hook(functional_rendezvous* fr, simple_event*,
bool) TAMER_NOEXCEPT {
68 bind_rendezvous<I, VI, TS...>* self =
static_cast<bind_rendezvous<I, VI, TS...
>*>(fr);
69 self->e_.template set_result<I>(self->vi_);
70 if (simple_event* se = self->e_.__release_simple()) {
71 se->simple_trigger(
true);
77template <
typename T,
typename U>
struct tuple_cons;
78template <
typename T,
typename... TS>
struct tuple_cons<T, std::tuple<TS...> > {
79 typedef std::tuple<T, TS...> type;
82template <
typename... TS>
struct ignore_analysis;
83template <>
struct ignore_analysis<> {
84 typedef std::tuple<> type;
85 static const bool use_placeholder =
true;
86 static const bool empty =
true;
88template <
typename... TS>
struct ignore_analysis<void, TS...> {
89 typedef typename ignore_analysis<TS...>::type type;
90 static const bool use_placeholder = ignore_analysis<TS...>::use_placeholder;
91 static const bool empty = ignore_analysis<TS...>::empty;
93template <
typename T,
typename... TS>
struct ignore_analysis<T, TS...> {
94 typedef typename tuple_cons<T,
typename ignore_analysis<TS...>::type>::type type;
95 static const bool use_placeholder = ignore_analysis<TS...>::use_placeholder && std::is_trivial<T>::value &&
sizeof(type) <=
sizeof(placeholder_buffer);
96 static const bool empty =
false;
99template <
bool USE_PLACEHOLDER,
typename... TS>
struct ignore_binder;
101template <
typename... TS>
struct ignore_binder<false, TS...> {
102 typedef typename ignore_analysis<TS...>::type results_tuple_type;
103 static event<TS...> make(event<> e) {
104 results_tuple_type* vs =
new results_tuple_type;
105 simple_event::at_trigger(e.__get_simple(), deleter, vs);
106 return event<TS...>(std::move(e), *vs);
108 static void deleter(
void* x) {
109 delete static_cast<results_tuple_type*
>(x);
113template <
typename... TS>
struct ignore_binder<true, TS...> {
114 typedef typename ignore_analysis<TS...>::type results_tuple_type;
115 static event<TS...> make(event<> e) {
116 return event<TS...>(std::move(e), *
new(placeholder_buffer) results_tuple_type);
120template <
typename... TS>
struct rebinder {
121 static event<TS...> make(event<> e) {
122 return ignore_binder<ignore_analysis<TS...>::use_placeholder, TS...>::make(e);
127template <
typename T>
struct decay {
public:
typedef T type; };
128template <
typename T0,
typename T1>
struct decay<T0(T1)> {
public:
typedef T0 (*type)(T1); };
130template <
typename S0,
typename T0,
typename F>
131class map_rendezvous :
public functional_rendezvous,
132 public zero_argument_rendezvous_tag<map_rendezvous<S0, T0, F> > {
134 map_rendezvous(
const F& f,
const event<T0>& e)
135 : functional_rendezvous(hook), f_(f), e_(e) {
142 typename decay<F>::type f_;
144 static void hook(functional_rendezvous *, simple_event *,
bool) TAMER_NOEXCEPT;
147template <
typename S0,
typename T0,
typename F>
148void map_rendezvous<S0, T0, F>::hook(functional_rendezvous *fr,
149 simple_event *,
bool values) TAMER_NOEXCEPT {
150 map_rendezvous *self =
static_cast<map_rendezvous *
>(fr);
152 self->e_.trigger(self->f_(self->s0_));
153 }
else if (self->e_) {
154 self->e_.unblocker().trigger();
160template <
typename F,
typename A1=
void,
typename A2=
void>
161class function_rendezvous;
163template <
typename F,
typename A1,
typename A2>
164class function_rendezvous :
public functional_rendezvous,
165 public zero_argument_rendezvous_tag<function_rendezvous<F, A1, A2> > {
167 function_rendezvous(F f, A1 arg1, A2 arg2)
168 : functional_rendezvous(hook), f_(std::move(f)),
169 arg1_(std::move(arg1)), arg2_(std::move(arg2)) {
175 static void hook(functional_rendezvous*, simple_event*,
bool) TAMER_NOEXCEPT;
178template <
typename F,
typename A1,
typename A2>
179void function_rendezvous<F, A1, A2>::hook(functional_rendezvous* fr,
181 bool) TAMER_NOEXCEPT {
182 function_rendezvous<F, A1, A2>* self =
static_cast<function_rendezvous<F, A1, A2>*
>(fr);
184 self->remove_waiting();
185 self->f_(std::move(self->arg1_), std::move(self->arg2_));
190template <
typename F,
typename A>
191class function_rendezvous<F, A> :
public functional_rendezvous,
192 public zero_argument_rendezvous_tag<function_rendezvous<F, A> > {
194 function_rendezvous(F f, A arg)
195 : functional_rendezvous(hook), f_(std::move(f)),
196 arg_(std::move(arg)) {
201 static void hook(functional_rendezvous*, simple_event*,
bool) TAMER_NOEXCEPT;
204template <
typename F,
typename A>
205void function_rendezvous<F, A, void>::hook(functional_rendezvous* fr,
207 bool) TAMER_NOEXCEPT {
208 function_rendezvous<F, A, void>* self =
static_cast<function_rendezvous<F, A, void>*
>(fr);
210 self->remove_waiting();
211 self->f_(std::move(self->arg_));
217class function_rendezvous<F> :
public functional_rendezvous,
218 public zero_argument_rendezvous_tag<function_rendezvous<F> > {
220 function_rendezvous(F f)
221 : functional_rendezvous(hook), f_(std::move(f)) {
225 static void hook(functional_rendezvous*, simple_event*,
bool) TAMER_NOEXCEPT;
229void function_rendezvous<F, void, void>::hook(functional_rendezvous* fr,
231 bool) TAMER_NOEXCEPT {
232 function_rendezvous<F>* self =
static_cast<function_rendezvous<F>*
>(fr);
234 self->remove_waiting();
241class push_back_rendezvous :
public functional_rendezvous,
242 public zero_argument_rendezvous_tag<push_back_rendezvous<C> > {
244 typedef typename C::value_type value_type;
245 push_back_rendezvous(C& c)
246 : functional_rendezvous(hook), c_(c) {
254 static void hook(functional_rendezvous*, simple_event*,
bool) TAMER_NOEXCEPT;
258void push_back_rendezvous<C>::hook(functional_rendezvous* fr,
260 bool values) TAMER_NOEXCEPT {
261 push_back_rendezvous<C>* self =
static_cast<push_back_rendezvous<C>*
>(fr);
262 self->remove_waiting();
264 self->c_.push_back(std::move(self->slot_));
270template <
typename It>
271class output_rendezvous :
public functional_rendezvous,
272 public zero_argument_rendezvous_tag<output_rendezvous<It> > {
274 typedef typename std::iterator_traits<It>::value_type value_type;
275 output_rendezvous(It& it)
276 : functional_rendezvous(hook), it_(it) {
284 static void hook(functional_rendezvous*, simple_event*,
bool) TAMER_NOEXCEPT;
287template <
typename It>
288void output_rendezvous<It>::hook(functional_rendezvous* fr,
290 bool values) TAMER_NOEXCEPT {
291 output_rendezvous<It>* self =
static_cast<output_rendezvous<It>*
>(fr);
292 self->remove_waiting();
294 *self->it_ = std::move(self->slot_);
Functions for registering primitive events and managing the event loop.
The event template classes and helper functions.
event< T0, T1, T2, T3 > make_event(one_argument_rendezvous_tag< R > &r, const I &eid, T0 &x0, T1 &x1, T2 &x2, T3 &x3)
Construct a four-result event on rendezvous r with ID eid.
Definition event.hh:1115
Namespace containing public Tamer classes and functions for the Tamer core.
Definition adapter.hh:17