@@ -44,6 +44,7 @@ SOFTWARE.
44
44
#include < sstream>
45
45
#include < string>
46
46
#include < vector>
47
+ #include < bitset>
47
48
48
49
/* Copyright 2017 https://github.com/mandreyel
49
50
*
@@ -4831,11 +4832,11 @@ namespace csv {
4831
4832
STATIC_ASSERT (quote_escape_flag(ParseFlags::DELIMITER, true ) == ParseFlags::NOT_SPECIAL);
4832
4833
STATIC_ASSERT (quote_escape_flag(ParseFlags::NEWLINE, true ) == ParseFlags::NOT_SPECIAL);
4833
4834
4834
- /* * An array which maps ASCII chars to a parsing flag */
4835
- using ParseFlagMap = std::array<ParseFlags, 256 >;
4835
+ /* * An array which maps UTF-8 chars to a parsing flag */
4836
+ using ParseFlagMap = std::array<ParseFlags, std::numeric_limits< unsigned char >::max() + 1 >;
4836
4837
4837
- /* * An array which maps ASCII chars to a flag indicating if it is whitespace */
4838
- using WhitespaceMap = std::array< bool , 256 >;
4838
+ /* * An array which maps UTF-8 chars to a flag indicating if it is whitespace */
4839
+ using WhitespaceMap = std::bitset<std::numeric_limits< unsigned char >::max() + 1 >;
4839
4840
}
4840
4841
4841
4842
/* * Integer indicating a requested column wasn't found. */
@@ -5856,24 +5857,28 @@ inline std::ostream& operator << (std::ostream& os, csv::CSVField const& value)
5856
5857
5857
5858
namespace csv {
5858
5859
namespace internals {
5860
+
5861
+ /* * Helper constexpr function to initialize arrays with default values
5862
+ */
5863
+ template <typename T, typename Out>
5864
+ HEDLEY_CONST CONSTEXPR_17 Out container_to_default (T&& value)
5865
+ {
5866
+ Out a{};
5867
+ for (size_t i = 0 ; i < a.size (); ++i)
5868
+ a[i] = value;
5869
+ return a;
5870
+ }
5871
+
5859
5872
/* * Create a vector v where each index i corresponds to the
5860
5873
* ASCII number for a character and, v[i + 128] labels it according to
5861
5874
* the CSVReader::ParseFlags enum
5862
5875
*/
5863
5876
HEDLEY_CONST CONSTEXPR_17 ParseFlagMap make_parse_flags (char delimiter) {
5864
- std::array<ParseFlags, 256 > ret = {};
5865
- for (int i = -128 ; i < 128 ; i++) {
5866
- const int arr_idx = i + 128 ;
5867
- char ch = char (i);
5868
-
5869
- if (ch == delimiter)
5870
- ret[arr_idx] = ParseFlags::DELIMITER;
5871
- else if (ch == ' \r ' || ch == ' \n ' )
5872
- ret[arr_idx] = ParseFlags::NEWLINE;
5873
- else
5874
- ret[arr_idx] = ParseFlags::NOT_SPECIAL;
5875
- }
5876
-
5877
+ ParseFlagMap ret = container_to_default<ParseFlagMap::value_type, ParseFlagMap>(
5878
+ ParseFlags::NOT_SPECIAL);
5879
+ ret[static_cast <unsigned char >(delimiter)] = ParseFlags::DELIMITER;
5880
+ ret[static_cast <unsigned char >(' \r ' )] = ParseFlags::NEWLINE;
5881
+ ret[static_cast <unsigned char >(' \n ' )] = ParseFlags::NEWLINE;
5877
5882
return ret;
5878
5883
}
5879
5884
@@ -5882,8 +5887,8 @@ namespace csv {
5882
5887
* the CSVReader::ParseFlags enum
5883
5888
*/
5884
5889
HEDLEY_CONST CONSTEXPR_17 ParseFlagMap make_parse_flags (char delimiter, char quote_char) {
5885
- std::array<ParseFlags, 256 > ret = make_parse_flags (delimiter);
5886
- ret[( size_t ) quote_char + 128 ] = ParseFlags::QUOTE;
5890
+ ParseFlagMap ret = make_parse_flags (delimiter);
5891
+ ret[static_cast < unsigned char >( quote_char) ] = ParseFlags::QUOTE;
5887
5892
return ret;
5888
5893
}
5889
5894
@@ -5892,19 +5897,10 @@ namespace csv {
5892
5897
* c is a whitespace character
5893
5898
*/
5894
5899
HEDLEY_CONST CONSTEXPR_17 WhitespaceMap make_ws_flags (const char * ws_chars, size_t n_chars) {
5895
- std::array<bool , 256 > ret = {};
5896
- for (int i = -128 ; i < 128 ; i++) {
5897
- const int arr_idx = i + 128 ;
5898
- char ch = char (i);
5899
- ret[arr_idx] = false ;
5900
-
5901
- for (size_t j = 0 ; j < n_chars; j++) {
5902
- if (ws_chars[j] == ch) {
5903
- ret[arr_idx] = true ;
5904
- }
5905
- }
5900
+ WhitespaceMap ret = container_to_default<bool , WhitespaceMap>(false );
5901
+ for (size_t i = 0 ; i < n_chars; ++i) {
5902
+ ret[static_cast <unsigned char >(ws_chars[i])] = true ;
5906
5903
}
5907
-
5908
5904
return ret;
5909
5905
}
5910
5906
@@ -6044,7 +6040,7 @@ namespace csv {
6044
6040
void end_feed ();
6045
6041
6046
6042
CONSTEXPR_17 ParseFlags parse_flag (const char ch) const noexcept {
6047
- return _parse_flags.data ()[ch + 128 ];
6043
+ return _parse_flags.data ()[static_cast < unsigned char >(ch) ];
6048
6044
}
6049
6045
6050
6046
CONSTEXPR_17 ParseFlags compound_parse_flag (const char ch) const noexcept {
@@ -6108,7 +6104,7 @@ namespace csv {
6108
6104
RowCollection* _records = nullptr ;
6109
6105
6110
6106
CONSTEXPR_17 bool ws_flag (const char ch) const noexcept {
6111
- return _ws_flags. data ()[ch + 128 ];
6107
+ return _ws_flags[ static_cast < unsigned char >(ch) ];
6112
6108
}
6113
6109
6114
6110
size_t & current_row_start () {
@@ -7771,7 +7767,7 @@ namespace csv {
7771
7767
if (value.empty ()) {
7772
7768
bool prev_ch_quote = false ;
7773
7769
for (size_t i = 0 ; i < field.length ; i++) {
7774
- if (this ->data ->parse_flags [field_str[i] + 128 ] == ParseFlags::QUOTE) {
7770
+ if (this ->data ->parse_flags [static_cast < unsigned char >( field_str[i]) ] == ParseFlags::QUOTE) {
7775
7771
if (prev_ch_quote) {
7776
7772
prev_ch_quote = false ;
7777
7773
continue ;
0 commit comments