From 182342fb3e6ecbe1b51f786acd650c774248ac78 Mon Sep 17 00:00:00 2001
From: ilor <kailoran@gmail.com>
Date: Wed, 9 Mar 2011 12:37:37 +0100
Subject: [PATCH] use safe_bool in Value's Bool to allow if(b) constructs

---
 libwccl/values/bool.h | 11 +++++++++++
 tests/values.cpp      | 18 ++++++++++++++++++
 2 files changed, 29 insertions(+)

diff --git a/libwccl/values/bool.h b/libwccl/values/bool.h
index 53393fb..a915213 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 d87c1b1..837e1e2 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()
-- 
GitLab