mirror of
https://github.com/microsoft/GSL.git
synced 2024-11-03 17:56:43 -05:00
Added workaround for MSVC 2013 compiler bug.
This commit is contained in:
parent
caabb40440
commit
4e4882bda8
@ -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
|
||||
|
@ -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 *[])
|
||||
|
Loading…
Reference in New Issue
Block a user