Skip to content

Commit 1a96da9

Browse files
committed
Pushed std::char_traits specialization into concurrency::streams::char_traits. Redirected all char_traits uses through this traits.
1 parent 470a9f7 commit 1a96da9

File tree

4 files changed

+62
-60
lines changed

4 files changed

+62
-60
lines changed

Release/include/cpprest/astreambuf.h

Lines changed: 37 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -60,42 +60,8 @@ namespace concurrency = Concurrency;
6060
#pragma warning(disable : 4718)
6161
#endif
6262

63-
#ifndef _MS_WINDOWS
63+
#if !defined(_MS_WINDOWS) && 0
6464
// TFS 579628 - 1206: figure out how to avoid having this specialization for Linux (beware of 64-bit Linux)
65-
namespace std {
66-
template<>
67-
struct char_traits<unsigned char> : private char_traits<char>
68-
{
69-
public:
70-
typedef unsigned char char_type;
71-
72-
using char_traits<char>::eof;
73-
using char_traits<char>::int_type;
74-
using char_traits<char>::off_type;
75-
using char_traits<char>::pos_type;
76-
77-
static size_t length(const unsigned char* str)
78-
{
79-
return char_traits<char>::length(reinterpret_cast<const char*>(str));
80-
}
81-
82-
static void assign(unsigned char& left, const unsigned char& right) { left = right; }
83-
static unsigned char* assign(unsigned char* left, size_t n, unsigned char value)
84-
{
85-
return reinterpret_cast<unsigned char*>(char_traits<char>::assign(reinterpret_cast<char*>(left), n, static_cast<char>(value)));
86-
}
87-
88-
static unsigned char* copy(unsigned char* left, const unsigned char* right, size_t n)
89-
{
90-
return reinterpret_cast<unsigned char*>(char_traits<char>::copy(reinterpret_cast<char*>(left), reinterpret_cast<const char*>(right), n));
91-
}
92-
93-
static unsigned char* move(unsigned char* left, const unsigned char* right, size_t n)
94-
{
95-
return reinterpret_cast<unsigned char*>(char_traits<char>::move(reinterpret_cast<char*>(left), reinterpret_cast<const char*>(right), n));
96-
}
97-
};
98-
}
9965
#endif // _MS_WINDOWS
10066

10167
namespace Concurrency
@@ -120,6 +86,42 @@ namespace streams
12086
/// <returns>An <c>int_type</c> value which implies that an asynchronous call is required.</returns>
12187
static typename std::char_traits<_CharType>::int_type requires_async() { return std::char_traits<_CharType>::eof()-1; }
12288
};
89+
#if !defined(_MS_WINDOWS)
90+
template<>
91+
struct char_traits<unsigned char> : private std::char_traits<char>
92+
{
93+
public:
94+
typedef unsigned char char_type;
95+
96+
using std::char_traits<char>::eof;
97+
using std::char_traits<char>::int_type;
98+
using std::char_traits<char>::off_type;
99+
using std::char_traits<char>::pos_type;
100+
101+
static size_t length(const unsigned char* str)
102+
{
103+
return std::char_traits<char>::length(reinterpret_cast<const char*>(str));
104+
}
105+
106+
static void assign(unsigned char& left, const unsigned char& right) { left = right; }
107+
static unsigned char* assign(unsigned char* left, size_t n, unsigned char value)
108+
{
109+
return reinterpret_cast<unsigned char*>(std::char_traits<char>::assign(reinterpret_cast<char*>(left), n, static_cast<char>(value)));
110+
}
111+
112+
static unsigned char* copy(unsigned char* left, const unsigned char* right, size_t n)
113+
{
114+
return reinterpret_cast<unsigned char*>(std::char_traits<char>::copy(reinterpret_cast<char*>(left), reinterpret_cast<const char*>(right), n));
115+
}
116+
117+
static unsigned char* move(unsigned char* left, const unsigned char* right, size_t n)
118+
{
119+
return reinterpret_cast<unsigned char*>(std::char_traits<char>::move(reinterpret_cast<char*>(left), reinterpret_cast<const char*>(right), n));
120+
}
121+
122+
static int_type requires_async() { return eof()-1; }
123+
};
124+
#endif
123125

