include/o3tl/concepts.hxx |   45 +++++++++++++++++++++++++++++++++++++++++++++
 sw/inc/nodeoffset.hxx     |    9 +++------
 2 files changed, 48 insertions(+), 6 deletions(-)

New commits:
commit dcaa2c4870e0b2662c597f53c46b1df347183e7c
Author:     Stephan Bergmann <[email protected]>
AuthorDate: Tue Oct 24 22:07:26 2023 +0200
Commit:     Stephan Bergmann <[email protected]>
CommitDate: Wed Oct 25 10:27:26 2023 +0200

    Use std::signed_integral concept
    
    ...which, unlike std::is_signed, also requires that T is an integer type, 
not
    just any arithmetic type, but which appears to fit well here anyway.
    
    But LLVM 12 libc++, which is apparently used by Android builds, only 
provides a
    bare-bones <concepts> that lacks std::signed_integral (among others), so 
for now
    introduce o3tl/concepts.hxx providing what's missing (incl. std::integral 
and
    std::unsigned_integral, for some kind of consistency).
    
    Change-Id: I1c37d37fa1b57b5e3bf24c9e44f3973003905cb2
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158406
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <[email protected]>

diff --git a/include/o3tl/concepts.hxx b/include/o3tl/concepts.hxx
new file mode 100644
index 000000000000..261d063ebca2
--- /dev/null
+++ b/include/o3tl/concepts.hxx
@@ -0,0 +1,45 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; 
fill-column: 100 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include <sal/config.h>
+
+#include <concepts>
+
+// LLVM 12 libc++ only provides a bare-bones <concepts> that lacks most of its 
C++20 content, so
+// replicate here fore now what we need:
+
+#if defined __cpp_lib_concepts
+
+namespace o3tl
+{
+using std::integral;
+using std::signed_integral;
+using std::unsigned_integral;
+}
+
+#else
+
+#include <type_traits>
+
+namespace o3tl
+{
+// Taken from the C++20 spec:
+
+template <typename T> concept integral = std::is_integral_v<T>;
+
+template <typename T> concept signed_integral = integral<T>&& 
std::is_signed_v<T>;
+
+template <typename T> concept unsigned_integral = integral<T> && 
!signed_integral<T>;
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s 
cinkeys+=0=break: */
diff --git a/sw/inc/nodeoffset.hxx b/sw/inc/nodeoffset.hxx
index 035925855b31..f6deac6609b0 100644
--- a/sw/inc/nodeoffset.hxx
+++ b/sw/inc/nodeoffset.hxx
@@ -10,23 +10,20 @@
 
 #include <sal/config.h>
 #include "swdllapi.h"
+#include <o3tl/concepts.hxx>
 #include <o3tl/strong_int.hxx>
 #include <iostream>
 
 typedef o3tl::strong_int<sal_Int32, struct Tag_SwNodeOffset> SwNodeOffset;
 
 /* Just to make it easier to write arithmetic with these types */
-template <typename T>
-inline typename std::enable_if<std::is_signed<T>::value, SwNodeOffset>::type
-operator+(SwNodeOffset a, T n)
+template <o3tl::signed_integral T> inline SwNodeOffset operator+(SwNodeOffset 
a, T n)
 {
     return a + SwNodeOffset(n);
 }
 
 /* Just to make it easier to write arithmetic with these types */
-template <typename T>
-inline typename std::enable_if<std::is_signed<T>::value, SwNodeOffset>::type
-operator-(SwNodeOffset a, T n)
+template <o3tl::signed_integral T> inline SwNodeOffset operator-(SwNodeOffset 
a, T n)
 {
     return a - SwNodeOffset(n);
 }

Reply via email to