Commit 9ba3f796 by Antonio Borondo

Fix error: explicit specialization in non-namespace scope

parent 8d1585f0
...@@ -142,16 +142,31 @@ class wide_string_input_adapter : public input_adapter_protocol ...@@ -142,16 +142,31 @@ class wide_string_input_adapter : public input_adapter_protocol
template<size_t T> template<size_t T>
void fill_buffer() void fill_buffer()
{ {
fill_buffer_utf32(); wide_string_input_helper<WideStringType, T>::fill_buffer(str, current_wchar, utf8_bytes, utf8_bytes_index, utf8_bytes_filled);
} }
template<> /// the wstring to process
void fill_buffer<2>() const WideStringType& str;
{
fill_buffer_utf16();
}
void fill_buffer_utf16() /// index of the current wchar in str
std::size_t current_wchar = 0;
/// a buffer for UTF-8 bytes
std::array<std::char_traits<char>::int_type, 4> utf8_bytes = {{0, 0, 0, 0}};
/// index to the utf8_codes array for the next valid byte
std::size_t utf8_bytes_index = 0;
/// number of valid bytes in the utf8_codes array
std::size_t utf8_bytes_filled = 0;
};
namespace
{
template<typename WideStringType, size_t T>
struct wide_string_input_helper
{
// UTF-32
static void fill_buffer(const WideStringType& str, size_t& current_wchar, std::array<std::char_traits<char>::int_type, 4>& utf8_bytes, size_t& utf8_bytes_index, size_t& utf8_bytes_filled)
{ {
utf8_bytes_index = 0; utf8_bytes_index = 0;
...@@ -165,7 +180,7 @@ class wide_string_input_adapter : public input_adapter_protocol ...@@ -165,7 +180,7 @@ class wide_string_input_adapter : public input_adapter_protocol
// get the current character // get the current character
const int wc = static_cast<int>(str[current_wchar++]); const int wc = static_cast<int>(str[current_wchar++]);
// UTF-16 to UTF-8 encoding // UTF-32 to UTF-8 encoding
if (wc < 0x80) if (wc < 0x80)
{ {
utf8_bytes[0] = wc; utf8_bytes[0] = wc;
...@@ -173,41 +188,40 @@ class wide_string_input_adapter : public input_adapter_protocol ...@@ -173,41 +188,40 @@ class wide_string_input_adapter : public input_adapter_protocol
} }
else if (wc <= 0x7FF) else if (wc <= 0x7FF)
{ {
utf8_bytes[0] = 0xC0 | ((wc >> 6)); utf8_bytes[0] = 0xC0 | ((wc >> 6) & 0x1F);
utf8_bytes[1] = 0x80 | (wc & 0x3F); utf8_bytes[1] = 0x80 | (wc & 0x3F);
utf8_bytes_filled = 2; utf8_bytes_filled = 2;
} }
else if (0xD800 > wc or wc >= 0xE000) else if (wc <= 0xFFFF)
{ {
utf8_bytes[0] = 0xE0 | ((wc >> 12)); utf8_bytes[0] = 0xE0 | ((wc >> 12) & 0x0F);
utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F); utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F);
utf8_bytes[2] = 0x80 | (wc & 0x3F); utf8_bytes[2] = 0x80 | (wc & 0x3F);
utf8_bytes_filled = 3; utf8_bytes_filled = 3;
} }
else else if (wc <= 0x10FFFF)
{
if (current_wchar < str.size())
{ {
const int wc2 = static_cast<int>(str[current_wchar++]); utf8_bytes[0] = 0xF0 | ((wc >> 18) & 0x07);
const int charcode = 0x10000 + (((wc & 0x3FF) << 10) | (wc2 & 0x3FF)); utf8_bytes[1] = 0x80 | ((wc >> 12) & 0x3F);
utf8_bytes[0] = 0xf0 | (charcode >> 18); utf8_bytes[2] = 0x80 | ((wc >> 6) & 0x3F);
utf8_bytes[1] = 0x80 | ((charcode >> 12) & 0x3F); utf8_bytes[3] = 0x80 | (wc & 0x3F);
utf8_bytes[2] = 0x80 | ((charcode >> 6) & 0x3F);
utf8_bytes[3] = 0x80 | (charcode & 0x3F);
utf8_bytes_filled = 4; utf8_bytes_filled = 4;
} }
else else
{ {
// unknown character // unknown character
++current_wchar;
utf8_bytes[0] = wc; utf8_bytes[0] = wc;
utf8_bytes_filled = 1; utf8_bytes_filled = 1;
} }
} }
} }
} };
void fill_buffer_utf32() template<typename WideStringType>
struct wide_string_input_helper<WideStringType, 2>
{
// UTF-16
static void fill_buffer(const WideStringType& str, size_t& current_wchar, std::array<std::char_traits<char>::int_type, 4>& utf8_bytes, size_t& utf8_bytes_index, size_t& utf8_bytes_filled)
{ {
utf8_bytes_index = 0; utf8_bytes_index = 0;
...@@ -221,7 +235,7 @@ class wide_string_input_adapter : public input_adapter_protocol ...@@ -221,7 +235,7 @@ class wide_string_input_adapter : public input_adapter_protocol
// get the current character // get the current character
const int wc = static_cast<int>(str[current_wchar++]); const int wc = static_cast<int>(str[current_wchar++]);
// UTF-32 to UTF-8 encoding // UTF-16 to UTF-8 encoding
if (wc < 0x80) if (wc < 0x80)
{ {
utf8_bytes[0] = wc; utf8_bytes[0] = wc;
...@@ -229,49 +243,41 @@ class wide_string_input_adapter : public input_adapter_protocol ...@@ -229,49 +243,41 @@ class wide_string_input_adapter : public input_adapter_protocol
} }
else if (wc <= 0x7FF) else if (wc <= 0x7FF)
{ {
utf8_bytes[0] = 0xC0 | ((wc >> 6) & 0x1F); utf8_bytes[0] = 0xC0 | ((wc >> 6));
utf8_bytes[1] = 0x80 | (wc & 0x3F); utf8_bytes[1] = 0x80 | (wc & 0x3F);
utf8_bytes_filled = 2; utf8_bytes_filled = 2;
} }
else if (wc <= 0xFFFF) else if (0xD800 > wc or wc >= 0xE000)
{ {
utf8_bytes[0] = 0xE0 | ((wc >> 12) & 0x0F); utf8_bytes[0] = 0xE0 | ((wc >> 12));
utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F); utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F);
utf8_bytes[2] = 0x80 | (wc & 0x3F); utf8_bytes[2] = 0x80 | (wc & 0x3F);
utf8_bytes_filled = 3; utf8_bytes_filled = 3;
} }
else if (wc <= 0x10FFFF) else
{ {
utf8_bytes[0] = 0xF0 | ((wc >> 18 ) & 0x07); if (current_wchar < str.size())
utf8_bytes[1] = 0x80 | ((wc >> 12) & 0x3F); {
utf8_bytes[2] = 0x80 | ((wc >> 6) & 0x3F); const int wc2 = static_cast<int>(str[current_wchar++]);
utf8_bytes[3] = 0x80 | (wc & 0x3F); const int charcode = 0x10000 + (((wc & 0x3FF) << 10) | (wc2 & 0x3FF));
utf8_bytes[0] = 0xf0 | (charcode >> 18);
utf8_bytes[1] = 0x80 | ((charcode >> 12) & 0x3F);
utf8_bytes[2] = 0x80 | ((charcode >> 6) & 0x3F);
utf8_bytes[3] = 0x80 | (charcode & 0x3F);
utf8_bytes_filled = 4; utf8_bytes_filled = 4;
} }
else else
{ {
// unknown character // unknown character
++current_wchar;
utf8_bytes[0] = wc; utf8_bytes[0] = wc;
utf8_bytes_filled = 1; utf8_bytes_filled = 1;
} }
} }
} }
}
private: };
/// the wstring to process }
const WideStringType& str;
/// index of the current wchar in str
std::size_t current_wchar = 0;
/// a buffer for UTF-8 bytes
std::array<std::char_traits<char>::int_type, 4> utf8_bytes = {{0, 0, 0, 0}};
/// index to the utf8_codes array for the next valid byte
std::size_t utf8_bytes_index = 0;
/// number of valid bytes in the utf8_codes array
std::size_t utf8_bytes_filled = 0;
};
class input_adapter class input_adapter
{ {
......
...@@ -2020,16 +2020,31 @@ class wide_string_input_adapter : public input_adapter_protocol ...@@ -2020,16 +2020,31 @@ class wide_string_input_adapter : public input_adapter_protocol
template<size_t T> template<size_t T>
void fill_buffer() void fill_buffer()
{ {
fill_buffer_utf32(); wide_string_input_helper<WideStringType, T>::fill_buffer(str, current_wchar, utf8_bytes, utf8_bytes_index, utf8_bytes_filled);
} }
template<> /// the wstring to process
void fill_buffer<2>() const WideStringType& str;
{
fill_buffer_utf16(); /// index of the current wchar in str
} std::size_t current_wchar = 0;
/// a buffer for UTF-8 bytes
std::array<std::char_traits<char>::int_type, 4> utf8_bytes = {{0, 0, 0, 0}};
/// index to the utf8_codes array for the next valid byte
std::size_t utf8_bytes_index = 0;
/// number of valid bytes in the utf8_codes array
std::size_t utf8_bytes_filled = 0;
};
void fill_buffer_utf16() namespace
{
template<typename WideStringType, size_t T>
struct wide_string_input_helper
{
// UTF-32
static void fill_buffer(const WideStringType& str, size_t& current_wchar, std::array<std::char_traits<char>::int_type, 4>& utf8_bytes, size_t& utf8_bytes_index, size_t& utf8_bytes_filled)
{ {
utf8_bytes_index = 0; utf8_bytes_index = 0;
...@@ -2043,7 +2058,7 @@ class wide_string_input_adapter : public input_adapter_protocol ...@@ -2043,7 +2058,7 @@ class wide_string_input_adapter : public input_adapter_protocol
// get the current character // get the current character
const int wc = static_cast<int>(str[current_wchar++]); const int wc = static_cast<int>(str[current_wchar++]);
// UTF-16 to UTF-8 encoding // UTF-32 to UTF-8 encoding
if (wc < 0x80) if (wc < 0x80)
{ {
utf8_bytes[0] = wc; utf8_bytes[0] = wc;
...@@ -2051,41 +2066,40 @@ class wide_string_input_adapter : public input_adapter_protocol ...@@ -2051,41 +2066,40 @@ class wide_string_input_adapter : public input_adapter_protocol
} }
else if (wc <= 0x7FF) else if (wc <= 0x7FF)
{ {
utf8_bytes[0] = 0xC0 | ((wc >> 6)); utf8_bytes[0] = 0xC0 | ((wc >> 6) & 0x1F);
utf8_bytes[1] = 0x80 | (wc & 0x3F); utf8_bytes[1] = 0x80 | (wc & 0x3F);
utf8_bytes_filled = 2; utf8_bytes_filled = 2;
} }
else if (0xD800 > wc or wc >= 0xE000) else if (wc <= 0xFFFF)
{ {
utf8_bytes[0] = 0xE0 | ((wc >> 12)); utf8_bytes[0] = 0xE0 | ((wc >> 12) & 0x0F);
utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F); utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F);
utf8_bytes[2] = 0x80 | (wc & 0x3F); utf8_bytes[2] = 0x80 | (wc & 0x3F);
utf8_bytes_filled = 3; utf8_bytes_filled = 3;
} }
else else if (wc <= 0x10FFFF)
{
if (current_wchar < str.size())
{ {
const int wc2 = static_cast<int>(str[current_wchar++]); utf8_bytes[0] = 0xF0 | ((wc >> 18) & 0x07);
const int charcode = 0x10000 + (((wc & 0x3FF) << 10) | (wc2 & 0x3FF)); utf8_bytes[1] = 0x80 | ((wc >> 12) & 0x3F);
utf8_bytes[0] = 0xf0 | (charcode >> 18); utf8_bytes[2] = 0x80 | ((wc >> 6) & 0x3F);
utf8_bytes[1] = 0x80 | ((charcode >> 12) & 0x3F); utf8_bytes[3] = 0x80 | (wc & 0x3F);
utf8_bytes[2] = 0x80 | ((charcode >> 6) & 0x3F);
utf8_bytes[3] = 0x80 | (charcode & 0x3F);
utf8_bytes_filled = 4; utf8_bytes_filled = 4;
} }
else else
{ {
// unknown character // unknown character
++current_wchar;
utf8_bytes[0] = wc; utf8_bytes[0] = wc;
utf8_bytes_filled = 1; utf8_bytes_filled = 1;
} }
} }
} }
} };
void fill_buffer_utf32() template<typename WideStringType>
struct wide_string_input_helper<WideStringType, 2>
{
// UTF-16
static void fill_buffer(const WideStringType& str, size_t& current_wchar, std::array<std::char_traits<char>::int_type, 4>& utf8_bytes, size_t& utf8_bytes_index, size_t& utf8_bytes_filled)
{ {
utf8_bytes_index = 0; utf8_bytes_index = 0;
...@@ -2099,7 +2113,7 @@ class wide_string_input_adapter : public input_adapter_protocol ...@@ -2099,7 +2113,7 @@ class wide_string_input_adapter : public input_adapter_protocol
// get the current character // get the current character
const int wc = static_cast<int>(str[current_wchar++]); const int wc = static_cast<int>(str[current_wchar++]);
// UTF-32 to UTF-8 encoding // UTF-16 to UTF-8 encoding
if (wc < 0x80) if (wc < 0x80)
{ {
utf8_bytes[0] = wc; utf8_bytes[0] = wc;
...@@ -2107,49 +2121,41 @@ class wide_string_input_adapter : public input_adapter_protocol ...@@ -2107,49 +2121,41 @@ class wide_string_input_adapter : public input_adapter_protocol
} }
else if (wc <= 0x7FF) else if (wc <= 0x7FF)
{ {
utf8_bytes[0] = 0xC0 | ((wc >> 6) & 0x1F); utf8_bytes[0] = 0xC0 | ((wc >> 6));
utf8_bytes[1] = 0x80 | (wc & 0x3F); utf8_bytes[1] = 0x80 | (wc & 0x3F);
utf8_bytes_filled = 2; utf8_bytes_filled = 2;
} }
else if (wc <= 0xFFFF) else if (0xD800 > wc or wc >= 0xE000)
{ {
utf8_bytes[0] = 0xE0 | ((wc >> 12) & 0x0F); utf8_bytes[0] = 0xE0 | ((wc >> 12));
utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F); utf8_bytes[1] = 0x80 | ((wc >> 6) & 0x3F);
utf8_bytes[2] = 0x80 | (wc & 0x3F); utf8_bytes[2] = 0x80 | (wc & 0x3F);
utf8_bytes_filled = 3; utf8_bytes_filled = 3;
} }
else if (wc <= 0x10FFFF) else
{ {
utf8_bytes[0] = 0xF0 | ((wc >> 18 ) & 0x07); if (current_wchar < str.size())
utf8_bytes[1] = 0x80 | ((wc >> 12) & 0x3F); {
utf8_bytes[2] = 0x80 | ((wc >> 6) & 0x3F); const int wc2 = static_cast<int>(str[current_wchar++]);
utf8_bytes[3] = 0x80 | (wc & 0x3F); const int charcode = 0x10000 + (((wc & 0x3FF) << 10) | (wc2 & 0x3FF));
utf8_bytes[0] = 0xf0 | (charcode >> 18);
utf8_bytes[1] = 0x80 | ((charcode >> 12) & 0x3F);
utf8_bytes[2] = 0x80 | ((charcode >> 6) & 0x3F);
utf8_bytes[3] = 0x80 | (charcode & 0x3F);
utf8_bytes_filled = 4; utf8_bytes_filled = 4;
} }
else else
{ {
// unknown character // unknown character
++current_wchar;
utf8_bytes[0] = wc; utf8_bytes[0] = wc;
utf8_bytes_filled = 1; utf8_bytes_filled = 1;
} }
} }
} }
}
private: };
/// the wstring to process }
const WideStringType& str;
/// index of the current wchar in str
std::size_t current_wchar = 0;
/// a buffer for UTF-8 bytes
std::array<std::char_traits<char>::int_type, 4> utf8_bytes = {{0, 0, 0, 0}};
/// index to the utf8_codes array for the next valid byte
std::size_t utf8_bytes_index = 0;
/// number of valid bytes in the utf8_codes array
std::size_t utf8_bytes_filled = 0;
};
class input_adapter class input_adapter
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment