43 intptr_t
load(BUFFER&& buffer, ROW_CALLBACK&& row_callback)
45 using ghassanpl::formats::detail::get_char;
46 using ghassanpl::formats::detail::get_invalid_char;
49 std::vector<std::string> row;
51 static_assert(std::invocable<ROW_CALLBACK,
decltype(line),
decltype(row)>,
"must take arguments convertible to (`intptr row_num`, `std::vector<std::string> row_cells`)");
53 static constexpr auto invalid_value = get_invalid_char(std::type_identity<std::remove_cvref_t<
decltype(buffer)>>{});
54 bool in_quote =
false;
56 std::string current_cell;
58 while ((cp = get_char(buffer)) != invalid_value)
64 if ((cp = get_char(buffer)) == invalid_value)
72 current_cell += (char)cp;
80 if ((cp = get_char(buffer)) == invalid_value)
85 current_cell += (char)cp;
92 row.push_back(std::exchange(current_cell, {}));
93 if (!row_callback(line++, std::exchange(row, {})))
99 row.push_back(std::exchange(current_cell, {}));
101 current_cell += (char)cp;
105 if (!current_cell.empty())
106 row.push_back(std::move(current_cell));
108 row_callback(line++, std::move(row));