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 2019/01/04 14:17:23 UTC
svn commit: r1850365 - in /subversion/trunk/subversion/bindings/cxx/src:
depth.cpp private/depth_private.hpp
Author: brane
Date: Fri Jan 4 14:17:23 2019
New Revision: 1850365
URL: http://svn.apache.org/viewvc?rev=1850365&view=rev
Log:
Make conversions between svn_depth_t and svn::depth compile-time
constant expressions in SVN++.
[in subversion/bindings/cxx/src]
* private/depth_private.hpp: Include <stdexcept>. Do not include svn_types.h.
(impl::convert): Implement here as inline constexpr functions.
* depth.cpp: Update include directives.
(impl::convert): Remove implementation.
Modified:
subversion/trunk/subversion/bindings/cxx/src/depth.cpp
subversion/trunk/subversion/bindings/cxx/src/private/depth_private.hpp
Modified: subversion/trunk/subversion/bindings/cxx/src/depth.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/cxx/src/depth.cpp?rev=1850365&r1=1850364&r2=1850365&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/cxx/src/depth.cpp (original)
+++ subversion/trunk/subversion/bindings/cxx/src/depth.cpp Fri Jan 4 14:17:23 2019
@@ -21,10 +21,10 @@
* @endcopyright
*/
-#include <stdexcept>
+#include "private/depth_private.hpp"
+#include "private/strings_private.hpp"
-#include "svnxx/depth.hpp"
-#include "private.hpp"
+#include "svn_types.h"
namespace apache {
namespace subversion {
@@ -50,93 +50,6 @@ std::u32string to_u32string(depth d)
return impl::convert<char32_t>(svn_depth_to_word(impl::convert(d)));
}
-namespace impl {
-
-svn_depth_t convert(depth d)
-{
-#ifdef SVN_DEBUG
- switch (d)
- {
- case depth::unknown:
- if (svn_depth_t(d) != svn_depth_unknown)
- throw std::range_error("convert svn::depth::unknown");
- break;
-
- case depth::exclude:
- if (svn_depth_t(d) != svn_depth_exclude)
- throw std::range_error("convert svn::depth::exclude");
- break;
-
- case depth::empty:
- if (svn_depth_t(d) != svn_depth_empty)
- throw std::range_error("convert svn::depth::empty");
- break;
-
- case depth::files:
- if (svn_depth_t(d) != svn_depth_files)
- throw std::range_error("convert svn::depth::files");
- break;
-
- case depth::immediates:
- if (svn_depth_t(d) != svn_depth_immediates)
- throw std::range_error("convert svn::depth::immediates");
- break;
-
- case depth::infinity:
- if (svn_depth_t(d) != svn_depth_infinity)
- throw std::range_error("convert svn::depth::infinity");
- break;
-
- default:
- throw std::range_error("unknown svn::depth");
- }
-#endif
- return svn_depth_t(d);
-}
-
-depth convert(svn_depth_t d)
-{
-#ifdef SVN_DEBUG
- switch (d)
- {
- case svn_depth_unknown:
- if (d != svn_depth_t(depth::unknown))
- throw std::range_error("convert svn_depth_unknown");
- break;
-
- case svn_depth_exclude:
- if (d != svn_depth_t(depth::exclude))
- throw std::range_error("convert svn_depth_exclude");
- break;
-
- case svn_depth_empty:
- if (d != svn_depth_t(depth::empty))
- throw std::range_error("convert svn_depth_empty");
- break;
-
- case svn_depth_files:
- if (d != svn_depth_t(depth::files))
- throw std::range_error("convert svn_depth_files");
- break;
-
- case svn_depth_immediates:
- if (d != svn_depth_t(depth::immediates))
- throw std::range_error("convert svn_depth_immediates");
- break;
-
- case svn_depth_infinity:
- if (d != svn_depth_t(depth::infinity))
- throw std::range_error("convert svn_depth_infinity");
- break;
-
- default:
- throw std::range_error("unknown svn_depth_t");
- }
-#endif
- return depth(d);
-}
-
-} // namespace impl
} // namespace svnxx
} // namespace subversion
} // namespace apache
Modified: subversion/trunk/subversion/bindings/cxx/src/private/depth_private.hpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/cxx/src/private/depth_private.hpp?rev=1850365&r1=1850364&r2=1850365&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/cxx/src/private/depth_private.hpp (original)
+++ subversion/trunk/subversion/bindings/cxx/src/private/depth_private.hpp Fri Jan 4 14:17:23 2019
@@ -24,9 +24,9 @@
#ifndef SVNXX_PRIVATE_DEPTH_HPP
#define SVNXX_PRIVATE_DEPTH_HPP
-#include "svnxx/depth.hpp"
+#include <stdexcept>
-#include "svn_types.h"
+#include "svnxx/depth.hpp"
namespace apache {
namespace subversion {
@@ -36,12 +36,90 @@ namespace impl {
/**
* Convert @a d to an svn_depth_t.
*/
-svn_depth_t convert(depth d);
+inline constexpr svn_depth_t convert(depth d)
+{
+#ifndef SVN_DEBUG
+ return svn_depth_t(d);
+#else
+ // switch in constexpr is allowed in C++14 but not in C++11, so we
+ // have to use a series of ternary operators.
+ return (d == depth::unknown
+ ? (svn_depth_t(d) != svn_depth_unknown
+ ? throw std::range_error("convert(svn::depth::unknown)")
+ : svn_depth_t(d))
+ :
+ d == depth::exclude
+ ? (svn_depth_t(d) != svn_depth_exclude
+ ? throw std::range_error("convert(svn::depth::exclude)")
+ : svn_depth_t(d))
+ :
+ d == depth::empty
+ ? (svn_depth_t(d) != svn_depth_empty
+ ? throw std::range_error("convert(svn::depth::empty)")
+ : svn_depth_t(d))
+ :
+ d == depth::files
+ ? (svn_depth_t(d) != svn_depth_files
+ ? throw std::range_error("convert(svn::depth::files)")
+ : svn_depth_t(d))
+ :
+ d == depth::immediates
+ ? (svn_depth_t(d) != svn_depth_immediates
+ ? throw std::range_error("convert(svn::depth::immediates)")
+ : svn_depth_t(d))
+ :
+ d == depth::infinity
+ ? (svn_depth_t(d) != svn_depth_infinity
+ ? throw std::range_error("convert(svn::depth::infinity)")
+ : svn_depth_t(d))
+ :
+ throw std::range_error("convert: unknown svn::depth"));
+#endif
+}
/**
* Convert @a d to an svn::depth.
*/
-depth convert(svn_depth_t d);
+inline constexpr depth convert(svn_depth_t d)
+{
+#ifndef SVN_DEBUG
+ return depth(d);
+#else
+ // switch in constexpr is allowed in C++14 but not in C++11, so we
+ // have to use a series of ternary operators.
+ return (d == svn_depth_unknown
+ ? (d != svn_depth_t(depth::unknown)
+ ? throw std::range_error("convert(svn_depth_unknown)")
+ : depth(d))
+ :
+ d == svn_depth_exclude
+ ? (d != svn_depth_t(depth::exclude)
+ ? throw std::range_error("convert(svn_depth_exclude)")
+ : depth(d))
+ :
+ d == svn_depth_empty
+ ? (d != svn_depth_t(depth::empty)
+ ? throw std::range_error("convert(svn_depth_empty)")
+ : depth(d))
+ :
+ d == svn_depth_files
+ ? (d != svn_depth_t(depth::files)
+ ? throw std::range_error("convert(svn_depth_files)")
+ : depth(d))
+ :
+ d == svn_depth_immediates
+ ? (d != svn_depth_t(depth::immediates)
+ ? throw std::range_error("convert(svn_depth_immediates)")
+ : depth(d))
+ :
+ d == svn_depth_infinity
+ ? (d != svn_depth_t(depth::infinity)
+ ? throw std::range_error("convert(svn_depth_infinity)")
+ : depth(d))
+ :
+ throw std::range_error("convert: unknown svn_depth_t"));
+#endif
+}
} // namespace impl
} // namespace svnxx