Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/microsoft/GSL.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil MacIntosh <neilmac@microsoft.com>2015-11-05 20:29:30 +0300
committerNeil MacIntosh <neilmac@microsoft.com>2015-11-05 20:29:30 +0300
commit4e4882bda8dee92d05c11708a016f3409abed963 (patch)
tree609604d9beb69bebd727b710c41ac945b8f8dc0d
parentcaabb40440f44b24b573a0822433ea758b469b96 (diff)
Added workaround for MSVC 2013 compiler bug.
-rw-r--r--include/string_span.h56
-rw-r--r--tests/string_span_tests.cpp13
2 files changed, 64 insertions, 5 deletions
diff --git a/include/string_span.h b/include/string_span.h
index beccee4..133712e 100644
--- a/include/string_span.h
+++ b/include/string_span.h
@@ -22,6 +22,16 @@
#include "span.h"
#include <cstring>
+// VS 2013 workarounds
+#ifdef _MSC_VER
+#if _MSC_VER <= 1800
+
+#pragma push_macro("GSL_MSVC_HAS_TYPE_DEDUCTION_BUG")
+#define GSL_MSVC_HAS_TYPE_DEDUCTION_BUG
+
+#endif // _MSC_VER <= 1800
+#endif // _MSC_VER
+
namespace gsl
{
//
@@ -34,16 +44,16 @@ namespace gsl
// type system for these types that will not either incur significant runtime costs or
// (sometimes needlessly) break existing programs when introduced.
//
-template<std::ptrdiff_t Max = dynamic_range>
+template<std::ptrdiff_t Extent = dynamic_range>
using czstring = const char*;
-template<std::ptrdiff_t Max = dynamic_range>
+template<std::ptrdiff_t Extent = dynamic_range>
using cwzstring = const wchar_t*;
-template<std::ptrdiff_t Max = dynamic_range>
+template<std::ptrdiff_t Extent = dynamic_range>
using zstring = char*;
-template<std::ptrdiff_t Max = dynamic_range>
+template<std::ptrdiff_t Extent = dynamic_range>
using wzstring = wchar_t*;
//
@@ -134,12 +144,37 @@ basic_string_span<typename std::remove_pointer<typename Cont::pointer>::type, dy
//
// to_string() allow (explicit) conversions from string_span to string
//
-template<class CharT, size_t Extent>
+#ifndef GSL_MSVC_HAS_TYPE_DEDUCTION_BUG
+
+template<class CharT, ptrdiff_t Extent>
std::basic_string<typename std::remove_const<CharT>::type> to_string(basic_string_span<CharT, Extent> view)
{
+ return{ view.data(), static_cast<size_t>(view.length()) };
+}
+
+#else
+
+std::string to_string(cstring_span<> view)
+{
+ return{ view.data(), view.length() };
+}
+
+std::string to_string(string_span<> view)
+{
+ return{ view.data(), view.length() };
+}
+
+std::wstring to_string(cwstring_span<> view)
+{
+ return{ view.data(), view.length() };
+}
+
+std::wstring to_string(wstring_span<> view)
+{
return{ view.data(), view.length() };
}
+#endif
template<class CharT, size_t Extent = dynamic_range>
class basic_zstring_builder
@@ -178,4 +213,15 @@ template <size_t Max = dynamic_range>
using wzstring_builder = basic_zstring_builder<wchar_t, Max>;
}
+// VS 2013 workarounds
+#ifdef _MSC_VER
+#if _MSC_VER <= 1800
+
+#pragma pop_macro("GSL_MSVC_HAS_TYPE_DEDUCTION_BUG")
+#undef GSL_MSVC_HAS_TYPE_DEDUCTION_BUG
+
+#endif // _MSC_VER <= 1800
+#endif // _MSC_VER
+
+
#endif // GSL_STRING_SPAN_H
diff --git a/tests/string_span_tests.cpp b/tests/string_span_tests.cpp
index dc3ccf5..ab48fcb 100644
--- a/tests/string_span_tests.cpp
+++ b/tests/string_span_tests.cpp
@@ -22,6 +22,7 @@
using namespace std;
using namespace gsl;
+
SUITE(string_span_tests)
{
@@ -104,6 +105,18 @@ SUITE(string_span_tests)
string_span<> v3 = "Hello";
#endif
}
+
+ TEST(TestToString)
+ {
+ auto s = gsl::to_string(cstring_span<>{});
+ CHECK(s.length() == 0);
+
+ char stack_string[] = "Hello";
+ cstring_span<> v = ensure_z(stack_string);
+ auto s2 = gsl::to_string(v);
+ CHECK(s2.length() == v.length());
+ CHECK(s2.length() == 5);
+ }
}
int main(int, const char *[])