summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerek Bailey <derek.bailey@thermofisher.com>2018-08-23 09:48:03 -0700
committerWouter van Oortmerssen <aardappel@gmail.com>2018-08-23 09:48:03 -0700
commite1f48ad35ad1bbdbc3ded1ff537e362011a6c876 (patch)
treeb6c467fe510f7586c6e0533c2d1f87433122ed7c
parentd8f49e18d70613dec608987ef897c94b95942d75 (diff)
downloadflatbuffers-e1f48ad35ad1bbdbc3ded1ff537e362011a6c876.tar.gz
flatbuffers-e1f48ad35ad1bbdbc3ded1ff537e362011a6c876.tar.bz2
flatbuffers-e1f48ad35ad1bbdbc3ded1ff537e362011a6c876.zip
Updated preprocessor check for template aliases. (#4888)
-rw-r--r--include/flatbuffers/stl_emulation.h22
1 files changed, 16 insertions, 6 deletions
diff --git a/include/flatbuffers/stl_emulation.h b/include/flatbuffers/stl_emulation.h
index 7e7e978a..ff537cd4 100644
--- a/include/flatbuffers/stl_emulation.h
+++ b/include/flatbuffers/stl_emulation.h
@@ -33,6 +33,16 @@
#include <cctype>
#endif // defined(FLATBUFFERS_CPP98_STL)
+// Check if we can use template aliases
+// Not possible if Microsoft Compiler before 2012
+// Possible is the language feature __cpp_alias_templates is defined well
+// Or possible if the C++ std is C+11 or newer
+#if !(defined(_MSC_VER) && _MSC_VER <= 1700 /* MSVC2012 */) \
+ && ((defined(__cpp_alias_templates) && __cpp_alias_templates >= 200704) \
+ || (defined(__cplusplus) && __cplusplus >= 201103L))
+ #define FLATBUFFERS_TEMPLATES_ALIASES
+#endif
+
// This header provides backwards compatibility for C++98 STLs like stlport.
namespace flatbuffers {
@@ -69,13 +79,13 @@ inline void vector_emplace_back(std::vector<T> *vector, V &&data) {
}
#ifndef FLATBUFFERS_CPP98_STL
- #if !(defined(_MSC_VER) && _MSC_VER <= 1700 /* MSVC2012 */)
+ #if defined(FLATBUFFERS_TEMPLATES_ALIASES)
template <typename T>
using numeric_limits = std::numeric_limits<T>;
#else
template <typename T> class numeric_limits :
public std::numeric_limits<T> {};
- #endif // !(defined(_MSC_VER) && _MSC_VER <= 1700 /* MSVC2012 */)
+ #endif // defined(FLATBUFFERS_TEMPLATES_ALIASES)
#else
template <typename T> class numeric_limits :
public std::numeric_limits<T> {};
@@ -98,7 +108,7 @@ inline void vector_emplace_back(std::vector<T> *vector, V &&data) {
};
#endif // FLATBUFFERS_CPP98_STL
-#if !(defined(_MSC_VER) && _MSC_VER <= 1700 /* MSVC2012 */)
+#if defined(FLATBUFFERS_TEMPLATES_ALIASES)
#ifndef FLATBUFFERS_CPP98_STL
template <typename T> using is_scalar = std::is_scalar<T>;
template <typename T, typename U> using is_same = std::is_same<T,U>;
@@ -119,10 +129,10 @@ inline void vector_emplace_back(std::vector<T> *vector, V &&data) {
template <typename T> struct is_floating_point :
public std::is_floating_point<T> {};
template <typename T> struct is_unsigned : public std::is_unsigned<T> {};
-#endif // !(defined(_MSC_VER) && _MSC_VER <= 1700 /* MSVC2012 */)
+#endif // defined(FLATBUFFERS_TEMPLATES_ALIASES)
#ifndef FLATBUFFERS_CPP98_STL
- #if !(defined(_MSC_VER) && _MSC_VER <= 1700 /* MSVC2012 */)
+ #if defined(FLATBUFFERS_TEMPLATES_ALIASES)
template <class T> using unique_ptr = std::unique_ptr<T>;
#else
// MSVC 2010 doesn't support C++11 aliases.
@@ -148,7 +158,7 @@ inline void vector_emplace_back(std::vector<T> *vector, V &&data) {
return std::unique_ptr<T>::operator=(p);
}
};
- #endif // !(defined(_MSC_VER) && _MSC_VER <= 1700 /* MSVC2012 */)
+ #endif // defined(FLATBUFFERS_TEMPLATES_ALIASES)
#else
// Very limited implementation of unique_ptr.
// This is provided simply to allow the C++ code generated from the default