diff --git a/libwccl/values/bool.h b/libwccl/values/bool.h index 53393fb1ba509b0df7188fe3094a05169d26cfdc..a9152139dbf66a68a8940d7b01010fc0c469212a 100644 --- a/libwccl/values/bool.h +++ b/libwccl/values/bool.h @@ -39,6 +39,17 @@ public: return val_ ? "True" : "False"; } + typedef void (Bool::*safe_bool)() const; + void safe_bool_helper() const {} + + operator safe_bool() const { + return val_ ? &Bool::safe_bool_helper : 0; + } + + bool operator!() const { + return !val_; + } + private: bool val_; }; diff --git a/tests/values.cpp b/tests/values.cpp index d87c1b1f3744ea5e9280f5e87c40c220c6c7c257..837e1e2eeeedaff6bae9c92edf986006b935bc77 100644 --- a/tests/values.cpp +++ b/tests/values.cpp @@ -188,4 +188,22 @@ BOOST_AUTO_TEST_CASE(position_ops) BOOST_CHECK(end.equals(minus_one, sc)); } +BOOST_AUTO_TEST_CASE(bool_safe_bool) +{ + Bool b(false); + BOOST_CHECK(!b); + if (b) { + BOOST_ERROR("if (b) on Bool(false)"); + } + b.set_value(true); + if (!b) { + BOOST_ERROR("if (!b) on Bool(true)"); + } + if (b) { + } else { + BOOST_ERROR("if (b) else reached on Bool(true)"); + } + BOOST_CHECK(b); +} + BOOST_AUTO_TEST_SUITE_END()