124126
namespace details {
125127

Release/include/cpprest/filestream.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -638,7 +638,7 @@ namespace details {
638638
{
639639
return (pos_type)_seekwrpos_fsb(m_info, size_t(pos), sizeof(_CharType));
640640
}
641-
return (pos_type)std::char_traits<_CharType>::eof();
641+
return (pos_type)Concurrency::streams::char_traits<_CharType>::eof();
642642
}
643643

644644
/// <summary>

Release/include/cpprest/interopstream.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ namespace Concurrency { namespace streams {
6868
template<typename _CharType>
6969
class basic_stdio_buffer : public streambuf_state_manager<_CharType>
7070
{
71-
typedef std::char_traits<_CharType> traits;
71+
typedef concurrency::streams::char_traits<_CharType> traits;
7272
typedef typename traits::int_type int_type;
7373
typedef typename traits::pos_type pos_type;
7474
typedef typename traits::off_type off_type;
@@ -237,7 +237,7 @@ namespace Concurrency { namespace streams {
237237
class basic_async_streambuf : public std::basic_streambuf<CharType>
238238
{
239239
public:
240-
typedef std::char_traits<CharType> traits;
240+
typedef concurrency::streams::char_traits<CharType> traits;
241241
typedef typename traits::int_type int_type;
242242
typedef typename traits::pos_type pos_type;
243243
typedef typename traits::off_type off_type;

Release/include/cpprest/streams.h

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ namespace Concurrency { namespace streams
110110
{
111111
public:
112112

113-
typedef std::char_traits<CharType> traits;
113+
typedef Concurrency::streams::char_traits<CharType> traits;
114114
typedef typename traits::int_type int_type;
115115
typedef typename traits::pos_type pos_type;
116116
typedef typename traits::off_type off_type;
@@ -483,7 +483,7 @@ namespace Concurrency { namespace streams
483483
class _type_parser_base
484484
{
485485
public:
486-
typedef typename std::char_traits<CharType>::int_type int_type;
486+
typedef typename ::concurrency::streams::char_traits<CharType>::int_type int_type;
487487

488488
_type_parser_base() { }
489489

@@ -562,8 +562,8 @@ namespace Concurrency { namespace streams
562562
{
563563
public:
564564

565-
typedef std::char_traits<CharType> traits;
566-
typedef typename std::char_traits<CharType>::int_type int_type;
565+
typedef char_traits<CharType> traits;
566+
typedef typename char_traits<CharType>::int_type int_type;
567567
typedef typename traits::pos_type pos_type;
568568
typedef typename traits::off_type off_type;
569569

@@ -795,7 +795,7 @@ namespace Concurrency { namespace streams
795795

796796
auto update = [=] (int_type ch) mutable -> bool
797797
{
798-
if ( ch == std::char_traits<CharType>::eof() ) return false;
798+
if ( ch == ::concurrency::streams::char_traits<CharType>::eof() ) return false;
799799
if ( ch == delim ) return false;
800800

801801
_locals->outbuf[_locals->write_pos] = static_cast<CharType>(ch);
@@ -847,7 +847,7 @@ namespace Concurrency { namespace streams
847847
// Capture 'buffer' rather than 'helper' here due to VC++ 2010 limitations.
848848
concurrency::streams::streambuf<CharType> buffer = helper()->m_buffer;
849849

850-
typename std::char_traits<CharType>::int_type req_async = concurrency::streams::char_traits<CharType>::requires_async();
850+
typename concurrency::streams::char_traits<CharType>::int_type req_async = concurrency::streams::char_traits<CharType>::requires_async();
851851

852852
std::shared_ptr<_read_helper> _locals = std::make_shared<_read_helper>();
853853

@@ -868,9 +868,9 @@ namespace Concurrency { namespace streams
868868
return target.putn(_locals->outbuf, _locals->write_pos).then(after_putn);
869869
};
870870

871-
auto update = [=] (typename std::char_traits<CharType>::int_type ch) mutable -> bool
871+
auto update = [=] (typename concurrency::streams::char_traits<CharType>::int_type ch) mutable -> bool
872872
{
873-
if ( ch == std::char_traits<CharType>::eof() ) return false;
873+
if ( ch == concurrency::streams::char_traits<CharType>::eof() ) return false;
874874
if ( ch == '\n' ) return false;
875875
if ( ch == '\r' ) { _locals->saw_CR = true; return true; }
876876

@@ -886,15 +886,15 @@ namespace Concurrency { namespace streams
886886
};
887887

888888
auto return_false =
889-
[](pplx::task<typename std::char_traits<CharType>::int_type>) -> pplx::task<bool>
889+
[](pplx::task<typename concurrency::streams::char_traits<CharType>::int_type>) -> pplx::task<bool>
890890
{
891891
return pplx::task_from_result(false);
892892
};
893893

894894
auto update_after_cr =
895-
[=] (typename std::char_traits<CharType>::int_type ch) mutable -> pplx::task<bool>
895+
[=] (typename concurrency::streams::char_traits<CharType>::int_type ch) mutable -> pplx::task<bool>
896896
{
897-
if ( ch == std::char_traits<CharType>::eof() ) return pplx::task_from_result(false);
897+
if ( ch == concurrency::streams::char_traits<CharType>::eof() ) return pplx::task_from_result(false);
898898
if ( ch == '\n' )
899899
return buffer.bumpc().then(return_false);
900900

@@ -905,10 +905,10 @@ namespace Concurrency { namespace streams
905905
{
906906
while ( buffer.in_avail() > 0 )
907907
{
908-
#ifndef _MS_WINDOWS // Required by GCC, because std::char_traits<CharType> is a dependent scope
908+
#ifndef _MS_WINDOWS // Required by GCC, because concurrency::streams::char_traits<CharType> is a dependent scope
909909
typename
910910
#endif
911-
std::char_traits<CharType>::int_type ch;
911+
concurrency::streams::char_traits<CharType>::int_type ch;
912912

913913
if ( _locals->saw_CR )
914914
{
@@ -1189,7 +1189,7 @@ pplx::task<ReturnType> concurrency::streams::_type_parser_base<CharType>::_parse
11891189
auto update = [=] (pplx::task<int_type> op) -> pplx::task<bool>
11901190
{
11911191
int_type ch = op.get();
1192-
if ( ch == std::char_traits<CharType>::eof() ) return pplx::task_from_result(false);
1192+
if ( ch == concurrency::streams::char_traits<CharType>::eof() ) return pplx::task_from_result(false);
11931193
bool accptd = accept_character(state, ch);
11941194
if (!accptd)
11951195
return pplx::task_from_result(false);
@@ -1247,7 +1247,7 @@ class type_parser<CharType,std::basic_string<CharType>> : public _type_parser_ba
12471247
private:
12481248
static bool _accept_char(std::shared_ptr<std::basic_string<CharType>> state, int_type ch)
12491249
{
1250-
if ( ch == std::char_traits<CharType>::eof() || isspace(ch)) return false;
1250+
if ( ch == concurrency::streams::char_traits<CharType>::eof() || isspace(ch)) return false;
12511251
state->push_back(CharType(ch));
12521252
return true;
12531253
}
@@ -1278,7 +1278,7 @@ class type_parser<CharType,int64_t> : public _type_parser_base<CharType>
12781278

12791279
static bool _accept_char(std::shared_ptr<_int64_state> state, int_type ch)
12801280
{
1281-
if ( ch == std::char_traits<CharType>::eof()) return false;
1281+
if ( ch == concurrency::streams::char_traits<CharType>::eof()) return false;
12821282
if ( state->minus == 0 )
12831283
{
12841284
// OK to find a sign.
@@ -1657,7 +1657,7 @@ class type_parser<CharType,signed char> : public _type_parser_base<CharType>
16571657
[=](pplx::task<typename concurrency::streams::streambuf<CharType>::int_type> op) -> signed char
16581658
{
16591659
int_type val = op.get();
1660-
if (val == std::char_traits<CharType>::eof())
1660+
if (val == concurrency::streams::char_traits<CharType>::eof())
16611661
throw std::runtime_error("reached end-of-stream while constructing a value");
16621662
return static_cast<signed char>(val);
16631663
});
@@ -1686,7 +1686,7 @@ class type_parser<CharType,unsigned char> : public _type_parser_base<CharType>
16861686
[=](pplx::task<typename concurrency::streams::streambuf<CharType>::int_type> op) -> unsigned char
16871687
{
16881688
int_type val = op.get();
1689-
if (val == std::char_traits<CharType>::eof())
1689+
if (val == concurrency::streams::char_traits<CharType>::eof())
16901690
throw std::runtime_error("reached end-of-stream while constructing a value");
16911691
return static_cast<unsigned char>(val);
16921692
});
@@ -1715,7 +1715,7 @@ class type_parser<CharType,char> : public _type_parser_base<CharType>
17151715
[=](pplx::task<typename concurrency::streams::streambuf<CharType>::int_type> op) -> char
17161716
{
17171717
int_type val = op.get();
1718-
if (val == std::char_traits<CharType>::eof())
1718+
if (val == concurrency::streams::char_traits<CharType>::eof())
17191719
throw std::runtime_error("reached end-of-stream while constructing a value");
17201720
return char(val);
17211721
});
@@ -1735,7 +1735,7 @@ class type_parser<char,std::basic_string<wchar_t>> : public _type_parser_base<ch
17351735
private:
17361736
static bool _accept_char(std::shared_ptr<std::basic_string<char>> state, int_type ch)
17371737
{
1738-
if ( ch == std::char_traits<char>::eof() || isspace(ch)) return false;
1738+
if ( ch == concurrency::streams::char_traits<char>::eof() || isspace(ch)) return false;
17391739
state->push_back(char(ch));
17401740
return true;
17411741
}
@@ -1757,7 +1757,7 @@ class type_parser<signed char,std::basic_string<wchar_t>> : public _type_parser_
17571757
private:
17581758
static bool _accept_char(std::shared_ptr<std::basic_string<char>> state, int_type ch)
17591759
{
1760-
if ( ch == std::char_traits<char>::eof() || isspace(ch)) return false;
1760+
if ( ch == concurrency::streams::char_traits<char>::eof() || isspace(ch)) return false;
17611761
state->push_back(char(ch));
17621762
return true;
17631763
}
@@ -1779,7 +1779,7 @@ class type_parser<unsigned char,std::basic_string<wchar_t>> : public _type_parse
17791779
private:
17801780
static bool _accept_char(std::shared_ptr<std::basic_string<char>> state, int_type ch)
17811781
{
1782-
if ( ch == std::char_traits<char>::eof() || isspace(ch)) return false;
1782+
if ( ch == concurrency::streams::char_traits<char>::eof() || isspace(ch)) return false;
17831783
state->push_back(char(ch));
17841784
return true;
17851785
}

0 commit comments

Comments
 (0)