summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config_host/config_global.h.in1
-rw-r--r--configure.ac17
-rw-r--r--include/rtl/ustring.hxx86
-rw-r--r--include/sal/types.h10
-rw-r--r--oox/source/export/shapes.cxx116
5 files changed, 172 insertions, 58 deletions
diff --git a/config_host/config_global.h.in b/config_host/config_global.h.in
index ee0514267633..a1b8ffa4fcff 100644
--- a/config_host/config_global.h.in
+++ b/config_host/config_global.h.in
@@ -16,6 +16,7 @@ Any change in this header will cause a rebuild of almost everything.
#define HAVE_CXX11_OVERRIDE 0
#define HAVE_CXX11_FINAL 0
#define HAVE_CXX11_PERFECT_FORWARDING 0
+#define HAVE_CXX11_CONSTEXPR 0
#define HAVE_GCC_BUILTIN_ATOMIC 0
/* _Pragma */
#define HAVE_GCC_PRAGMA_OPERATOR 0
diff --git a/configure.ac b/configure.ac
index 950c7c8526c2..e1f22548b332 100644
--- a/configure.ac
+++ b/configure.ac
@@ -6189,6 +6189,23 @@ if test "$perfect_forwarding" = yes; then
AC_DEFINE([HAVE_CXX11_PERFECT_FORWARDING])
fi
+AC_MSG_CHECKING([whether $CXX supports C++11 constexpr])
+save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11"
+AC_LANG_PUSH([C++])
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+ struct S {
+ int n_;
+ constexpr S(int n): n_(n) {}
+ };
+ ]])], [cxx11_constexpr=yes], [cxx11_constexpr=no])
+AC_LANG_POP([C++])
+CXXFLAGS=$save_CXXFLAGS
+AC_MSG_RESULT([$cxx11_constexpr])
+if test "$cxx11_constexpr" = yes; then
+ AC_DEFINE([HAVE_CXX11_CONSTEXPR])
+fi
+
HAVE_GCC_PRAGMA_OPERATOR=
dnl _Pragma support (may require C++11)
if test "$GCC" = "yes"; then
diff --git a/include/rtl/ustring.hxx b/include/rtl/ustring.hxx
index 78a6b60f1c17..ffc5d6fe0bd2 100644
--- a/include/rtl/ustring.hxx
+++ b/include/rtl/ustring.hxx
@@ -67,7 +67,8 @@ This class is not part of public API and is meant to be used only in LibreOffice
struct SAL_WARN_UNUSED OUStringLiteral
{
template< int N >
- explicit OUStringLiteral( const char (&str)[ N ] ) : size( N - 1 ), data( str ) { assert( strlen( str ) == N - 1 ); }
+ explicit SAL_CONSTEXPR OUStringLiteral( const char (&str)[ N ] ) : size( N - 1 ), data( str )
+ { /* only C++14 constexpr: assert( strlen( str ) == N - 1 ); */ }
int size;
const char* data;
};
@@ -1304,6 +1305,89 @@ public:
return !string.equalsAsciiL( literal, libreoffice_internal::ConstCharArrayDetector< T, void >::size - 1 );
}
+#if defined LIBO_INTERNAL_ONLY
+ /// @cond INTERNAL
+
+ /* Comparison between OUString and OUStringLiteral.
+
+ @since LibreOffice 4.5
+ */
+
+ friend bool operator ==(OUString const & lhs, OUStringLiteral const & rhs) {
+ return lhs.equalsAsciiL(rhs.data, rhs.size);
+ }
+
+ friend bool operator !=(OUString const & lhs, OUStringLiteral const & rhs) {
+ return !lhs.equalsAsciiL(rhs.data, rhs.size);
+ }
+
+ friend bool operator <(OUString const & lhs, OUStringLiteral const & rhs) {
+ return
+ (rtl_ustr_ascii_compare_WithLength(
+ lhs.pData->buffer, lhs.pData->length, rhs.data))
+ < 0;
+ }
+
+ friend bool operator <=(OUString const & lhs, OUStringLiteral const & rhs) {
+ return
+ (rtl_ustr_ascii_compare_WithLength(
+ lhs.pData->buffer, lhs.pData->length, rhs.data))
+ <= 0;
+ }
+
+ friend bool operator >(OUString const & lhs, OUStringLiteral const & rhs) {
+ return
+ (rtl_ustr_ascii_compare_WithLength(
+ lhs.pData->buffer, lhs.pData->length, rhs.data))
+ > 0;
+ }
+
+ friend bool operator >=(OUString const & lhs, OUStringLiteral const & rhs) {
+ return
+ (rtl_ustr_ascii_compare_WithLength(
+ lhs.pData->buffer, lhs.pData->length, rhs.data))
+ >= 0;
+ }
+
+ friend bool operator ==(OUStringLiteral const & lhs, OUString const & rhs) {
+ return rhs.equalsAsciiL(lhs.data, lhs.size);
+ }
+
+ friend bool operator !=(OUStringLiteral const & lhs, OUString const & rhs) {
+ return !rhs.equalsAsciiL(lhs.data, lhs.size);
+ }
+
+ friend bool operator <(OUStringLiteral const & lhs, OUString const & rhs) {
+ return
+ (rtl_ustr_ascii_compare_WithLength(
+ rhs.pData->buffer, rhs.pData->length, lhs.data))
+ >= 0;
+ }
+
+ friend bool operator <=(OUStringLiteral const & lhs, OUString const & rhs) {
+ return
+ (rtl_ustr_ascii_compare_WithLength(
+ rhs.pData->buffer, rhs.pData->length, lhs.data))
+ > 0;
+ }
+
+ friend bool operator >(OUStringLiteral const & lhs, OUString const & rhs) {
+ return
+ (rtl_ustr_ascii_compare_WithLength(
+ rhs.pData->buffer, rhs.pData->length, lhs.data))
+ <= 0;
+ }
+
+ friend bool operator >=(OUStringLiteral const & lhs, OUString const & rhs) {
+ return
+ (rtl_ustr_ascii_compare_WithLength(
+ rhs.pData->buffer, rhs.pData->length, lhs.data))
+ < 0;
+ }
+
+ /// @endcond
+#endif
+
/**
Returns a hashcode for this string.
diff --git a/include/sal/types.h b/include/sal/types.h
index 3d75f67ff920..8810695b2819 100644
--- a/include/sal/types.h
+++ b/include/sal/types.h
@@ -427,6 +427,16 @@ namespace css = ::com::sun::star;
#define SAL_FINAL
#endif
+/** C++11 "constexpr" feature.
+
+ @since LibreOffice 4.5
+*/
+#if HAVE_CXX11_CONSTEXPR
+#define SAL_CONSTEXPR constexpr
+#else
+#define SAL_CONSTEXPR
+#endif
+
#endif /* __cplusplus */
#ifdef __cplusplus
diff --git a/oox/source/export/shapes.cxx b/oox/source/export/shapes.cxx
index 2d040c732396..64a0e3f121cc 100644
--- a/oox/source/export/shapes.cxx
+++ b/oox/source/export/shapes.cxx
@@ -25,6 +25,8 @@
#include <oox/token/tokens.hxx>
#include <cstdio>
+#include <initializer_list>
+
#include <com/sun/star/awt/CharSet.hpp>
#include <com/sun/star/awt/FontDescriptor.hpp>
#include <com/sun/star/awt/FontSlant.hpp>
@@ -281,60 +283,60 @@ ShapeExport& ShapeExport::WriteGroupShape(uno::Reference<drawing::XShape> xShape
static bool lcl_IsOnBlacklist(OUString& rShapeType)
{
- static const std::vector<OUString> vBlacklist = {
- "ring",
- "can",
- "cube",
- "paper",
- "frame",
- "smiley",
- "sun",
- "flower",
- "forbidden",
- "bracket-pair",
- "brace-pair",
- "col-60da8460",
- "col-502ad400",
- "quad-bevel",
- "cloud-callout",
- "line-callout-1",
- "line-callout-2",
- "line-callout-3",
- "paper",
- "vertical-scroll",
- "horizontal-scroll",
- "mso-spt34",
- "mso-spt75",
- "mso-spt164",
- "mso-spt180",
- "flowchart-process",
- "flowchart-alternate-process",
- "flowchart-decision",
- "flowchart-data",
- "flowchart-predefined-process",
- "flowchart-internal-storage",
- "flowchart-document",
- "flowchart-multidocument",
- "flowchart-terminator",
- "flowchart-preparation",
- "flowchart-manual-input",
- "flowchart-manual-operation",
- "flowchart-connector",
- "flowchart-off-page-connector",
- "flowchart-card",
- "flowchart-punched-tape",
- "flowchart-summing-junction",
- "flowchart-or",
- "flowchart-collate",
- "flowchart-sort",
- "flowchart-extract",
- "flowchart-merge",
- "flowchart-stored-data",
- "flowchart-delay",
- "flowchart-sequential-access",
- "flowchart-magnetic-disk",
- "flowchart-direct-access-storage",
- "flowchart-display"
+ static const std::initializer_list<OUStringLiteral> vBlacklist = {
+ OUStringLiteral("ring"),
+ OUStringLiteral("can"),
+ OUStringLiteral("cube"),
+ OUStringLiteral("paper"),
+ OUStringLiteral("frame"),
+ OUStringLiteral("smiley"),
+ OUStringLiteral("sun"),
+ OUStringLiteral("flower"),
+ OUStringLiteral("forbidden"),
+ OUStringLiteral("bracket-pair"),
+ OUStringLiteral("brace-pair"),
+ OUStringLiteral("col-60da8460"),
+ OUStringLiteral("col-502ad400"),
+ OUStringLiteral("quad-bevel"),
+ OUStringLiteral("cloud-callout"),
+ OUStringLiteral("line-callout-1"),
+ OUStringLiteral("line-callout-2"),
+ OUStringLiteral("line-callout-3"),
+ OUStringLiteral("paper"),
+ OUStringLiteral("vertical-scroll"),
+ OUStringLiteral("horizontal-scroll"),
+ OUStringLiteral("mso-spt34"),
+ OUStringLiteral("mso-spt75"),
+ OUStringLiteral("mso-spt164"),
+ OUStringLiteral("mso-spt180"),
+ OUStringLiteral("flowchart-process"),
+ OUStringLiteral("flowchart-alternate-process"),
+ OUStringLiteral("flowchart-decision"),
+ OUStringLiteral("flowchart-data"),
+ OUStringLiteral("flowchart-predefined-process"),
+ OUStringLiteral("flowchart-internal-storage"),
+ OUStringLiteral("flowchart-document"),
+ OUStringLiteral("flowchart-multidocument"),
+ OUStringLiteral("flowchart-terminator"),
+ OUStringLiteral("flowchart-preparation"),
+ OUStringLiteral("flowchart-manual-input"),
+ OUStringLiteral("flowchart-manual-operation"),
+ OUStringLiteral("flowchart-connector"),
+ OUStringLiteral("flowchart-off-page-connector"),
+ OUStringLiteral("flowchart-card"),
+ OUStringLiteral("flowchart-punched-tape"),
+ OUStringLiteral("flowchart-summing-junction"),
+ OUStringLiteral("flowchart-or"),
+ OUStringLiteral("flowchart-collate"),
+ OUStringLiteral("flowchart-sort"),
+ OUStringLiteral("flowchart-extract"),
+ OUStringLiteral("flowchart-merge"),
+ OUStringLiteral("flowchart-stored-data"),
+ OUStringLiteral("flowchart-delay"),
+ OUStringLiteral("flowchart-sequential-access"),
+ OUStringLiteral("flowchart-magnetic-disk"),
+ OUStringLiteral("flowchart-direct-access-storage"),
+ OUStringLiteral("flowchart-display")
};
return std::find(vBlacklist.begin(), vBlacklist.end(), rShapeType) != vBlacklist.end();
@@ -342,9 +344,9 @@ static bool lcl_IsOnBlacklist(OUString& rShapeType)
static bool lcl_IsOnWhitelist(OUString& rShapeType)
{
- static const std::vector<OUString> vWhitelist = {
- "heart",
- "puzzle"
+ static const std::initializer_list<OUStringLiteral> vWhitelist = {
+ OUStringLiteral("heart"),
+ OUStringLiteral("puzzle")
};
return std::find(vWhitelist.begin(), vWhitelist.end(), rShapeType) != vWhitelist.end();