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.
This commit is contained in:
Georg Baum 2014-12-21 20:19:12 +01:00
parent c9609fe56a
commit 90b1f084bf
6 changed files with 57 additions and 21 deletions

View File

@ -250,6 +250,8 @@ if(UNIX OR MINGW)
set(LYX_USE_TR1 1) set(LYX_USE_TR1 1)
# GCC <= 4.5 does not support regex: there are linker errors # GCC <= 4.5 does not support regex: there are linker errors
# http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.tr1 # 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) set(LYX_USE_TR1_REGEX 0)
endif() endif()
if (LYX_ENABLE_CXX11) if (LYX_ENABLE_CXX11)

View File

@ -285,6 +285,8 @@ char * strerror(int n);
#define BOOST_SIGNALS_NO_DEPRECATION_WARNING 1 #define BOOST_SIGNALS_NO_DEPRECATION_WARNING 1
// TR1 regex not supported in GCC <= 4.5 // 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 // clang defines __GNUC__ but libc++ does not have tr1
#ifndef LYX_USE_TR1 #ifndef LYX_USE_TR1
# if __GNUC__ == 4 && !defined(USE_LLVM_LIBCPP) # if __GNUC__ == 4 && !defined(USE_LLVM_LIBCPP)

View File

@ -16,25 +16,38 @@
#ifdef LYX_USE_TR1 #ifdef LYX_USE_TR1
#define LYX_BIND_NS std::tr1
namespace lyx namespace lyx
{ {
using std::tr1::bind;
using std::tr1::placeholders::_1; using std::tr1::placeholders::_1;
using std::tr1::placeholders::_2; 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 #else
#include <boost/bind.hpp> #include <boost/bind.hpp>
#define LYX_BIND_NS boost
#endif
namespace lyx namespace lyx
{ {
using boost::bind; using LYX_BIND_NS::bind;
using boost::ref; using LYX_BIND_NS::ref;
} }
#endif #undef LYX_BIND_NS
#endif #endif

View File

@ -20,22 +20,27 @@
#include <tr1/functional> #include <tr1/functional>
#endif #endif
namespace lyx #define LYX_FUNCTIONAL_NS std::tr1
{
using std::tr1::function; #elif __cplusplus >= 201103L
}
#include <functional>
#define LYX_FUNCTIONAL_NS std
#else #else
#include <boost/function.hpp> #include <boost/function.hpp>
#include <boost/functional.hpp> #include <boost/functional.hpp>
#define LYX_FUNCTIONAL_NS boost
#endif
namespace lyx namespace lyx
{ {
using boost::function; using LYX_FUNCTIONAL_NS::function;
} }
#endif #undef LYX_FUNCTIONAL_NS
#endif #endif

View File

@ -58,8 +58,7 @@ namespace lyx {
} }
# else # else
# include <tr1/regex> # include <tr1/regex>
// TODO no match_partial in gcc, how to replace? // TODO no match_partial in TR1, how to replace?
# define match_partial match_default
# endif # endif
# define LR_NS std::tr1 # define LR_NS std::tr1
namespace lyx { namespace lyx {
@ -67,6 +66,17 @@ using LR_NS::regex;
using LR_NS::regex_match; using LR_NS::regex_match;
using LR_NS::sregex_iterator; 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 #else
# include <boost/regex.hpp> # include <boost/regex.hpp>
# define LR_NS boost # define LR_NS boost

View File

@ -20,23 +20,27 @@
#include <tr1/memory> #include <tr1/memory>
#endif #endif
namespace lyx #define LYX_SHAREDPTR_NS std::tr1
{
using std::tr1::shared_ptr; #elif __cplusplus >= 201103L
using std::tr1::const_pointer_cast;
} #include <memory>
#define LYX_SHAREDPTR_NS std
#else #else
#include <boost/shared_ptr.hpp> #include <boost/shared_ptr.hpp>
#define LYX_SHAREDPTR_NS boost
#endif
namespace lyx namespace lyx
{ {
using boost::shared_ptr; using LYX_SHAREDPTR_NS::shared_ptr;
using boost::const_pointer_cast; using LYX_SHAREDPTR_NS::const_pointer_cast;
} }
#endif #undef LYX_SHAREDPTR_NS
#endif #endif