commit 90b1f084bf0998e37ad3fa9f54641656044c448f
Author: Georg Baum <[email protected]>
Date: Sun Dec 21 20:19:12 2014 +0100
Improve C++11 support
If we compile in C++11 mode, do not use the boost replacements for bind,
functional and shared_ptr. regex is excluded, since it misses
match_partial, and
gcc does not provide a usable one in versions less than 4.9.0.
I also removed the #define for match_partial, since this is dangerous. Now
you
get a compile error instead of subtle runtime differences.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0db64f7..86f6a01 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -250,6 +250,8 @@ if(UNIX OR MINGW)
set(LYX_USE_TR1 1)
# GCC <= 4.5 does not support regex: there are linker errors
#
http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.tr1
+ # <regex> and <tr1/regex> in gcc are unusable in versions less
than 4.9.0
+ # see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53631
set(LYX_USE_TR1_REGEX 0)
endif()
if (LYX_ENABLE_CXX11)
diff --git a/configure.ac b/configure.ac
index 1cbb6bd..562eba4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -285,6 +285,8 @@ char * strerror(int n);
#define BOOST_SIGNALS_NO_DEPRECATION_WARNING 1
// TR1 regex not supported in GCC <= 4.5
+// <regex> and <tr1/regex> in gcc are unusable in versions less than 4.9.0
+// see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53631
// clang defines __GNUC__ but libc++ does not have tr1
#ifndef LYX_USE_TR1
# if __GNUC__ == 4 && !defined(USE_LLVM_LIBCPP)
diff --git a/src/support/bind.h b/src/support/bind.h
index efd3267..1931b16 100644
--- a/src/support/bind.h
+++ b/src/support/bind.h
@@ -16,25 +16,38 @@
#ifdef LYX_USE_TR1
+#define LYX_BIND_NS std::tr1
+
namespace lyx
{
- using std::tr1::bind;
using std::tr1::placeholders::_1;
using std::tr1::placeholders::_2;
- using std::tr1::ref;
+}
+
+#elif __cplusplus >= 201103L
+
+#define LYX_BIND_NS std
+
+namespace lyx
+{
+ using std::placeholders::_1;
+ using std::placeholders::_2;
}
#else
#include <boost/bind.hpp>
+#define LYX_BIND_NS boost
+
+#endif
namespace lyx
{
- using boost::bind;
- using boost::ref;
+ using LYX_BIND_NS::bind;
+ using LYX_BIND_NS::ref;
}
-#endif
+#undef LYX_BIND_NS
#endif
diff --git a/src/support/functional.h b/src/support/functional.h
index 47d9c45..bb60029 100644
--- a/src/support/functional.h
+++ b/src/support/functional.h
@@ -20,22 +20,27 @@
#include <tr1/functional>
#endif
-namespace lyx
-{
- using std::tr1::function;
-}
+#define LYX_FUNCTIONAL_NS std::tr1
+
+#elif __cplusplus >= 201103L
+
+#include <functional>
+#define LYX_FUNCTIONAL_NS std
#else
#include <boost/function.hpp>
#include <boost/functional.hpp>
+#define LYX_FUNCTIONAL_NS boost
+
+#endif
namespace lyx
{
- using boost::function;
+ using LYX_FUNCTIONAL_NS::function;
}
-#endif
+#undef LYX_FUNCTIONAL_NS
#endif
diff --git a/src/support/regex.h b/src/support/regex.h
index 96d6836..eb3b679 100644
--- a/src/support/regex.h
+++ b/src/support/regex.h
@@ -58,8 +58,7 @@ namespace lyx {
}
# else
# include <tr1/regex>
-// TODO no match_partial in gcc, how to replace?
-# define match_partial match_default
+// TODO no match_partial in TR1, how to replace?
# endif
# define LR_NS std::tr1
namespace lyx {
@@ -67,6 +66,17 @@ using LR_NS::regex;
using LR_NS::regex_match;
using LR_NS::sregex_iterator;
}
+#elif LYX_USE_TR1_REGEX
+# include <regex>
+// <regex> in gcc is unusable in versions less than 4.9.0
+// see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53631
+// TODO no match_partial in std, how to replace?
+# define LR_NS std
+namespace lyx {
+using LR_NS::regex;
+using LR_NS::regex_match;
+using LR_NS::sregex_iterator;
+}
#else
# include <boost/regex.hpp>
# define LR_NS boost
diff --git a/src/support/shared_ptr.h b/src/support/shared_ptr.h
index 69e42da..874a6cd 100644
--- a/src/support/shared_ptr.h
+++ b/src/support/shared_ptr.h
@@ -20,23 +20,27 @@
#include <tr1/memory>
#endif
-namespace lyx
-{
- using std::tr1::shared_ptr;
- using std::tr1::const_pointer_cast;
-}
+#define LYX_SHAREDPTR_NS std::tr1
+
+#elif __cplusplus >= 201103L
+
+#include <memory>
+#define LYX_SHAREDPTR_NS std
#else
#include <boost/shared_ptr.hpp>
+#define LYX_SHAREDPTR_NS boost
+
+#endif
namespace lyx
{
- using boost::shared_ptr;
- using boost::const_pointer_cast;
+ using LYX_SHAREDPTR_NS::shared_ptr;
+ using LYX_SHAREDPTR_NS::const_pointer_cast;
}
-#endif
+#undef LYX_SHAREDPTR_NS
#endif