Skip to content

Commit eecd87f

Browse files
committed
Update csv_row.hpp
Reduce duplication
1 parent cc2af6c commit eecd87f

1 file changed

Lines changed: 24 additions & 27 deletions

File tree

include/internal/csv_row.hpp

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,26 @@
2020
#include "parse_hex.hpp"
2121
#include "raw_csv_data.hpp"
2222

23+
#if CSV_ENABLE_THREADS
24+
#define CSV_INIT_WITH_OPTIONAL_DCL(data_ref, value_ref, ...) \
25+
do { \
26+
if ((value_ref).empty()) { \
27+
std::lock_guard<std::mutex> lock((data_ref).double_quote_init_lock); \
28+
if ((value_ref).empty()) { \
29+
__VA_ARGS__ \
30+
} \
31+
} \
32+
} while (0)
33+
#else
34+
#define CSV_INIT_WITH_OPTIONAL_DCL(data_ref, value_ref, ...) \
35+
do { \
36+
(void)(data_ref); \
37+
if ((value_ref).empty()) { \
38+
__VA_ARGS__ \
39+
} \
40+
} while (0)
41+
#endif
42+
2343
namespace csv {
2444
namespace internals {
2545
class IBasicCSVParser;
@@ -404,31 +424,7 @@ namespace csv {
404424

405425
if (field.has_double_quote) {
406426
auto& value = _data->double_quote_fields[field_index];
407-
#if CSV_ENABLE_THREADS
408-
// Double-check locking: minimize lock contention by checking before acquiring lock
409-
if (value.empty()) {
410-
std::lock_guard<std::mutex> lock(_data->double_quote_init_lock);
411-
412-
// Check again after acquiring lock in case another thread initialized it
413-
if (value.empty()) {
414-
bool prev_ch_quote = false;
415-
for (size_t i = 0; i < field.length; i++) {
416-
if (_data->parse_flags[field_str[i] + CHAR_OFFSET] == ParseFlags::QUOTE) {
417-
if (prev_ch_quote) {
418-
prev_ch_quote = false;
419-
continue;
420-
}
421-
else {
422-
prev_ch_quote = true;
423-
}
424-
}
425-
426-
value += field_str[i];
427-
}
428-
}
429-
}
430-
#else
431-
if (value.empty()) {
427+
CSV_INIT_WITH_OPTIONAL_DCL((*_data), value,
432428
bool prev_ch_quote = false;
433429
for (size_t i = 0; i < field.length; i++) {
434430
if (_data->parse_flags[field_str[i] + CHAR_OFFSET] == ParseFlags::QUOTE) {
@@ -443,8 +439,7 @@ namespace csv {
443439

444440
value += field_str[i];
445441
}
446-
}
447-
#endif
442+
);
448443

449444
return csv::string_view(value);
450445
}
@@ -551,3 +546,5 @@ inline std::ostream& operator << (std::ostream& os, csv::CSVField const& value)
551546
os << std::string(value);
552547
return os;
553548
}
549+
550+
#undef CSV_INIT_WITH_OPTIONAL_DCL

0 commit comments

Comments
 (0)