Tamer
C++ language extensions for event-driven programming
Loading...
Searching...
No Matches
event.hh
Go to the documentation of this file.
1#ifndef TAMER_EVENT_HH
2#define TAMER_EVENT_HH 1
3/* Copyright (c) 2007-2015, Eddie Kohler
4 * Copyright (c) 2007, Regents of the University of California
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, subject to the conditions
9 * listed in the Tamer LICENSE file. These conditions include: you must
10 * preserve this copyright notice, and you cannot mention the copyright
11 * holders in advertising related to the Software without their permission.
12 * The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This
13 * notice is a summary of the Tamer LICENSE file; the license in that file is
14 * legally binding.
15 */
16#include <tamer/xbase.hh>
17#include <tamer/rendezvous.hh>
18#include <functional>
19namespace tamer {
20
24
115template <typename T0, typename T1, typename T2, typename T3>
116class event {
117 public:
118 typedef std::tuple<T0, T1, T2, T3> results_tuple_type;
119
120 inline event() noexcept;
121 inline event(T0& x0, T1& x1, T2& x2, T3& x3) noexcept;
122 inline event(results_tuple_type& xs) noexcept;
123 inline event(const event<T0, T1, T2, T3>& x) noexcept;
124 inline event(event<T0, T1, T2, T3>&& x) noexcept;
125 inline ~event() noexcept;
126
127 inline explicit operator bool() const;
128 inline bool empty() const;
129
130 inline void operator()(T0 v0, T1 v1, T2 v2, T3 v3);
131 inline void trigger(T0 v0, T1 v1, T2 v2, T3 v3);
132 inline void tuple_trigger(const results_tuple_type& vs);
133 inline void unblock() noexcept;
134 template <size_t I> inline void set_result(typename std::tuple_element<I, results_tuple_type>::type vi);
135
136 inline void at_trigger(const event<>& e);
137 inline void at_trigger(event<>&& e);
138
139 inline event<> unblocker() const noexcept;
140
141 inline event<T0, T1, T2, T3>& operator=(const event<T0, T1, T2, T3>& x) noexcept;
142 inline event<T0, T1, T2, T3>& operator=(event<T0, T1, T2, T3>&& x) noexcept;
143
144 inline event<T0, T1, T2, T3>& operator+=(event<T0, T1, T2, T3> x);
145
146 inline const char* file_annotation() const;
147 inline int line_annotation() const;
148
149 inline event<T0, T1, T2, T3>& __instantiate(tamerpriv::abstract_rendezvous& r, uintptr_t rid, const char* file = nullptr, int line = 0);
150 inline tamerpriv::simple_event* __get_simple() const;
151 inline tamerpriv::simple_event* __release_simple();
152
153 private:
154 tamerpriv::simple_event* se_;
155 std::tuple<T0*, T1*, T2*, T3*> sv_;
156};
157
158
167
168template <typename T0, typename T1, typename T2>
169class event<T0, T1, T2, void> { public:
170 typedef std::tuple<T0, T1, T2> results_tuple_type;
171
172 inline event() noexcept;
173 inline event(T0& x0, T1& x1, T2& x2) noexcept;
174 inline event(results_tuple_type& xs) noexcept;
175
176 event(const event<T0, T1, T2>& x) noexcept
177 : se_(x.se_), sv_(x.sv_) {
178 tamerpriv::simple_event::use(se_);
179 }
180
181 event(event<T0, T1, T2>&& x) noexcept
182 : se_(x.se_), sv_(x.sv_) {
183 x.se_ = nullptr;
184 }
185
186 ~event() noexcept {
187 tamerpriv::simple_event::unuse(se_);
188 }
189
190 explicit operator bool() const {
191 return se_ && *se_;
192 }
193
194 bool empty() const {
195 return !se_ || se_->empty();
196 }
197
198 inline void operator()(T0 v0, T1 v1, T2 v2);
199 inline void trigger(T0 v0, T1 v1, T2 v2);
200 inline void tuple_trigger(const results_tuple_type& v);
201 inline void unblock() noexcept;
202 template <size_t I> inline void set_result(typename std::tuple_element<I, results_tuple_type>::type vi);
203
204 inline void at_trigger(const event<>& e);
205 inline void at_trigger(event<>&& e);
206
207 inline event<> unblocker() const noexcept;
208
209 event<T0, T1, T2>& operator=(const event<T0, T1, T2>& x) noexcept {
210 tamerpriv::simple_event::use(x.se_);
211 tamerpriv::simple_event::unuse(se_);
212 se_ = x.se_;
213 sv_ = x.sv_;
214 return *this;
215 }
216
218 tamerpriv::simple_event* se = se_;
219 se_ = x.se_;
220 sv_ = x.sv_;
221 x.se_ = se;
222 return *this;
223 }
224
225 inline event<T0, T1, T2>& operator+=(event<T0, T1, T2> x);
226
227 inline const char* file_annotation() const;
228 inline int line_annotation() const;
229
230 event<T0, T1, T2>& __instantiate(tamerpriv::abstract_rendezvous& r, uintptr_t rid, const char* file = nullptr, int line = 0) {
231 TAMER_DEBUG_ASSERT(!se_);
232 se_ = new tamerpriv::simple_event(r, rid, file, line);
233 return *this;
234 }
235 tamerpriv::simple_event* __get_simple() const {
236 return se_;
237 }
238 tamerpriv::simple_event* __release_simple() {
239 tamerpriv::simple_event* se = se_;
240 se_ = nullptr;
241 return se;
242 }
243
244 private:
245 tamerpriv::simple_event* se_;
246 std::tuple<T0*, T1*, T2*> sv_;
247};
248
249
250template <typename T0, typename T1>
251class event<T0, T1, void, void> { public:
252 typedef std::tuple<T0, T1> results_tuple_type;
253
254 inline event() noexcept;
255 inline event(T0& x0, T1& x1) noexcept;
256 inline event(results_tuple_type& xs) noexcept;
257
258 event(const event<T0, T1>& x) noexcept
259 : se_(x.se_), sv_(x.sv_) {
260 tamerpriv::simple_event::use(se_);
261 }
262
263 event(event<T0, T1>&& x) noexcept
264 : se_(x.se_), sv_(x.sv_) {
265 x.se_ = nullptr;
266 }
267
268 ~event() noexcept {
269 tamerpriv::simple_event::unuse(se_);
270 }
271
272 explicit operator bool() const {
273 return se_ && *se_;
274 }
275
276 bool empty() const {
277 return !se_ || se_->empty();
278 }
279
280 inline void operator()(T0 v0, T1 v1);
281 inline void trigger(T0 v0, T1 v1);
282 inline void tuple_trigger(const results_tuple_type& vs);
283 inline void unblock() noexcept;
284 template <size_t I> inline void set_result(typename std::tuple_element<I, results_tuple_type>::type vi);
285
286 inline void at_trigger(const event<>& e);
287 inline void at_trigger(event<>&& e);
288
289 inline event<> unblocker() const noexcept;
290
291 event<T0, T1>& operator=(const event<T0, T1>& x) noexcept {
292 tamerpriv::simple_event::use(x.se_);
293 tamerpriv::simple_event::unuse(se_);
294 se_ = x.se_;
295 sv_ = x.sv_;
296 return *this;
297 }
298
299 event<T0, T1>& operator=(event<T0, T1>&& x) noexcept {
300 tamerpriv::simple_event* se = se_;
301 se_ = x.se_;
302 sv_ = x.sv_;
303 x.se_ = se;
304 return *this;
305 }
306
307 inline event<T0, T1>& operator+=(event<T0, T1> x);
308
309 inline const char* file_annotation() const;
310 inline int line_annotation() const;
311
312 event<T0, T1>& __instantiate(tamerpriv::abstract_rendezvous& r, uintptr_t rid, const char* file = nullptr, int line = 0) {
313 TAMER_DEBUG_ASSERT(!se_);
314 se_ = new tamerpriv::simple_event(r, rid, file, line);
315 return *this;
316 }
317 tamerpriv::simple_event* __get_simple() const {
318 return se_;
319 }
320 tamerpriv::simple_event* __release_simple() {
321 tamerpriv::simple_event* se = se_;
322 se_ = nullptr;
323 return se;
324 }
325
326 private:
327 tamerpriv::simple_event* se_;
328 std::tuple<T0*, T1*> sv_;
329};
330
331
332template <typename T0>
333class event<T0, void, void, void> { public:
334 typedef std::tuple<T0> results_tuple_type;
335
336 inline event() noexcept;
337 inline event(T0& x0) noexcept;
338 inline event(results_tuple_type& xs) noexcept;
339
340 event(const event<T0>& x) noexcept
341 : se_(x.se_), s0_(x.s0_) {
342 tamerpriv::simple_event::use(se_);
343 }
344
345 event(event<T0>&& x) noexcept
346 : se_(x.se_), s0_(x.s0_) {
347 x.se_ = nullptr;
348 }
349
350#if TAMER_HAVE_PREEVENT
351 template <typename R> inline event(preevent<R, T0>&& x);
352#endif
353
354 inline event(const event<>& x, results_tuple_type& xs);
355 inline event(event<>&& x, results_tuple_type& xs) noexcept;
356
357 ~event() noexcept {
358 tamerpriv::simple_event::unuse(se_);
359 }
360
361 explicit operator bool() const {
362 return se_ && *se_;
363 }
364
365 bool empty() const {
366 return !se_ || se_->empty();
367 }
368
369 inline void operator()(T0 v0);
370 inline void trigger(T0 v0);
371 inline void tuple_trigger(const results_tuple_type& vs);
372 inline void unblock() noexcept;
373 template <size_t I = 0> inline void set_result(typename std::tuple_element<I, results_tuple_type>::type vi);
374
375 inline T0& result() const noexcept;
376 inline T0* result_pointer() const noexcept;
377
378 inline void at_trigger(const event<>& e);
379 inline void at_trigger(event<>&& e);
380
381 inline event<> unblocker() const noexcept;
382
383 event<T0>& operator=(const event<T0>& x) noexcept {
384 tamerpriv::simple_event::use(x.se_);
385 tamerpriv::simple_event::unuse(se_);
386 se_ = x.se_;
387 s0_ = x.s0_;
388 return *this;
389 }
390
391 event<T0>& operator=(event<T0>&& x) noexcept {
392 tamerpriv::simple_event* se = se_;
393 se_ = x.se_;
394 s0_ = x.s0_;
395 x.se_ = se;
396 return *this;
397 }
398
399#if TAMER_HAVE_PREEVENT
400 template <typename R> event<T0>& operator=(preevent<R, T0>&& x) {
401 return *this = event<T0>(std::move(x));
402 }
403#endif
404
405 inline event<T0>& operator+=(event<T0> x);
406
407 inline const char* file_annotation() const;
408 inline int line_annotation() const;
409
410 event<T0>& __instantiate(tamerpriv::abstract_rendezvous& r, uintptr_t rid, const char* file = nullptr, int line = 0) {
411 TAMER_DEBUG_ASSERT(!se_);
412 se_ = new tamerpriv::simple_event(r, rid, file, line);
413 return *this;
414 }
415 tamerpriv::simple_event* __get_simple() const {
416 return se_;
417 }
418 tamerpriv::simple_event* __release_simple() {
419 tamerpriv::simple_event* se = se_;
420 se_ = nullptr;
421 return se;
422 }
423
424 static inline event<T0> __make(tamerpriv::simple_event* se, T0* s0) {
425 return event<T0>(take_marker(), se, s0);
426 }
427
428 private:
429 tamerpriv::simple_event* se_;
430 T0* s0_;
431
432 struct take_marker { };
433 inline event(const take_marker&, tamerpriv::simple_event* se, T0* s0)
434 : se_(se), s0_(s0) {
435 }
436};
437
438
439template <>
440class event<void, void, void, void> { public:
441 typedef std::tuple<> results_tuple_type;
442
443 inline event() noexcept;
444 inline event(results_tuple_type& xs) noexcept;
445
446 event(const event<>& x) noexcept
447 : se_(x.se_) {
448 tamerpriv::simple_event::use(se_);
449 }
450
451 event(event<>&& x) noexcept
452 : se_(x.se_) {
453 x.se_ = nullptr;
454 }
455
456#if TAMER_HAVE_PREEVENT
457 template <typename R> inline event(preevent<R>&& x);
458#endif
459
460 ~event() noexcept {
461 tamerpriv::simple_event::unuse(se_);
462 }
463
464 explicit operator bool() const {
465 return se_ && *se_;
466 }
467
468 bool empty() const {
469 return !se_ || se_->empty();
470 }
471
472 inline void operator()() noexcept;
473 inline void trigger() noexcept;
474 inline void tuple_trigger(const results_tuple_type& vs) noexcept;
475 inline void unblock() noexcept;
476
477 inline void at_trigger(const event<>& e) {
478 tamerpriv::simple_event::use(e.__get_simple());
479 tamerpriv::simple_event::at_trigger(se_, e.__get_simple());
480 }
481 inline void at_trigger(event<>&& e) {
482 tamerpriv::simple_event::at_trigger(se_, e.__release_simple());
483 }
484
485 event<>& unblocker() noexcept {
486 return *this;
487 }
488 event<> unblocker() const noexcept {
489 return *this;
490 }
491
492 event<>& operator=(const event<>& x) noexcept {
493 tamerpriv::simple_event::use(x.se_);
494 tamerpriv::simple_event::unuse(se_);
495 se_ = x.se_;
496 return *this;
497 }
498
499 event<>& operator=(event<>&& x) noexcept {
500 tamerpriv::simple_event* se = se_;
501 se_ = x.se_;
502 x.se_ = se;
503 return *this;
504 }
505
506#if TAMER_HAVE_PREEVENT
507 template <typename R> event<>& operator=(preevent<R>&& x) {
508 return *this = event<>(std::move(x));
509 }
510#endif
511
512 inline event<>& operator+=(event<> x);
513
514 inline const char* file_annotation() const;
515 inline int line_annotation() const;
516
517 event<>& __instantiate(tamerpriv::abstract_rendezvous& r, uintptr_t rid, const char* file = nullptr, int line = 0) {
518 TAMER_DEBUG_ASSERT(!se_);
519 se_ = new tamerpriv::simple_event(r, rid, file, line);
520 return *this;
521 }
522 tamerpriv::simple_event* __get_simple() const {
523 return se_;
524 }
525 tamerpriv::simple_event* __release_simple() {
526 tamerpriv::simple_event* se = se_;
527 se_ = nullptr;
528 return se;
529 }
530
531 static inline event<> __make(tamerpriv::simple_event* se) {
532 return event<>(take_marker(), se);
533 }
534
535 private:
536 mutable tamerpriv::simple_event* se_;
537
538 struct take_marker { };
539 inline event(const take_marker&, tamerpriv::simple_event* se)
540 : se_(se) {
541 }
542
543 friend class tamerpriv::simple_event;
544
545};
546
547
548#if TAMER_HAVE_PREEVENT
549template <typename R, typename T0>
550class preevent {
551 public:
552 typedef std::tuple<T0> results_tuple_type;
553
554 inline constexpr preevent(R& r, T0& x0, const char* file = nullptr, int line = 0) noexcept;
555 inline preevent(preevent<R, T0>&& x) noexcept;
556
557 explicit operator bool() const {
558 return r_;
559 }
560 bool empty() const {
561 return !r_;
562 }
563
564 inline void operator()(T0 v0) {
565 if (r_) {
566 *s0_ = std::move(v0);
567 r_ = nullptr;
568 }
569 }
570 inline void trigger(T0 v0) {
571 operator()(v0);
572 }
573 inline void tuple_trigger(const results_tuple_type& vs) {
574 operator()(std::get<0>(vs));
575 }
576 inline void unblock() noexcept {
577 r_ = nullptr;
578 }
579
580 inline T0& result() const noexcept {
581 assert(r_);
582 return *s0_;
583 }
584 inline T0* result_pointer() const noexcept {
585 return r_ ? s0_ : 0;
586 }
587
588 private:
589 R* r_;
590 T0* s0_;
591# if !TAMER_NOTRACE
592 const char* file_annotation_;
593 int line_annotation_;
594# endif
595
596 preevent(const preevent<R, T0>& x) noexcept;
597 template <typename TT0, typename TT1, typename TT2, typename TT3>
598 friend class event;
599};
600
601template <typename R>
602class preevent<R, void> {
603 public:
604 typedef std::tuple<> results_tuple_type;
605
606 inline constexpr preevent(R& r, const char* file = nullptr, int line = 0) noexcept;
607 inline preevent(preevent<R>&& x) noexcept;
608
609 explicit operator bool() const {
610 return r_;
611 }
612 bool empty() const {
613 return !r_;
614 }
615
616 inline void operator()() {
617 r_ = nullptr;
618 }
619 inline void trigger() {
620 operator()();
621 }
622 inline void tuple_trigger(const results_tuple_type&) {
623 operator()();
624 }
625 inline void unblock() noexcept {
626 r_ = nullptr;
627 }
628
629 private:
630 R* r_;
631# if !TAMER_NOTRACE
632 const char* file_annotation_;
633 int line_annotation_;
634# endif
635
636 preevent(const preevent<R>& x) noexcept;
637 template <typename TT0, typename TT1, typename TT2, typename TT3>
638 friend class event;
639};
640#endif
641
643
644
646template <typename T0, typename T1, typename T2, typename T3>
648 : se_(nullptr), sv_(nullptr, nullptr, nullptr, nullptr) {
649}
650
657template <typename T0, typename T1, typename T2, typename T3>
658inline event<T0, T1, T2, T3>::event(T0& x0, T1& x1, T2& x2, T3& x3) noexcept
659 : se_(nullptr), sv_(&x0, &x1, &x2, &x3) {
660}
661
665template <typename T0, typename T1, typename T2, typename T3>
666inline event<T0, T1, T2, T3>::event(results_tuple_type& xs) noexcept
667 : se_(nullptr), sv_(&std::get<0>(xs), &std::get<1>(xs), &std::get<2>(xs), &std::get<3>(xs)) {
668}
669
673template <typename T0, typename T1, typename T2, typename T3>
675 : se_(x.se_), sv_(x.sv_) {
676 tamerpriv::simple_event::use(se_);
677}
678
682template <typename T0, typename T1, typename T2, typename T3>
684 : se_(x.se_), sv_(x.sv_) {
685 x.se_ = nullptr;
686}
687
692template <typename T0, typename T1, typename T2, typename T3>
694 tamerpriv::simple_event::unuse(se_);
695}
696
699template <typename T0, typename T1, typename T2, typename T3>
701 return se_ && *se_;
702}
703
706template <typename T0, typename T1, typename T2, typename T3>
707inline bool event<T0, T1, T2, T3>::empty() const {
708 return !se_ || se_->empty();
709}
710
719template <typename T0, typename T1, typename T2, typename T3>
720inline void event<T0, T1, T2, T3>::operator()(T0 v0, T1 v1, T2 v2, T3 v3) {
721 if (se_ && *se_) {
722 *std::get<0>(sv_) = std::move(v0);
723 *std::get<1>(sv_) = std::move(v1);
724 *std::get<2>(sv_) = std::move(v2);
725 *std::get<3>(sv_) = std::move(v3);
726 se_->simple_trigger(true);
727 se_ = nullptr;
728 }
729}
730
741template <typename T0, typename T1, typename T2, typename T3>
742inline void event<T0, T1, T2, T3>::trigger(T0 v0, T1 v1, T2 v2, T3 v3) {
743 operator()(v0, v1, v2, v3);
744}
745
753template <typename T0, typename T1, typename T2, typename T3>
754inline void event<T0, T1, T2, T3>::tuple_trigger(const results_tuple_type& vs) {
755 operator()(std::get<0>(vs), std::get<1>(vs), std::get<2>(vs), std::get<3>(vs));
756}
757
764template <typename T0, typename T1, typename T2, typename T3>
765inline void event<T0, T1, T2, T3>::unblock() noexcept {
766 tamerpriv::simple_event::simple_trigger(se_, false);
767 se_ = nullptr;
768}
769
770template <typename T0, typename T1, typename T2, typename T3>
771template <size_t I>
772inline void event<T0, T1, T2, T3>::set_result(typename std::tuple_element<I, results_tuple_type>::type vi) {
773 if (se_ && *se_) {
774 *std::get<I>(sv_) = std::move(vi);
775 }
776}
777
784template <typename T0, typename T1, typename T2, typename T3>
786 tamerpriv::simple_event::use(e.__get_simple());
787 tamerpriv::simple_event::at_trigger(se_, e.__get_simple());
788}
789
791template <typename T0, typename T1, typename T2, typename T3>
793 tamerpriv::simple_event::at_trigger(se_, e.__release_simple());
794}
795
804template <typename T0, typename T1, typename T2, typename T3>
806 tamerpriv::simple_event::use(se_);
807 return event<>::__make(se_);
808}
809
813template <typename T0, typename T1, typename T2, typename T3>
815 tamerpriv::simple_event::use(x.se_);
816 tamerpriv::simple_event::unuse(se_);
817 se_ = x.se_;
818 sv_ = x.sv_;
819 return *this;
820}
821
825template <typename T0, typename T1, typename T2, typename T3>
827 tamerpriv::simple_event* se = se_;
828 se_ = x.se_;
829 sv_ = x.sv_;
830 x.se_ = se;
831 return *this;
832}
833
838template <typename T0, typename T1, typename T2, typename T3>
839event<T0, T1, T2, T3>& event<T0, T1, T2, T3>::__instantiate(tamerpriv::abstract_rendezvous& r, uintptr_t rid, const char* file, int line) {
840 TAMER_DEBUG_ASSERT(!se_);
841 se_ = new tamerpriv::simple_event(r, rid, file, line);
842 return *this;
843}
844
849template <typename T0, typename T1, typename T2, typename T3>
850inline tamerpriv::simple_event* event<T0, T1, T2, T3>::__get_simple() const {
851 return se_;
852}
853
858template <typename T0, typename T1, typename T2, typename T3>
859inline tamerpriv::simple_event* event<T0, T1, T2, T3>::__release_simple() {
860 tamerpriv::simple_event* se = se_;
861 se_ = nullptr;
862 return se;
863}
864
865
867
868template <typename T0, typename T1, typename T2>
869inline event<T0, T1, T2>::event() noexcept
870 : se_(nullptr), sv_(nullptr, nullptr, nullptr) {
871}
872
873template <typename T0, typename T1, typename T2>
874inline event<T0, T1, T2>::event(T0& x0, T1& x1, T2& x2) noexcept
875 : se_(nullptr), sv_(&x0, &x1, &x2) {
876}
877
878template <typename T0, typename T1, typename T2>
879inline event<T0, T1, T2>::event(results_tuple_type& xs) noexcept
880 : se_(nullptr), sv_(&std::get<0>(xs), &std::get<1>(xs), &std::get<2>(xs)) {
881}
882
883template <typename T0, typename T1, typename T2>
884inline void event<T0, T1, T2>::operator()(T0 v0, T1 v1, T2 v2) {
885 if (se_ && *se_) {
886 *std::get<0>(sv_) = std::move(v0);
887 *std::get<1>(sv_) = std::move(v1);
888 *std::get<2>(sv_) = std::move(v2);
889 se_->simple_trigger(true);
890 se_ = nullptr;
891 }
892}
893
894template <typename T0, typename T1, typename T2>
895inline void event<T0, T1, T2>::trigger(T0 v0, T1 v1, T2 v2) {
896 operator()(v0, v1, v2);
897}
898
899template <typename T0, typename T1, typename T2>
900inline void event<T0, T1, T2>::tuple_trigger(const results_tuple_type& vs) {
901 operator()(std::get<0>(vs), std::get<1>(vs), std::get<2>(vs));
902}
903
904template <typename T0, typename T1, typename T2>
905inline void event<T0, T1, T2>::unblock() noexcept {
906 tamerpriv::simple_event::simple_trigger(se_, false);
907 se_ = nullptr;
908}
909
910template <typename T0, typename T1, typename T2>
911template <size_t I>
912inline void event<T0, T1, T2>::set_result(typename std::tuple_element<I, results_tuple_type>::type vi) {
913 if (se_ && *se_) {
914 *std::get<I>(sv_) = std::move(vi);
915 }
916}
917
918
919template <typename T0, typename T1>
920inline event<T0, T1>::event() noexcept
921 : se_(nullptr), sv_(nullptr, nullptr) {
922}
923
924template <typename T0, typename T1>
925inline event<T0, T1>::event(T0& x0, T1& x1) noexcept
926 : se_(nullptr), sv_(&x0, &x1) {
927}
928
929template <typename T0, typename T1>
930inline event<T0, T1>::event(results_tuple_type& xs) noexcept
931 : se_(nullptr), sv_(&std::get<0>(xs), &std::get<1>(xs)) {
932}
933
934template <typename T0, typename T1>
935inline void event<T0, T1>::operator()(T0 v0, T1 v1) {
936 if (se_ && *se_) {
937 *std::get<0>(sv_) = std::move(v0);
938 *std::get<1>(sv_) = std::move(v1);
939 se_->simple_trigger(true);
940 se_ = nullptr;
941 }
942}
943
944template <typename T0, typename T1>
945inline void event<T0, T1>::trigger(T0 v0, T1 v1) {
946 operator()(v0, v1);
947}
948
949template <typename T0, typename T1>
950inline void event<T0, T1>::tuple_trigger(const results_tuple_type& vs) {
951 operator()(std::get<0>(vs), std::get<1>(vs));
952}
953
954template <typename T0, typename T1>
955inline void event<T0, T1>::unblock() noexcept {
956 tamerpriv::simple_event::simple_trigger(se_, false);
957 se_ = nullptr;
958}
959
960template <typename T0, typename T1>
961template <size_t I>
962inline void event<T0, T1>::set_result(typename std::tuple_element<I, results_tuple_type>::type vi) {
963 if (se_ && *se_) {
964 *std::get<I>(sv_) = std::move(vi);
965 }
966}
967
968
969template <typename T0>
970inline event<T0>::event() noexcept
971 : se_(nullptr), s0_(0) {
972}
973
974template <typename T0>
975inline event<T0>::event(T0& x0) noexcept
976 : se_(nullptr), s0_(&x0) {
977}
978
979template <typename T0>
980inline event<T0>::event(results_tuple_type& xs) noexcept
981 : se_(nullptr), s0_(&std::get<0>(xs)) {
982}
983
984template <typename T0>
985inline void event<T0>::operator()(T0 v0) {
986 if (se_ && *se_) {
987 *s0_ = std::move(v0);
988 se_->simple_trigger(true);
989 se_ = nullptr;
990 }
991}
992
993template <typename T0>
994inline void event<T0>::trigger(T0 v0) {
995 operator()(v0);
996}
997
998template <typename T0>
999inline void event<T0>::tuple_trigger(const results_tuple_type& vs) {
1000 operator()(std::get<0>(vs));
1001}
1002
1003template <typename T0>
1004inline void event<T0>::unblock() noexcept {
1005 tamerpriv::simple_event::simple_trigger(se_, false);
1006 se_ = nullptr;
1007}
1008
1009template <typename T0>
1010template <size_t I>
1011inline void event<T0>::set_result(typename std::tuple_element<I, results_tuple_type>::type vi) {
1012 if (se_ && *se_) {
1013 *s0_ = std::move(vi);
1014 }
1015}
1016
1017
1018inline event<>::event() noexcept
1019 : se_(nullptr) {
1020}
1021
1022inline event<>::event(results_tuple_type&) noexcept
1023 : se_(nullptr) {
1024}
1025
1026inline void event<>::operator()() noexcept {
1027 tamerpriv::simple_event::simple_trigger(se_, false);
1028 se_ = nullptr;
1029}
1030
1031inline void event<>::trigger() noexcept {
1032 operator()();
1033}
1034
1035inline void event<>::tuple_trigger(const results_tuple_type&) noexcept {
1036 operator()();
1037}
1038
1039inline void event<>::unblock() noexcept {
1040 operator()();
1041}
1042
1044
1048template <typename T0>
1049inline T0& event<T0>::result() const noexcept {
1050 assert(!empty());
1051 return *s0_;
1052}
1053
1055template <typename T0>
1056inline T0* event<T0>::result_pointer() const noexcept {
1057 return se_ && *se_ ? s0_ : 0;
1058}
1059
1060
1061#if TAMER_HAVE_PREEVENT
1062template <typename R, typename T0>
1063inline constexpr preevent<R, T0>::preevent(R& r, T0& x0, const char* file, int line) noexcept
1064 : r_(&((void) file, (void) line, r)), s0_(&x0) TAMER_IFTRACE(, file_annotation_(file), line_annotation_(line)) {
1065 // NB "(void) file, (void) line" in initializer b/c constexpr doesn't
1066 // allow body
1067}
1068
1069template <typename R, typename T0>
1070inline preevent<R, T0>::preevent(preevent<R, T0>&& x) noexcept
1071 : r_(x.r_), s0_(x.s0_) TAMER_IFTRACE(, file_annotation_(x.file_annotation_), line_annotation_(x.line_annotation_)) {
1072 x.r_ = nullptr;
1073}
1074
1075template <typename R>
1076inline constexpr preevent<R>::preevent(R& r, const char* file, int line) noexcept
1077 : r_(&((void) file, (void) line, r)) TAMER_IFTRACE(, file_annotation_(file), line_annotation_(line)) {
1078}
1079
1080template <typename R>
1081inline preevent<R>::preevent(preevent<R>&& x) noexcept
1082 : r_(x.r_) TAMER_IFTRACE(, file_annotation_(x.file_annotation_), line_annotation_(x.line_annotation_)) {
1083 x.r_ = nullptr;
1084}
1085
1086# undef TAMER_PREEVENT_CTOR
1087#endif
1088
1089
1098
1114template <typename R, typename I, typename T0, typename T1, typename T2, typename T3>
1115inline event<T0, T1, T2, T3> make_event(one_argument_rendezvous_tag<R>& r, const I& eid, T0& x0, T1& x1, T2& x2, T3& x3)
1116{
1117 return event<T0, T1, T2, T3>(x0, x1, x2, x3).__instantiate(static_cast<R&>(r), static_cast<R&>(r).make_rid(eid));
1118}
1119
1120template <typename R, typename I, typename T0, typename T1, typename T2, typename T3>
1121inline event<T0, T1, T2, T3> make_event(one_argument_rendezvous_tag<R>& r, const I& eid, typename event<T0, T1, T2, T3>::results_tuple_type& xs)
1122{
1123 return event<T0, T1, T2, T3>(xs).__instantiate(static_cast<R&>(r), static_cast<R&>(r).make_rid(eid));
1124}
1125
1126template <typename R, typename T0, typename T1, typename T2, typename T3>
1127inline event<T0, T1, T2, T3> make_event(zero_argument_rendezvous_tag<R>& r, T0& x0, T1& x1, T2& x2, T3& x3)
1128{
1129 return event<T0, T1, T2, T3>(x0, x1, x2, x3).__instantiate(static_cast<R&>(r), 0);
1130}
1131
1132template <typename R, typename T0, typename T1, typename T2, typename T3>
1133inline event<T0, T1, T2, T3> make_event(zero_argument_rendezvous_tag<R>& r, typename event<T0, T1, T2, T3>::results_tuple_type& xs)
1134{
1135 return event<T0, T1, T2, T3>(xs).__instantiate(static_cast<R&>(r), 0);
1136}
1137
1138template <typename R, typename I, typename T0, typename T1, typename T2>
1139inline event<T0, T1, T2> make_event(one_argument_rendezvous_tag<R>& r, const I& eid, T0& x0, T1& x1, T2& x2)
1140{
1141 return event<T0, T1, T2>(x0, x1, x2).__instantiate(static_cast<R&>(r), static_cast<R&>(r).make_rid(eid));
1142}
1143
1144template <typename R, typename T0, typename T1, typename T2>
1145inline event<T0, T1, T2> make_event(zero_argument_rendezvous_tag<R>& r, T0& x0, T1& x1, T2& x2)
1146{
1147 return event<T0, T1, T2>(x0, x1, x2).__instantiate(static_cast<R&>(r), 0);
1148}
1149
1150template <typename R, typename I, typename T0, typename T1>
1151inline event<T0, T1> make_event(one_argument_rendezvous_tag<R>& r, const I& eid, T0& x0, T1& x1)
1152{
1153 return event<T0, T1>(x0, x1).__instantiate(static_cast<R&>(r), static_cast<R&>(r).make_rid(eid));
1154}
1155
1156template <typename R, typename T0, typename T1>
1157inline event<T0, T1> make_event(zero_argument_rendezvous_tag<R>& r, T0& x0, T1& x1)
1158{
1159 return event<T0, T1>(x0, x1).__instantiate(static_cast<R&>(r), 0);
1160}
1161
1162template <typename R, typename I, typename T0>
1163inline event<T0> make_event(one_argument_rendezvous_tag<R>& r, const I& eid, T0& x0)
1164{
1165 return event<T0>(x0).__instantiate(static_cast<R&>(r), static_cast<R&>(r).make_rid(eid));
1166}
1167
1168#if !TAMER_HAVE_PREEVENT || !TAMER_PREFER_PREEVENT
1169template <typename R, typename T0>
1170inline event<T0> make_event(zero_argument_rendezvous_tag<R>& r, T0& x0)
1171{
1172 return event<T0>(x0).__instantiate(static_cast<R&>(r), 0);
1173}
1174#else
1175template <typename R, typename T0>
1176inline preevent<R, T0> make_event(zero_argument_rendezvous_tag<R>& r, T0& x0)
1177{
1178 return preevent<R, T0>(static_cast<R&>(r), x0);
1179}
1180#endif
1181
1182#if TAMER_HAVE_PREEVENT
1183template <typename R, typename T0>
1184inline preevent<R, T0> make_preevent(zero_argument_rendezvous_tag<R>& r, T0& x0)
1185{
1186 return preevent<R, T0>(static_cast<R&>(r), x0);
1187}
1188#endif
1189
1190template <typename R, typename I>
1191inline event<> make_event(one_argument_rendezvous_tag<R>& r, const I& eid)
1192{
1193 return event<>().__instantiate(static_cast<R&>(r), static_cast<R&>(r).make_rid(eid));
1194}
1195
1196#if !TAMER_HAVE_PREEVENT || !TAMER_PREFER_PREEVENT
1197template <typename R>
1198inline event<> make_event(zero_argument_rendezvous_tag<R>& r)
1199{
1200 return event<>().__instantiate(static_cast<R&>(r), 0);
1201}
1202#else
1203template <typename R>
1204inline preevent<R> make_event(zero_argument_rendezvous_tag<R>& r)
1205{
1206 return preevent<R>(static_cast<R&>(r));
1207}
1208#endif
1209
1210#if TAMER_HAVE_PREEVENT
1211template <typename R>
1212inline preevent<R> make_preevent(zero_argument_rendezvous_tag<R>& r)
1213{
1214 return preevent<R>(static_cast<R&>(r));
1215}
1216#endif
1217
1219
1220
1222template <typename I> template <typename T0, typename T1, typename T2, typename T3>
1223inline event<T0, T1, T2, T3> rendezvous<I>::make_event(const I& eid, T0& x0, T1& x1, T2& x2, T3& x3)
1224{
1225 return tamer::make_event(*this, eid, x0, x1, x2, x3);
1226}
1227
1228template <typename I> template <typename T0, typename T1, typename T2, typename T3>
1229inline event<T0, T1, T2, T3> simple_rendezvous<I>::make_event(I eid, T0& x0, T1& x1, T2& x2, T3& x3)
1230{
1231 return tamer::make_event(*this, eid, x0, x1, x2, x3);
1232}
1233
1234template <typename T0, typename T1, typename T2, typename T3>
1235inline event<T0, T1, T2, T3> rendezvous<>::make_event(T0& x0, T1& x1, T2& x2, T3& x3)
1236{
1237 return tamer::make_event(*this, x0, x1, x2, x3);
1238}
1239
1240template <typename T0, typename T1, typename T2, typename T3>
1241inline event<T0, T1, T2, T3> gather_rendezvous::make_event(T0& x0, T1& x1, T2& x2, T3& x3)
1242{
1243 return tamer::make_event(*this, x0, x1, x2, x3);
1244}
1245
1246template <typename I> template <typename T0, typename T1, typename T2>
1247inline event<T0, T1, T2> rendezvous<I>::make_event(const I& eid, T0& x0, T1& x1, T2& x2)
1248{
1249 return tamer::make_event(*this, eid, x0, x1, x2);
1250}
1251
1252template <typename I> template <typename T0, typename T1, typename T2>
1253inline event<T0, T1, T2> simple_rendezvous<I>::make_event(I eid, T0& x0, T1& x1, T2& x2)
1254{
1255 return tamer::make_event(*this, eid, x0, x1, x2);
1256}
1257
1258template <typename T0, typename T1, typename T2>
1259inline event<T0, T1, T2> rendezvous<>::make_event(T0& x0, T1& x1, T2& x2)
1260{
1261 return tamer::make_event(*this, x0, x1, x2);
1262}
1263
1264template <typename T0, typename T1, typename T2>
1265inline event<T0, T1, T2> gather_rendezvous::make_event(T0& x0, T1& x1, T2& x2)
1266{
1267 return tamer::make_event(*this, x0, x1, x2);
1268}
1269
1270template <typename I> template <typename T0, typename T1>
1271inline event<T0, T1> rendezvous<I>::make_event(const I& eid, T0& x0, T1& x1)
1272{
1273 return tamer::make_event(*this, eid, x0, x1);
1274}
1275
1276template <typename I> template <typename T0, typename T1>
1277inline event<T0, T1> simple_rendezvous<I>::make_event(I eid, T0& x0, T1& x1)
1278{
1279 return tamer::make_event(*this, eid, x0, x1);
1280}
1281
1282template <typename T0, typename T1>
1283inline event<T0, T1> rendezvous<>::make_event(T0& x0, T1& x1)
1284{
1285 return tamer::make_event(*this, x0, x1);
1286}
1287
1288template <typename T0, typename T1>
1289inline event<T0, T1> gather_rendezvous::make_event(T0& x0, T1& x1)
1290{
1291 return tamer::make_event(*this, x0, x1);
1292}
1293
1294template <typename I> template <typename T0>
1295inline event<T0> rendezvous<I>::make_event(const I& eid, T0& x0)
1296{
1297 return tamer::make_event(*this, eid, x0);
1298}
1299
1300template <typename I> template <typename T0>
1301inline event<T0> simple_rendezvous<I>::make_event(I eid, T0& x0)
1302{
1303 return tamer::make_event(*this, eid, x0);
1304}
1305
1306#if !TAMER_HAVE_PREEVENT || !TAMER_PREFER_PREEVENT
1307template <typename T0>
1308inline event<T0> rendezvous<>::make_event(T0& x0) {
1309 return tamer::make_event(*this, x0);
1310}
1311
1312template <typename T0>
1313inline event<T0> gather_rendezvous::make_event(T0& x0) {
1314 return tamer::make_event(*this, x0);
1315}
1316#else
1317template <typename T0>
1318inline preevent<rendezvous<>, T0> rendezvous<>::make_event(T0& x0) {
1319 return tamer::make_preevent(*this, x0);
1320}
1321
1322template <typename T0>
1323inline preevent<gather_rendezvous, T0> gather_rendezvous::make_event(T0& x0) {
1324 return tamer::make_preevent(*this, x0);
1325}
1326#endif
1327
1328#if TAMER_HAVE_PREEVENT
1329template <typename T0>
1330inline preevent<rendezvous<>, T0> rendezvous<>::make_preevent(T0& x0)
1331{
1332 return preevent<rendezvous<>, T0>(*this, x0);
1333}
1334
1335template <typename T0>
1336inline preevent<gather_rendezvous, T0> gather_rendezvous::make_preevent(T0& x0)
1337{
1338 return preevent<gather_rendezvous, T0>(*this, x0);
1339}
1340#endif
1341
1342template <typename I>
1343inline event<> rendezvous<I>::make_event(const I& eid)
1344{
1345 return tamer::make_event(*this, eid);
1346}
1347
1348template <typename I>
1349inline event<> simple_rendezvous<I>::make_event(I eid)
1350{
1351 return tamer::make_event(*this, eid);
1352}
1353
1354#if !TAMER_HAVE_PREEVENT || !TAMER_PREFER_PREEVENT
1355inline event<> rendezvous<>::make_event() {
1356 return tamer::make_event(*this);
1357}
1358
1359inline event<> gather_rendezvous::make_event() {
1360 return tamer::make_event(*this);
1361}
1362#else
1363inline preevent<rendezvous<> > rendezvous<>::make_event() {
1364 return tamer::make_preevent(*this);
1365}
1366
1367inline preevent<gather_rendezvous> gather_rendezvous::make_event() {
1368 return tamer::make_preevent(*this);
1369}
1370#endif
1371
1372#if TAMER_HAVE_PREEVENT
1373inline preevent<rendezvous<> > rendezvous<>::make_preevent() {
1374 return preevent<rendezvous<> >(*this);
1375}
1376
1377inline preevent<gather_rendezvous> gather_rendezvous::make_preevent() {
1378 return preevent<gather_rendezvous>(*this);
1379}
1380#endif
1382
1383
1384template <typename R, typename I, typename T0, typename T1, typename T2, typename T3>
1385inline event<T0, T1, T2, T3> make_annotated_event(const char *file, int line, one_argument_rendezvous_tag<R>& r, const I& eid, T0& x0, T1& x1, T2& x2, T3& x3)
1386{
1387 return event<T0, T1, T2, T3>(x0, x1, x2, x3).__instantiate(static_cast<R&>(r), static_cast<R&>(r).make_rid(eid), file, line);
1388}
1389
1390template <typename R, typename I, typename T0, typename T1, typename T2, typename T3>
1391inline event<T0, T1, T2, T3> make_annotated_event(const char *file, int line, one_argument_rendezvous_tag<R>& r, const I& eid, typename event<T0, T1, T2, T3>::results_tuple_type& xs)
1392{
1393 return event<T0, T1, T2, T3>(xs).__instantiate(static_cast<R&>(r), static_cast<R&>(r).make_rid(eid), file, line);
1394}
1395
1396template <typename R, typename T0, typename T1, typename T2, typename T3>
1397inline event<T0, T1, T2, T3> make_annotated_event(const char *file, int line, zero_argument_rendezvous_tag<R>& r, T0& x0, T1& x1, T2& x2, T3& x3)
1398{
1399 return event<T0, T1, T2, T3>(x0, x1, x2, x3).__instantiate(static_cast<R&>(r), 0, file, line);
1400}
1401
1402template <typename R, typename T0, typename T1, typename T2, typename T3>
1403inline event<T0, T1, T2, T3> make_annotated_event(const char *file, int line, zero_argument_rendezvous_tag<R>& r, typename event<T0, T1, T2, T3>::results_tuple_type& xs)
1404{
1405 return event<T0, T1, T2, T3>(xs).__instantiate(static_cast<R&>(r), 0, file, line);
1406}
1407
1408template <typename R, typename I, typename T0, typename T1, typename T2>
1409inline event<T0, T1, T2> make_annotated_event(const char *file, int line, one_argument_rendezvous_tag<R>& r, const I& eid, T0& x0, T1& x1, T2& x2)
1410{
1411 return event<T0, T1, T2>(x0, x1, x2).__instantiate(static_cast<R&>(r), static_cast<R&>(r).make_rid(eid), file, line);
1412}
1413
1414template <typename R, typename I, typename T0, typename T1, typename T2>
1415inline event<T0, T1, T2> make_annotated_event(const char *file, int line, one_argument_rendezvous_tag<R>& r, const I& eid, typename event<T0, T1, T2>::results_tuple_type& xs)
1416{
1417 return event<T0, T1, T2>(xs).__instantiate(static_cast<R&>(r), static_cast<R&>(r).make_rid(eid), file, line);
1418}
1419
1420template <typename R, typename T0, typename T1, typename T2>
1421inline event<T0, T1, T2> make_annotated_event(const char *file, int line, zero_argument_rendezvous_tag<R>& r, T0& x0, T1& x1, T2& x2)
1422{
1423 return event<T0, T1, T2>(x0, x1, x2).__instantiate(static_cast<R&>(r), 0, file, line);
1424}
1425
1426template <typename R, typename T0, typename T1, typename T2>
1427inline event<T0, T1, T2> make_annotated_event(const char *file, int line, zero_argument_rendezvous_tag<R>& r, typename event<T0, T1, T2>::results_tuple_type& xs)
1428{
1429 return event<T0, T1, T2>(xs).__instantiate(static_cast<R&>(r), 0, file, line);
1430}
1431
1432template <typename R, typename I, typename T0, typename T1>
1433inline event<T0, T1> make_annotated_event(const char *file, int line, one_argument_rendezvous_tag<R>& r, const I& eid, T0& x0, T1& x1)
1434{
1435 return event<T0, T1>(x0, x1).__instantiate(static_cast<R&>(r), static_cast<R&>(r).make_rid(eid), file, line);
1436}
1437
1438template <typename R, typename I, typename T0, typename T1>
1439inline event<T0, T1> make_annotated_event(const char *file, int line, one_argument_rendezvous_tag<R>& r, const I& eid, typename event<T0, T1>::results_tuple_type& xs)
1440{
1441 return event<T0, T1>(xs).__instantiate(static_cast<R&>(r), static_cast<R&>(r).make_rid(eid), file, line);
1442}
1443
1444template <typename R, typename T0, typename T1>
1445inline event<T0, T1> make_annotated_event(const char *file, int line, zero_argument_rendezvous_tag<R>& r, T0& x0, T1& x1)
1446{
1447 return event<T0, T1>(x0, x1).__instantiate(static_cast<R&>(r), 0, file, line);
1448}
1449
1450template <typename R, typename T0, typename T1>
1451inline event<T0, T1> make_annotated_event(const char *file, int line, zero_argument_rendezvous_tag<R>& r, typename event<T0, T1>::results_tuple_type& xs)
1452{
1453 return event<T0, T1>(xs).__instantiate(static_cast<R&>(r), 0, file, line);
1454}
1455
1456template <typename R, typename I, typename T0>
1457inline event<T0> make_annotated_event(const char *file, int line, one_argument_rendezvous_tag<R>& r, const I& eid, T0& x0)
1458{
1459 return event<T0>(x0).__instantiate(static_cast<R&>(r), static_cast<R&>(r).make_rid(eid), file, line);
1460}
1461
1462template <typename R, typename I, typename T0>
1463inline event<T0> make_annotated_event(const char *file, int line, one_argument_rendezvous_tag<R>& r, const I& eid, std::tuple<T0>& xs)
1464{
1465 return event<T0>(xs).__instantiate(static_cast<R&>(r), static_cast<R&>(r).make_rid(eid), file, line);
1466}
1467
1468#if !TAMER_HAVE_PREEVENT || !TAMER_PREFER_PREEVENT
1469template <typename R, typename T0>
1470inline event<T0> make_annotated_event(const char *file, int line, zero_argument_rendezvous_tag<R>& r, T0& x0)
1471{
1472 return event<T0>(x0).__instantiate(static_cast<R&>(r), 0, file, line);
1473}
1474
1475template <typename R, typename T0>
1476inline event<T0> make_annotated_event(const char *file, int line, zero_argument_rendezvous_tag<R>& r, std::tuple<T0>& xs)
1477{
1478 return event<T0>(xs).__instantiate(static_cast<R&>(r), 0, file, line);
1479}
1480#else
1481template <typename R, typename T0>
1482inline preevent<R, T0> make_annotated_event(const char *file, int line, zero_argument_rendezvous_tag<R>& r, T0& x0)
1483{
1484 return preevent<R, T0>(static_cast<R&>(r), x0, file, line);
1485}
1486
1487template <typename R, typename T0>
1488inline preevent<T0> make_annotated_event(const char *file, int line, zero_argument_rendezvous_tag<R>& r, std::tuple<T0>& xs)
1489{
1490 return preevent<R, T0>(static_cast<R&>(r), xs, file, line);
1491}
1492#endif
1493
1494#if TAMER_HAVE_PREEVENT
1495template <typename R, typename T0>
1496inline preevent<R, T0> make_annotated_preevent(const char *file, int line, zero_argument_rendezvous_tag<R>& r, T0& x0)
1497{
1498 return preevent<R, T0>(static_cast<R&>(r), x0, file, line);
1499}
1500
1501template <typename R, typename T0>
1502inline preevent<R, T0> make_annotated_preevent(const char *file, int line, zero_argument_rendezvous_tag<R>& r, std::tuple<T0>& xs)
1503{
1504 return preevent<R, T0>(static_cast<R&>(r), xs, file, line);
1505}
1506#endif
1507
1508template <typename R, typename I>
1509inline event<> make_annotated_event(const char *file, int line, one_argument_rendezvous_tag<R>& r, const I& eid)
1510{
1511 return event<>().__instantiate(static_cast<R&>(r), static_cast<R&>(r).make_rid(eid), file, line);
1512}
1513
1514template <typename R, typename I>
1515inline event<> make_annotated_event(const char *file, int line, one_argument_rendezvous_tag<R>& r, const I& eid, typename event<>::results_tuple_type& xs)
1516{
1517 return event<>(xs).__instantiate(static_cast<R&>(r), static_cast<R&>(r).make_rid(eid), file, line);
1518}
1519
1520#if !TAMER_HAVE_PREEVENT || !TAMER_PREFER_PREEVENT
1521template <typename R>
1522inline event<> make_annotated_event(const char *file, int line, zero_argument_rendezvous_tag<R>& r)
1523{
1524 return event<>().__instantiate(static_cast<R&>(r), 0, file, line);
1525}
1526
1527template <typename R>
1528inline event<> make_annotated_event(const char *file, int line, zero_argument_rendezvous_tag<R>& r, typename event<>::results_tuple_type& xs)
1529{
1530 return event<>(xs).__instantiate(static_cast<R&>(r), 0, file, line);
1531}
1532#else
1533template <typename R>
1534inline preevent<R> make_annotated_event(const char *file, int line, zero_argument_rendezvous_tag<R>& r)
1535{
1536 return preevent<R>(static_cast<R&>(r), file, line);
1537}
1538
1539template <typename R>
1540inline preevent<R> make_annotated_event(const char *file, int line, zero_argument_rendezvous_tag<R>& r, typename event<>::results_tuple_type& xs)
1541{
1542 (void) xs;
1543 return preevent<R>(static_cast<R&>(r), file, line);
1544}
1545#endif
1546
1547#if TAMER_HAVE_PREEVENT
1548template <typename R>
1549inline preevent<R> make_annotated_preevent(const char *file, int line, zero_argument_rendezvous_tag<R>& r)
1550{
1551 return preevent<R>(static_cast<R&>(r), file, line);
1552}
1553
1554template <typename R>
1555inline event<> make_annotated_preevent(const char *file, int line, zero_argument_rendezvous_tag<R>& r, typename event<>::results_tuple_type& xs)
1556{
1557 (void) xs;
1558 return preevent<R>(static_cast<R&>(r), file, line);
1559}
1560#endif
1561
1562namespace tamerpriv {
1563template <typename T0, typename T1, typename T2, typename T3>
1564inline event<T0, T1, T2, T3> distribute_rendezvous<T0, T1, T2, T3>::make_event() {
1565 return tamer::TAMER_MAKE_FN_ANNOTATED_EVENT(*this, vs_);
1566}
1567}
1568
1569
1570template <typename T0, typename T1, typename T2>
1571inline void event<T0, T1, T2>::at_trigger(const event<>& e) {
1572 tamerpriv::simple_event::use(e.__get_simple());
1573 tamerpriv::simple_event::at_trigger(se_, e.__get_simple());
1574}
1575
1576template <typename T0, typename T1>
1577inline void event<T0, T1>::at_trigger(const event<>& e) {
1578 tamerpriv::simple_event::use(e.__get_simple());
1579 tamerpriv::simple_event::at_trigger(se_, e.__get_simple());
1580}
1581
1582template <typename T0>
1583inline void event<T0>::at_trigger(const event<>& e) {
1584 tamerpriv::simple_event::use(e.__get_simple());
1585 tamerpriv::simple_event::at_trigger(se_, e.__get_simple());
1586}
1587
1588template <typename T0, typename T1, typename T2>
1589inline void event<T0, T1, T2>::at_trigger(event<>&& e) {
1590 tamerpriv::simple_event::at_trigger(se_, e.__release_simple());
1591}
1592
1593template <typename T0, typename T1>
1594inline void event<T0, T1>::at_trigger(event<>&& e) {
1595 tamerpriv::simple_event::at_trigger(se_, e.__release_simple());
1596}
1597
1598template <typename T0>
1599inline void event<T0>::at_trigger(event<>&& e) {
1600 tamerpriv::simple_event::at_trigger(se_, e.__release_simple());
1601}
1602
1603template <typename T0, typename T1, typename T2>
1604inline event<> event<T0, T1, T2>::unblocker() const noexcept {
1605 tamerpriv::simple_event::use(se_);
1606 return event<>::__make(se_);
1607}
1608
1609template <typename T0, typename T1>
1610inline event<> event<T0, T1>::unblocker() const noexcept {
1611 tamerpriv::simple_event::use(se_);
1612 return event<>::__make(se_);
1613}
1614
1615template <typename T0>
1616inline event<> event<T0>::unblocker() const noexcept {
1617 tamerpriv::simple_event::use(se_);
1618 return event<>::__make(se_);
1619}
1620
1621#if TAMER_HAVE_PREEVENT
1622template <typename T0> template <typename R>
1623inline event<T0>::event(preevent<R, T0>&& x)
1624 : se_(x.r_ ? new tamerpriv::simple_event(*x.r_, 0, TAMER_IFTRACE_ELSE(x.file_annotation_, 0), TAMER_IFTRACE_ELSE(x.line_annotation_, 0)) : 0), s0_(x.s0_) {
1625 x.r_ = nullptr;
1626}
1627
1628template <typename R>
1629inline event<>::event(preevent<R>&& x)
1630 : se_(x.r_ ? new tamerpriv::simple_event(*x.r_, 0, TAMER_IFTRACE_ELSE(x.file_annotation_, 0), TAMER_IFTRACE_ELSE(x.line_annotation_, 0)) : 0) {
1631 x.r_ = nullptr;
1632}
1633#endif
1634
1635template <typename T0>
1636inline event<T0>::event(const event<>& x, results_tuple_type& vs)
1637 : se_(x.__get_simple()), s0_(&std::get<0>(vs)) {
1638 tamerpriv::simple_event::use(se_);
1639}
1640
1641template <typename T0>
1642inline event<T0>::event(event<>&& x, results_tuple_type& vs) noexcept
1643 : se_(x.__release_simple()), s0_(&std::get<0>(vs)) {
1644}
1645
1646template <typename T0, typename T1, typename T2, typename T3>
1647inline event<T0, T1, T2, T3>& event<T0, T1, T2, T3>::operator+=(event<T0, T1, T2, T3> x) {
1648 typedef tamerpriv::distribute_rendezvous<T0, T1, T2, T3> rendezvous_type;
1649 rendezvous_type::make(*this, std::move(x));
1650 return *this;
1651}
1652
1653template <typename T0, typename T1, typename T2>
1654inline event<T0, T1, T2>& event<T0, T1, T2>::operator+=(event<T0, T1, T2> x) {
1655 typedef tamerpriv::distribute_rendezvous<T0, T1, T2> rendezvous_type;
1656 rendezvous_type::make(*this, std::move(x));
1657 return *this;
1658}
1659
1660template <typename T0, typename T1>
1661inline event<T0, T1>& event<T0, T1>::operator+=(event<T0, T1> x) {
1662 typedef tamerpriv::distribute_rendezvous<T0, T1> rendezvous_type;
1663 rendezvous_type::make(*this, std::move(x));
1664 return *this;
1665}
1666
1667template <typename T0>
1668inline event<T0>& event<T0>::operator+=(event<T0> x) {
1669 typedef tamerpriv::distribute_rendezvous<T0> rendezvous_type;
1670 rendezvous_type::make(*this, std::move(x));
1671 return *this;
1672}
1673
1674inline event<>& event<>::operator+=(event<> x) {
1675 typedef tamerpriv::distribute_rendezvous<> rendezvous_type;
1676 rendezvous_type::make(*this, std::move(x));
1677 return *this;
1678}
1679
1680template <typename T0, typename T1>
1681inline event<T0, T1> operator+(event<T0, T1> a, event<T0, T1> b) {
1682 return a += b;
1683}
1684
1685template <typename T0, typename T1, typename T2, typename T3>
1686inline const char* event<T0, T1, T2, T3>::file_annotation() const {
1687 return se_ ? se_->file_annotation() : 0;
1688}
1689
1690template <typename T0, typename T1, typename T2>
1691inline const char* event<T0, T1, T2>::file_annotation() const {
1692 return se_ ? se_->file_annotation() : 0;
1693}
1694
1695template <typename T0, typename T1>
1696inline const char* event<T0, T1>::file_annotation() const {
1697 return se_ ? se_->file_annotation() : 0;
1698}
1699
1700template <typename T0>
1701inline const char* event<T0>::file_annotation() const {
1702 return se_ ? se_->file_annotation() : 0;
1703}
1704
1705inline const char* event<>::file_annotation() const {
1706 return se_ ? se_->file_annotation() : 0;
1707}
1708
1709template <typename T0, typename T1, typename T2, typename T3>
1710inline int event<T0, T1, T2, T3>::line_annotation() const {
1711 return se_ ? se_->line_annotation() : 0;
1712}
1713
1714template <typename T0, typename T1, typename T2>
1715inline int event<T0, T1, T2>::line_annotation() const {
1716 return se_ ? se_->line_annotation() : 0;
1717}
1718
1719template <typename T0, typename T1>
1720inline int event<T0, T1>::line_annotation() const {
1721 return se_ ? se_->line_annotation() : 0;
1722}
1723
1724template <typename T0>
1725inline int event<T0>::line_annotation() const {
1726 return se_ ? se_->line_annotation() : 0;
1727}
1728
1729inline int event<>::line_annotation() const {
1730 return se_ ? se_->line_annotation() : 0;
1731}
1732
1733} // namespace tamer
1734#endif /* TAMER_EVENT_HH */
void at_trigger(const event<> &e)
Definition event.hh:785
void unblock() noexcept
Definition event.hh:765
event() noexcept
Default constructor creates an empty event.
Definition event.hh:647
~event() noexcept
Destroy the event instance.
Definition event.hh:693
void tuple_trigger(const results_tuple_type &vs)
Definition event.hh:754
event< T0, T1, T2, T3 > & operator=(const event< T0, T1, T2, T3 > &x) noexcept
Assign this event to x.
Definition event.hh:814
bool empty() const
Definition event.hh:707
event unblocker() const noexcept
Definition event.hh:805
void operator()(T0 v0, T1 v1, T2 v2, T3 v3)
Trigger event.
Definition event.hh:720
void trigger(int v0, T1 v1, T2 v2, T3 v3)
Definition event.hh:742
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
event< T0, T1, T2, T3 > operator+(event< T0, T1, T2, T3 > e1, event< T0, T1, T2, T3 > e2)
Create event that triggers e1 and e2 when triggered.
Definition adapter.hh:33
event< T0, T1, T2, T3 > make_annotated_event(const char *file, int line, one_argument_rendezvous_tag< R > &r, const I &eid, T0 &x0, T1 &x1, T2 &x2, T3 &x3)
Definition event.hh:1385
The rendezvous template classes.