You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by br...@apache.org on 2018/12/22 15:34:06 UTC

svn commit: r1849555 - in /subversion/trunk/subversion/bindings/cxx: include/svnxx/tristate.hpp tests/test_tristate.cpp

Author: brane
Date: Sat Dec 22 15:34:06 2018
New Revision: 1849555

URL: http://svn.apache.org/viewvc?rev=1849555&view=rev
Log:
Provide optional interoperability between tristate and boost::tribool in SVNXX.

* subversion/bindings/cxx/include/svnxx/tristate.hpp:
  (class tristate): Add conversions to and from boost::tribool if
   SVNXX_USE_BOOST is defined.
  (operator&&, operator||, operator==, operator!=): Likewise, when
   SVNXX_USE_BOOST is defined, provide overloads for boost::tribool.

Modified:
    subversion/trunk/subversion/bindings/cxx/include/svnxx/tristate.hpp
    subversion/trunk/subversion/bindings/cxx/tests/test_tristate.cpp

Modified: subversion/trunk/subversion/bindings/cxx/include/svnxx/tristate.hpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/cxx/include/svnxx/tristate.hpp?rev=1849555&r1=1849554&r2=1849555&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/cxx/include/svnxx/tristate.hpp (original)
+++ subversion/trunk/subversion/bindings/cxx/include/svnxx/tristate.hpp Sat Dec 22 15:34:06 2018
@@ -28,6 +28,10 @@
 #ifndef SVNXX_TRISTATE_HPP
 #define SVNXX_TRISTATE_HPP
 
+#if defined(SVNXX_USE_BOOST) || defined(DOXYGEN)
+#include <boost/logic/tribool.hpp>
+#endif
+
 namespace apache {
 namespace subversion {
 namespace svnxx {
@@ -137,12 +141,38 @@ private:
     true_value,
     unknown_value
   } value;
+
+#if defined(SVNXX_USE_BOOST) || defined(DOXYGEN)
+public:
+  /**
+   * @brief Conversion from <tt>boost::tribool</tt>.
+   * @returns a @c tribool value equivalent to the @a t.
+   * @note Avalible only if @c SVNXX_USE_BOOST is defined.
+   */
+  constexpr tristate(boost::tribool t) noexcept
+    : value(boost::indeterminate(t) ? unknown_value
+            : (t ? true_value : false_value))
+    {}
+
+  /**
+   * @brief Conversion to <tt>boost::tribool</tt>.
+   * @returns a <tt>boost::tribool</tt> value equivalent to the @c
+   * tristate value.
+   * @note Avalible only if @c SVNXX_USE_BOOST is defined.
+   */
+  constexpr operator boost::tribool() const noexcept
+    {
+      return (value == true_value ? boost::tribool(true)
+              : (value == false_value ? boost::tribool(false)
+                 : boost::tribool(boost::indeterminate)));
+    }
+#endif
 };
 
 /**
  * @related tristate
  * @brief Test for the @e unknown @c tristate state.
- * @returns @c true only if @a t is the @e * unknown state.
+ * @returns @c true only if @a t is the @e unknown state.
  */
 constexpr inline bool unknown(tristate t) noexcept
 {
@@ -206,6 +236,28 @@ constexpr inline tristate operator&&(boo
   return b ? t : tristate(false);
 }
 
+#if defined(SVNXX_USE_BOOST) || defined(DOXYGEN)
+/**
+ * @related tristate
+ * @overload
+ * @note Avalible only if @c SVNXX_USE_BOOST is defined.
+ */
+constexpr inline tristate operator&&(tristate t, boost::tribool b) noexcept
+{
+  return t && tristate(b);
+}
+
+/**
+ * @related tristate
+ * @overload
+ * @note Avalible only if @c SVNXX_USE_BOOST is defined.
+ */
+constexpr inline tristate operator&&(boost::tribool b, tristate t) noexcept
+{
+  return tristate(b) && t;
+}
+#endif
+
 /**
  * @related tristate
  * @brief Logical disjunction.
@@ -263,6 +315,28 @@ constexpr inline tristate operator||(boo
   return b ? tristate(true) : t;
 }
 
+#if defined(SVNXX_USE_BOOST) || defined(DOXYGEN)
+/**
+ * @related tristate
+ * @overload
+ * @note Avalible only if @c SVNXX_USE_BOOST is defined.
+ */
+constexpr inline tristate operator||(tristate t, boost::tribool b) noexcept
+{
+  return t || tristate(b);
+}
+
+/**
+ * @related tristate
+ * @overload
+ * @note Avalible only if @c SVNXX_USE_BOOST is defined.
+ */
+constexpr inline tristate operator||(boost::tribool b, tristate t) noexcept
+{
+  return tristate(b) || t;
+}
+#endif
+
 /**
  * @related tristate
  * @brief Equality comparison.
@@ -319,6 +393,28 @@ constexpr inline tristate operator==(boo
   return tristate(b) == t;
 }
 
+#if defined(SVNXX_USE_BOOST) || defined(DOXYGEN)
+/**
+ * @related tristate
+ * @overload
+ * @note Avalible only if @c SVNXX_USE_BOOST is defined.
+ */
+constexpr inline tristate operator==(tristate t, boost::tribool b) noexcept
+{
+  return t == tristate(b);
+}
+
+/**
+ * @related tristate
+ * @overload
+ * @note Avalible only if @c SVNXX_USE_BOOST is defined.
+ */
+constexpr inline tristate operator==(boost::tribool b, tristate t) noexcept
+{
+  return tristate(b) == t;
+}
+#endif
+
 /**
  * @related tristate
  * @brief Inquality comparison.
@@ -375,6 +471,28 @@ constexpr inline tristate operator!=(boo
   return tristate(b) != t;
 }
 
+#if defined(SVNXX_USE_BOOST) || defined(DOXYGEN)
+/**
+ * @related tristate
+ * @overload
+ * @note Avalible only if @c SVNXX_USE_BOOST is defined.
+ */
+constexpr inline tristate operator!=(tristate t, boost::tribool b) noexcept
+{
+  return t != tristate(b);
+}
+
+/**
+ * @related tristate
+ * @overload
+ * @note Avalible only if @c SVNXX_USE_BOOST is defined.
+ */
+constexpr inline tristate operator!=(boost::tribool b, tristate t) noexcept
+{
+  return tristate(b) != t;
+}
+#endif
+
 } // namespace svnxx
 } // namespace subversion
 } // namespace apache

