32template <
typename T0,
typename T1,
typename T2,
typename T3>
35 return e1 += std::move(e2);
38#if TAMER_HAVE_PREEVENT
39template <
typename R,
typename T0>
40inline event<T0>
operator+(event<T0> e1, preevent<R, T0>&& e2) {
41 return e1 += std::move(e2);
44template <
typename R,
typename T0>
46 return e2 += std::move(e1);
59template <
typename T0,
typename T1,
typename T2,
typename T3>
62 return e1 += std::move(e2);
73template <
typename T0,
typename T1,
typename T2,
typename T3>
78 return e1 += std::move(e3);
81#if TAMER_HAVE_PREEVENT
82template <
typename R,
typename T0>
83inline event<T0>
all(event<T0> e1, preevent<R, T0>&& e2) {
84 return e1 += std::move(e2);
87template <
typename R,
typename T0>
89 return e2 += std::move(e1);
103template <
size_t I = 0,
typename VI = void,
typename... TS>
105 tamerpriv::bind_rendezvous<I, VI, TS...>* r =
106 new tamerpriv::bind_rendezvous<I, VI, TS...>(std::move(e), std::move(vi));
107 return r->make_bound();
110#if TAMER_HAVE_PREEVENT
111template <
typename R,
typename T0,
typename V0>
112inline event<>
bind(preevent<R, T0>&& pe, V0 v0) {
113 return bind(event<T0>(std::move(pe)), std::move(v0));
126template <
typename... TS>
128 return tamerpriv::rebinder<TS...>::make(e);
131template <
typename T0>
132inline event<T0>
rebind(event<> e, T0& s0) {
133 return event<T0>(std::move(e), s0);
136#if TAMER_HAVE_PREEVENT
137template <
typename T0,
typename R>
139 return tamerpriv::rebinder<T0>::make(std::move(pe));
142template <
typename T0,
typename R>
159template <
typename S0,
typename T0,
typename F>
161 tamerpriv::map_rendezvous<S0, T0, F> *r =
162 new tamerpriv::map_rendezvous<S0, T0, F>(std::move(f), e);
163 event<S0> mapped = TAMER_MAKE_FN_ANNOTATED_EVENT(*r, r->result0());
168#if TAMER_HAVE_PREEVENT
169template <
typename S0,
typename R,
typename T0,
typename F>
170event<S0>
map(preevent<R, T0>&& pe, F f) {
171 event<T0> e(std::move(pe));
172 tamerpriv::map_rendezvous<S0, T0, F> *r =
173 new tamerpriv::map_rendezvous<S0, T0, F>(std::move(f), e);
174 event<S0> mapped = TAMER_MAKE_FN_ANNOTATED_EVENT(*r, r->result0());
175 e.at_trigger(mapped.unblocker());
195template <
size_t I = 0,
typename V = void,
typename... TS>
201template <
size_t I = 0,
typename V = void,
typename... TS>
202inline event<TS...>
add_timeout(
double delay, event<TS...> e, V v) {
207template <
size_t I = 0,
typename V = void,
typename... TS>
208inline event<TS...> add_timeout_sec(
int delay,
event<TS...> e, V v) {
213template <
size_t I = 0,
typename V = void,
typename... TS>
214inline event<TS...> add_timeout_msec(
int delay,
event<TS...> e, V v) {
219#if TAMER_HAVE_PREEVENT
220template <
typename R,
typename T0>
225template <
typename R,
typename T0>
230template <
typename R,
typename T0>
231inline event<T0> add_timeout_sec(
int delay, preevent<R, T0>&& pe, T0 v) {
232 return add_timeout_sec(delay,
event<T0>(std::move(pe)), std::move(v));
235template <
typename R,
typename T0>
236inline event<T0> add_timeout_msec(
int delay, preevent<R, T0>&& pe, T0 v) {
237 return add_timeout_msec(delay,
event<T0>(std::move(pe)), std::move(v));
254template <
typename... TS>
260template <
typename... TS>
261inline event<TS...>
add_timeout(
double delay, event<TS...> e) {
266template <
typename... TS>
267inline event<TS...> add_timeout_sec(
int delay,
event<TS...> e) {
272template <
typename... TS>
273inline event<TS...> add_timeout_msec(
int delay,
event<TS...> e) {
278#if TAMER_HAVE_PREEVENT
279template <
typename T0,
typename R>
284template <
typename T0,
typename R>
289template <
typename T0,
typename R>
290inline event<T0> add_timeout_sec(
int delay, preevent<R, T0>&& pe) {
291 return add_timeout_sec(delay,
event<T0>(std::move(pe)));
294template <
typename T0,
typename R>
295inline event<T0> add_timeout_msec(
int delay, preevent<R, T0>&& pe) {
296 return add_timeout_msec(delay,
event<T0>(std::move(pe)));
310template <
typename T0>
316#if TAMER_HAVE_PREEVENT
317template <
typename R,
typename T0>
318inline event<T0>
add_signal(
int signo, preevent<R, T0>&& pe, T0 v) {
319 return add_signal(signo, event<T0>(std::move(pe)), std::move(v));
334template <
typename T0,
typename SigInputIterator>
337 for (; first != last; ++first) {
343#if TAMER_HAVE_PREEVENT
344template <
typename R,
typename T0,
typename SigInputIterator>
345inline event<T0>
add_signal(SigInputIterator first, SigInputIterator last, preevent<R, T0>&& pe, T0 v) {
346 return add_signal(first, last, event<T0>(std::move(pe)), std::move(v));
358template <
typename T0>
364#if TAMER_HAVE_PREEVENT
365template <
typename T0,
typename R>
366inline event<T0>
add_signal(
int signo, preevent<R, T0>&& pe) {
367 return add_signal(signo, event<T0>(std::move(pe)));
381template <
typename T0,
typename SigInputIterator>
383 for (; first != last; ++first) {
389#if TAMER_HAVE_PREEVENT
390template <
typename T0,
typename R,
typename SigInputIterator>
391inline event<T0>
add_signal(SigInputIterator first, SigInputIterator last, preevent<R, T0>&& pe) {
392 return add_signal(first, last, event<T0>(std::move(pe)));
410template <
typename T0,
typename T1,
typename T2,
typename T3>
416template <
typename T0,
typename T1,
typename T2,
typename T3>
417inline event<T0, T1, T2, T3>
with_timeout(
double delay, event<T0, T1, T2, T3> e) {
422template <
typename T0,
typename T1,
typename T2,
typename T3>
428template <
typename T0,
typename T1,
typename T2,
typename T3>
434#if TAMER_HAVE_PREEVENT
435template <
typename R,
typename T0>
440template <
typename R,
typename T0>
445template <
typename R,
typename T0>
446inline event<T0> with_timeout_sec(
int delay, preevent<R, T0>&& pe) {
447 return with_timeout_sec(delay,
event<T0>(std::move(pe)));
450template <
typename R,
typename T0>
451inline event<T0> with_timeout_msec(
int delay, preevent<R, T0>&& pe) {
452 return with_timeout_msec(delay,
event<T0>(std::move(pe)));
464template <
typename T0,
typename T1,
typename T2,
typename T3>
470#if TAMER_HAVE_PREEVENT
471template <
typename R,
typename T0>
472inline event<T0>
with_signal(
int signo, preevent<R, T0>&& pe) {
473 return with_signal(signo, event<T0>(std::move(pe)));
487template <
typename T0,
typename T1,
typename T2,
typename T3,
typename SigInputIterator>
490 for (; first != last; ++first) {
496#if TAMER_HAVE_PREEVENT
497template <
typename R,
typename T0,
typename SigInputIterator>
498inline event<T0>
with_signal(SigInputIterator first, SigInputIterator last, preevent<R, T0>&& pe) {
499 return with_signal(first, last, event<T0>(std::move(pe)));
519template <
typename T0,
typename T1,
typename T2,
typename T3>
521 at_delay(delay, tamerpriv::with_helper(e, &result, outcome::timeout));
525template <
typename T0,
typename T1,
typename T2,
typename T3>
526inline event<T0, T1, T2, T3>
with_timeout(
double delay, event<T0, T1, T2, T3> e,
int &result) {
527 at_delay(delay, tamerpriv::with_helper(e, &result, outcome::timeout));
531template <
typename T0,
typename T1,
typename T2,
typename T3>
533 at_delay_sec(delay, tamerpriv::with_helper(e, &result, outcome::timeout));
537template <
typename T0,
typename T1,
typename T2,
typename T3>
539 at_delay_msec(delay, tamerpriv::with_helper(e, &result, outcome::timeout));
543#if TAMER_HAVE_PREEVENT
544template <
typename R,
typename T0>
549template <
typename R,
typename T0>
554template <
typename R,
typename T0>
555inline event<T0> with_timeout_sec(
int delay, preevent<R, T0>&& pe,
int& result) {
556 return with_timeout_sec(delay,
event<T0>(std::move(pe)), result);
559template <
typename R,
typename T0>
560inline event<T0> with_timeout_msec(
int delay, preevent<R, T0>&& pe,
int& result) {
561 return with_timeout_msec(delay,
event<T0>(std::move(pe)), result);
576template <
typename T0,
typename T1,
typename T2,
typename T3>
578 at_signal(signo, tamerpriv::with_helper(e, &result, outcome::signal));
582#if TAMER_HAVE_PREEVENT
583template <
typename R,
typename T0>
584inline event<T0>
with_signal(
int signo, preevent<R, T0>&& pe,
int& result) {
585 return with_signal(signo, event<T0>(std::move(pe)), result);
601template <
typename T0,
typename T1,
typename T2,
typename T3,
typename SigInputIterator>
603 event<> x = tamerpriv::with_helper(e, &result, outcome::signal);
604 for (; first != last; ++first) {
610#if TAMER_HAVE_PREEVENT
611template <
typename R,
typename T0,
typename SigInputIterator>
612inline event<T0>
with_signal(SigInputIterator first, SigInputIterator last, preevent<R, T0>&& pe,
int& result) {
613 return with_signal(first, last, event<T0>(std::move(pe)), result);
628 tamerpriv::function_rendezvous<F> *innerr =
629 new tamerpriv::function_rendezvous<F>(std::move(f));
642template <
typename F,
typename A>
644 tamerpriv::function_rendezvous<F, A> *innerr =
645 new tamerpriv::function_rendezvous<F, A>(std::move(f),
647 return TAMER_MAKE_FN_ANNOTATED_EVENT(*innerr);
660template <
typename F,
typename A1,
typename A2>
662 tamerpriv::function_rendezvous<F, A1, A2> *innerr =
663 new tamerpriv::function_rendezvous<F, A1, A2>(std::move(f),
666 return TAMER_MAKE_FN_ANNOTATED_EVENT(*innerr);
671inline event<typename C::value_type> push_back_event(C& container) {
672 tamerpriv::push_back_rendezvous<C>* r =
673 new tamerpriv::push_back_rendezvous<C>(container);
674 return TAMER_MAKE_FN_ANNOTATED_EVENT(*r, r->slot());
677template <
typename It>
679 tamerpriv::output_rendezvous<It>* r =
680 new tamerpriv::output_rendezvous<It>(iterator);
681 return TAMER_MAKE_FN_ANNOTATED_EVENT(*r, r->slot());