Skip to content

Commit d7cb47c

Browse files
committed
renaming signal to sig and introducing val_sig
1 parent 30f3c1d commit d7cb47c

File tree

3 files changed

+102
-13
lines changed

3 files changed

+102
-13
lines changed

include/proto_activities.h

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
#ifdef _PA_ENABLE_CPP
2121
#include <functional> /* for std::function */
2222
#include <type_traits> /* for std::true_type, std::void_t, std::enable_if etc. */
23+
#if __cplusplus >= 201703L
24+
#include <optional>
25+
#endif
2326
#endif
2427

2528
/* Types */
@@ -503,14 +506,15 @@ namespace proto_activities {
503506

504507
/* Signals */
505508

506-
#ifdef __cplusplus
509+
#ifdef _PA_ENABLE_CPP
510+
507511
namespace proto_activities {
508-
struct BoolSignal final : Updatable {
509-
BoolSignal(Enter& enter) {
512+
struct Signal final : Updatable {
513+
Signal(Enter& enter) {
510514
enter.add(this);
511515
}
512-
BoolSignal(const BoolSignal&) = delete;
513-
BoolSignal& operator=(const BoolSignal&) {
516+
Signal(const Signal&) = delete;
517+
Signal& operator=(const Signal&) {
514518
value_ = false;
515519
return *this;
516520
}
@@ -526,12 +530,47 @@ namespace proto_activities {
526530
private:
527531
bool value_;
528532
};
533+
#if __cplusplus >= 201703L
534+
template <typename T>
535+
struct ValSignal final : Updatable {
536+
ValSignal(Enter& enter) {
537+
enter.add(this);
538+
}
539+
ValSignal(const ValSignal&) = delete;
540+
ValSignal& operator=(const ValSignal&) {
541+
value_.reset();
542+
return *this;
543+
}
544+
void emit(T&& t) {
545+
value_.emplace(std::move(t));
546+
}
547+
operator bool() const {
548+
return value_.has_value();
549+
}
550+
const T& val() const {
551+
return *value_;
552+
}
553+
void update() final {
554+
value_.reset();
555+
}
556+
private:
557+
std::optional<T> value_;
558+
};
559+
#endif
529560
}
530-
using pa_signal = proto_activities::BoolSignal;
531561

532-
#define pa_def_signal(nm) pa_signal nm{_pa_enter};
562+
using pa_sig = proto_activities::Signal;
563+
#define pa_sig_res pa_enter_res
564+
#define pa_def_sig(nm) pa_sig nm{_pa_enter};
533565
#define pa_emit(sig) sig.emit();
534566

567+
#if __cplusplus >= 201703L
568+
template <typename T>
569+
using pa_val_sig = proto_activities::ValSignal<T>;
570+
#define pa_def_val_sig(ty, nm) pa_val_sig<ty> nm{_pa_enter};
571+
#define pa_emit_val(sig, val) sig.emit(val);
572+
#endif
573+
535574
#endif
536575

537576
/* Trigger */

tests_cpp/Makefile

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1-
run: tests
1+
run: tests tests17
22
./tests
3+
./tests17
34

45
tests: tests.cpp ../include/proto_activities.h
56
c++ --std c++14 -I ../include tests.cpp -o tests
6-
7+
8+
tests17: tests.cpp ../include/proto_activities.h
9+
c++ --std c++17 -I ../include tests.cpp -o tests17
10+
711
clean:
812
rm tests
13+
rm tests17

tests_cpp/tests.cpp

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -804,7 +804,7 @@ pa_activity (TestLifecycle, pa_ctx(pa_co_res(2); pa_use(TestLifecycleBody); pa_u
804804

805805
// Signal Tests
806806

807-
pa_activity (TestSignalsBodySub, pa_ctx(), pa_signal& s1, pa_signal& s2) {
807+
pa_activity (TestSignalsBodySub, pa_ctx(), pa_sig& s1, pa_sig& s2) {
808808
assert(!s1); assert(!s2);
809809
pa_pause;
810810

@@ -817,8 +817,8 @@ pa_activity (TestSignalsBodySub, pa_ctx(), pa_signal& s1, pa_signal& s2) {
817817
pa_pause;
818818
} pa_end
819819

820-
pa_activity (TestSignalsBody, pa_ctx(pa_enter_res; pa_use(TestSignalsBodySub);
821-
pa_def_signal(s1); pa_def_signal(s2))) {
820+
pa_activity (TestSignalsBody, pa_ctx(pa_sig_res; pa_use(TestSignalsBodySub);
821+
pa_def_sig(s1); pa_def_sig(s2))) {
822822
assert(!pa_self.s1); assert(!pa_self.s2);
823823
pa_pause;
824824

@@ -830,7 +830,7 @@ pa_activity (TestSignalsBody, pa_ctx(pa_enter_res; pa_use(TestSignalsBodySub);
830830
assert(!pa_self.s1); assert(!pa_self.s2);
831831
pa_pause;
832832

833-
pa_run(TestSignalsBodySub, pa_self.s1, pa_self.s1);
833+
pa_run(TestSignalsBodySub, pa_self.s1, pa_self.s2);
834834
} pa_end
835835

836836
pa_activity (TestSignals, pa_ctx_tm(pa_use(TestSignalsBody))) {
@@ -840,6 +840,48 @@ pa_activity (TestSignals, pa_ctx_tm(pa_use(TestSignalsBody))) {
840840
pa_run (TestSignalsBody); // Test re-invocation after abort
841841
} pa_end
842842

843+
#if __cplusplus >= 201703L
844+
845+
pa_activity (TestValSignalsBodySub, pa_ctx(), pa_val_sig<int>& s1, pa_val_sig<float>& s2) {
846+
assert(!s1); assert(!s2);
847+
pa_pause;
848+
849+
assert(!s1); assert(!s2);
850+
pa_emit_val(s1, 42); pa_emit_val(s2, 3.14f);
851+
assert(s1); assert(s2);
852+
assert(s1.val() == 42); assert(s2.val() != 0.0f);
853+
pa_pause;
854+
855+
assert(!s1); assert(!s2);
856+
pa_pause;
857+
} pa_end
858+
859+
pa_activity (TestValSignalsBody, pa_ctx(pa_sig_res; pa_use(TestValSignalsBodySub);
860+
pa_def_val_sig(int, s1); pa_def_val_sig(float, s2))) {
861+
assert(!pa_self.s1); assert(!pa_self.s2);
862+
pa_pause;
863+
864+
assert(!pa_self.s1); assert(!pa_self.s2);
865+
pa_emit_val(pa_self.s1, 42); pa_emit_val(pa_self.s2, 3.14f);
866+
assert(pa_self.s1); assert(pa_self.s2);
867+
assert(pa_self.s1.val() == 42); assert(pa_self.s2.val() != 0.0f);
868+
pa_pause;
869+
870+
assert(!pa_self.s1); assert(!pa_self.s2);
871+
pa_pause;
872+
873+
pa_run(TestValSignalsBodySub, pa_self.s1, pa_self.s2);
874+
} pa_end
875+
876+
pa_activity (TestValSignals, pa_ctx_tm(pa_use(TestValSignalsBody))) {
877+
pa_run (TestValSignalsBody);
878+
pa_run (TestValSignalsBody); // Test re-invocation
879+
pa_after_abort (2, TestValSignalsBody);
880+
pa_run (TestValSignalsBody); // Test re-invocation after abort
881+
} pa_end
882+
883+
#endif
884+
843885
} // namespace tests
844886

845887
// Test Driver
@@ -861,6 +903,9 @@ int main(int argc, char* argv[]) {
861903
run_test(tests, TestEvery);
862904
run_test(tests, TestLifecycle);
863905
run_test(tests, TestSignals);
906+
#if __cplusplus >= 201703L
907+
run_test(tests, TestValSignals);
908+
#endif
864909

865910
std::cout << "Done" << std::endl;
866911

0 commit comments

Comments
 (0)