Modified: subversion/trunk/subversion/bindings/cxx/tests/test_tristate.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/cxx/tests/test_tristate.cpp?rev=1849555&r1=1849554&r2=1849555&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/cxx/tests/test_tristate.cpp (original)
+++ subversion/trunk/subversion/bindings/cxx/tests/test_tristate.cpp Sat Dec 22 15:34:06 2018
@@ -26,14 +26,14 @@
 namespace svn = ::apache::subversion::svnxx;
 namespace detail = ::apache::subversion::svnxx::detail;
 
-BOOST_AUTO_TEST_SUITE(tristate);
-
 namespace {
 constexpr auto T = svn::tristate(true);
 constexpr auto F = svn::tristate(false);
 constexpr auto X = svn::tristate::unknown();
 } // anonymous namespace
 
+BOOST_AUTO_TEST_SUITE(tristate);
+
 BOOST_AUTO_TEST_CASE(constants)
 {
   BOOST_TEST(!svn::unknown(T));
@@ -260,3 +260,110 @@ BOOST_AUTO_TEST_CASE(bool_neq_tristate)
 }
 
 BOOST_AUTO_TEST_SUITE_END();
+
+
+#ifdef SVNXX_USE_BOOST
+namespace {
+constexpr auto boost_T = boost::tribool(true);
+constexpr auto boost_F = boost::tribool(false);
+constexpr auto boost_X = boost::tribool(boost::indeterminate);
+} // anonymous namespace
+
+BOOST_AUTO_TEST_SUITE(tristate_tribool);
+
+BOOST_AUTO_TEST_CASE(conversion_to_tribool)
+{
+  boost::tribool state;
+  BOOST_TEST((state = T) == boost_T);
+  BOOST_TEST((state = F) == boost_F);
+  BOOST_TEST(boost::indeterminate(X));
+}
+
+BOOST_AUTO_TEST_CASE(conversion_from_tribool)
+{
+  svn::tristate state(false);   // Note: no public default constructor.
+  BOOST_TEST((state = boost_T) == T);
+  BOOST_TEST((state = boost_F) == F);
+  BOOST_TEST(svn::unknown(boost_X));
+}
+
+BOOST_AUTO_TEST_CASE(tristate_and_tribool)
+{
+  BOOST_TEST((T && boost_T) == T);
+  BOOST_TEST((T && boost_F) == F);
+  BOOST_TEST((F && boost_T) == F);
+  BOOST_TEST((F && boost_F) == F);
+  BOOST_TEST(svn::unknown(T && boost_X));
+  BOOST_TEST(svn::unknown(X && boost_T));
+  BOOST_TEST((F && boost_X) == F);
+  BOOST_TEST((X && boost_F) == F);
+  BOOST_TEST(svn::unknown(X && boost_X));
+}
+
+BOOST_AUTO_TEST_CASE(tribool_and_tristate)
+{
+  BOOST_TEST((boost_T && T) == T);
+  BOOST_TEST((boost_T && F) == F);
+  BOOST_TEST((boost_F && T) == F);
+  BOOST_TEST((boost_F && F) == F);
+  BOOST_TEST(svn::unknown(boost_T && X));
+  BOOST_TEST(svn::unknown(boost_X && T));
+  BOOST_TEST((boost_F && X) == F);
+  BOOST_TEST((boost_X && F) == F);
+  BOOST_TEST(svn::unknown(boost_X && X));
+}
+
+BOOST_AUTO_TEST_CASE(tristate_or_tribool)
+{
+  BOOST_TEST((T || boost_T) == T);
+  BOOST_TEST((T || boost_F) == T);
+  BOOST_TEST((F || boost_T) == T);
+  BOOST_TEST((F || boost_F) == F);
+  BOOST_TEST((T || boost_X) == T);
+  BOOST_TEST((X || boost_T) == T);
+  BOOST_TEST(svn::unknown(F || boost_X));
+  BOOST_TEST(svn::unknown(X || boost_F));
+  BOOST_TEST(svn::unknown(X || boost_X));
+}
+
+BOOST_AUTO_TEST_CASE(tribool_or_tristate)
+{
+  BOOST_TEST((boost_T || T) == T);
+  BOOST_TEST((boost_T || F) == T);
+  BOOST_TEST((boost_F || T) == T);
+  BOOST_TEST((boost_F || F) == F);
+  BOOST_TEST((boost_T || X) == T);
+  BOOST_TEST((boost_X || T) == T);
+  BOOST_TEST(svn::unknown(boost_F || X));
+  BOOST_TEST(svn::unknown(boost_X || F));
+  BOOST_TEST(svn::unknown(boost_X || X));
+}
+
+BOOST_AUTO_TEST_CASE(tristate_eq_tribool)
+{
+  BOOST_TEST((T == boost_T) == T);
+  BOOST_TEST((T == boost_F) == F);
+  BOOST_TEST(svn::unknown(T == boost_X));
+  BOOST_TEST((F == boost_T) == F);
+  BOOST_TEST((F == boost_F) == T);
+  BOOST_TEST(svn::unknown(F == boost_X));
+  BOOST_TEST(svn::unknown(X == boost_T));
+  BOOST_TEST(svn::unknown(X == boost_F));
+  BOOST_TEST(svn::unknown(X == boost_X));
+}
+
+BOOST_AUTO_TEST_CASE(tribool_eq_tristate)
+{
+  BOOST_TEST((boost_T == T) == T);
+  BOOST_TEST((boost_T == F) == F);
+  BOOST_TEST(svn::unknown(boost_T == X));
+  BOOST_TEST((boost_F == T) == F);
+  BOOST_TEST((boost_F == F) == T);
+  BOOST_TEST(svn::unknown(boost_F == X));
+  BOOST_TEST(svn::unknown(boost_X == T));
+  BOOST_TEST(svn::unknown(boost_X == F));
+  BOOST_TEST(svn::unknown(boost_X == X));
+}
+
+BOOST_AUTO_TEST_SUITE_END();
+#endif // SVNXX_USE_BOOST