[Libreoffice-commits] core.git: config_host/config_global.h.in configure.ac include/o3tl sc/source

Stephan Bergmann (via logerrit) logerrit at kemper.freedesktop.org
Wed Sep 25 18:56:46 UTC 2019


 config_host/config_global.h.in |    5 +++++
 configure.ac                   |   22 ++++++++++++++++++++++
 include/o3tl/sorted_vector.hxx |    4 ++--
 sc/source/core/tool/token.cxx  |    3 +++
 4 files changed, 32 insertions(+), 2 deletions(-)

New commits:
commit 689dc632875c4ec51e44cf53718d625d9a217d9c
Author:     Stephan Bergmann <sbergman at redhat.com>
AuthorDate: Wed Sep 25 14:43:16 2019 +0200
Commit:     Stephan Bergmann <sbergman at redhat.com>
CommitDate: Wed Sep 25 20:55:53 2019 +0200

    constinit, here we come
    
    Following up on b13421011d9377676e1adc282634991d5064a866 "better data
    structures for some static const vars":
    
    * Make the o3tl::sorted_vector ctor taking an initializer_list constexpr.
      <https://wg21.link/P0202R3> "Add Constexpr Modifiers to Functions in
      <algorithm> and <utility> Headers", which will be in C++2a and is already
      implemented by recent libc++ and libstdc++ according to
      <https://en.cppreference.com/w/cpp/compiler_support
      #C.2B.2B2a_library_features>, makes std::sort constexpr but explicitly keeps
      std::stable_sort non-constexpr.  ("Algorithms stable_partition, inplace_merge
      and stable_sort allocate memory, construct variables using placement new, use
      unique_ptr and do other things not acceptable in constexpr expressions.
      Making those algorithms constexpr seems to be a hard task that would require
      a lot of intrinsics.  Those algorithms are not marked with constexpr in this
      wording.")  But keep o3tl::sorted_vector::Resort (which was introduced in
      c59355e936446fe55960209e543b072acb6b2170 "fdo#58793: re-implement
      SwpHintsArray::Resort()") using std::stable_sort instead of std::sort, in
      case that is relevant for its pre-exisiting uses.
    
    * <https://wg21.link/P1004R2> "Making std::vector constexpr", which was voted
      into C++2a according to <https://wg21.link/n4829> "Editors' Report --
      Programming Languages -- C++", will make the relevant parts of std::vector
      constexpr.  But none of libc++, libstdc++, and MSVC implement that as of now.
    
    * Introduce HAVE_CPP_CONSTINIT_SORTED_VECTOR to hide the constinit behind for
      now for the one case from b13421011d9377676e1adc282634991d5064a866 "better
      data structures for some static const vars" that can clearly be constinit
      once constexpr std::vector is supported by compilers.  The other three cases
      (s_aContainerDocumentCommands in
      chart2/source/controller/main/CommandDispatchContainer.cxx,
      aMetricCompatibleMap in vcl/source/font/PhysicalFontCollection.cxx, and
      aBlacklist in writerfilter/source/dmapper/PropertyMap.cxx) would each need a
      constexpr OUString first.  (Technically, the constinit would not even be
      needed, but it nicely documents our intent that this will actually be
      initialized at compile-time once compilers support that.)
    
    Change-Id: Ibeb138f120528be3a7a09b3912143bf795fbab29
    Reviewed-on: https://gerrit.libreoffice.org/79556
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <sbergman at redhat.com>

diff --git a/config_host/config_global.h.in b/config_host/config_global.h.in
index 2e986fbe24b6..adb36c39ab8b 100644
--- a/config_host/config_global.h.in
+++ b/config_host/config_global.h.in
@@ -24,6 +24,11 @@ Any change in this header will cause a rebuild of almost everything.
 /* Guaranteed copy elision (C++17), __cpp_guaranteed_copy_elision (C++2a): */
 #define HAVE_CPP_GUARANTEED_COPY_ELISION 0
 
+// Compiler supports all of C++2a <https://wg21.link/P0202R3> "Add Constexpr Modifiers to Functions
+// in <algorithm> and <utility> Headers", <https://wg21.link/P1004R2> "Making std::vector
+// constexpr", and <https://wg21.link/P1143R2> "Adding the constinit keyword":
+#define HAVE_CPP_CONSTINIT_SORTED_VECTOR 0
+
 /* GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87150> "move ctor wrongly chosen in return
    stmt (derived vs. base)": */
 #define HAVE_GCC_BUG_87150 0
diff --git a/configure.ac b/configure.ac
index 88c512c2635f..eb08a5883eda 100644
--- a/configure.ac
+++ b/configure.ac
@@ -6618,6 +6618,28 @@ AC_COMPILE_IFELSE([AC_LANG_SOURCE([
 CXXFLAGS=$save_CXXFLAGS
 AC_LANG_POP([C++])
 
+AC_MSG_CHECKING([whether $CXX_BASE supports C++2a constinit sorted vectors])
+AC_LANG_PUSH([C++])
+save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11"
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([
+        #include <algorithm>
+        #include <initializer_list>
+        #include <vector>
+        template<typename T> class S {
+        private:
+            std::vector<T> v_;
+        public:
+            constexpr S(std::initializer_list<T> i): v_(i) { std::sort(v_.begin(), v_.end()); }
+        };
+        constinit S<int> s{3, 2, 1};
+    ])], [
+        AC_DEFINE([HAVE_CPP_CONSTINIT_SORTED_VECTOR],[1])
+        AC_MSG_RESULT([yes])
+    ], [AC_MSG_RESULT([no])])
+CXXFLAGS=$save_CXXFLAGS
+AC_LANG_POP([C++])
+
 AC_MSG_CHECKING([whether $CXX_BASE has GCC bug 87150])
 AC_LANG_PUSH([C++])
 save_CXXFLAGS=$CXXFLAGS
diff --git a/include/o3tl/sorted_vector.hxx b/include/o3tl/sorted_vector.hxx
index 527f34e568c7..102287d52a21 100644
--- a/include/o3tl/sorted_vector.hxx
+++ b/include/o3tl/sorted_vector.hxx
@@ -45,10 +45,10 @@ public:
     typedef typename std::vector<Value>::difference_type difference_type;
     typedef typename std::vector<Value>::size_type size_type;
 
-    sorted_vector( std::initializer_list<Value> init )
+    constexpr sorted_vector( std::initializer_list<Value> init )
         : m_vector(init)
     {
-        Resort();
+        std::sort(m_vector.begin(), m_vector.end(), Compare());
     }
     sorted_vector() = default;
     sorted_vector(sorted_vector const&) = default;
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index b9048dd25f19..475fcf16d189 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -1277,6 +1277,9 @@ bool ScTokenArray::AddFormulaToken(
 
 void ScTokenArray::CheckForThreading( const FormulaToken& r )
 {
+#if HAVE_CPP_CONSTINIT_SORTED_VECTOR
+    constinit
+#endif
     static const o3tl::sorted_vector<OpCode> aThreadedCalcBlackList({
         ocIndirect,
         ocMacro,


More information about the Libreoffice-commits mailing list