26#include "../strings.hpp"
27#include "../check.hpp"
31namespace hi::inline
v1 {
35 bool column_nr_is_relative =
true;
37 bool row_nr_is_relative =
true;
40 if (address.starts_with(
"$")) {
41 column_nr_is_relative =
false;
42 address.remove_prefix(1);
45 while (!address.empty() && is_alpha(address.front())) {
47 column_nr += address.front() - (is_upper(address.front()) ?
'A' :
'a') + 1;
48 address.remove_prefix(1);
51 if (address.starts_with(
"$")) {
52 row_nr_is_relative =
false;
53 address.remove_prefix(1);
56 while (!address.empty() && is_digit(address.front())) {
58 row_nr += address.front() -
'0';
59 address.remove_prefix(1);
62 return {column_nr_is_relative, column_nr - 1, row_nr_is_relative, row_nr - 1};
75 auto [column_nr_is_relative, column_nr, row_nr_is_relative, row_nr] = _parse_spreadsheet_address(address);
76 hi_parse_check(address.empty(),
"Extra characters in spread sheet address {}", address);
78 if (column_nr_is_relative) {
79 column_nr += start_column_nr;
81 if (row_nr_is_relative) {
82 row_nr += start_row_nr;
84 return {column_nr, row_nr};
88parse_spreadsheet_range(std::string_view address,
std::size_t start_column_nr = 0,
std::size_t start_row_nr = 0)
90 auto [column_nr_is_relative1, column_nr1, row_nr_is_relative1, row_nr1] = _parse_spreadsheet_address(address);
91 if (column_nr_is_relative1) {
92 column_nr1 += start_column_nr;
94 if (row_nr_is_relative1) {
95 row_nr1 += start_row_nr;
98 if (address.starts_with(
":")) {
99 address.remove_prefix(1);
100 auto [column_nr_is_relative2, column_nr2, row_nr_is_relative2, row_nr2] = _parse_spreadsheet_address(address);
101 hi_parse_check(address.empty(),
"Extra characters in spread sheet address {}", address);
103 if (column_nr_is_relative2) {
104 column_nr2 += start_column_nr;
106 if (row_nr_is_relative2) {
107 row_nr2 += start_row_nr;
110 hi_parse_check(column_nr1 <= column_nr2,
"Column range must be in ascending direction");
111 hi_parse_check(row_nr1 <= row_nr2,
"Column range must be in ascending direction");
112 return {column_nr1, row_nr1, column_nr2 + 1, row_nr2 + 1};
115 hi_parse_check(address.empty(),
"Extra characters in spread sheet address {}", address);
116 return {column_nr1, row_nr1, column_nr1 + 1, row_nr1 + 1};
DOXYGEN BUG.
Definition algorithm.hpp:15
std::pair< std::size_t, std::size_t > parse_spreadsheet_address(std::string_view address, std::size_t start_column_nr=0, std::size_t start_row_nr=0)
Parse a spreadsheet address.
Definition spreadsheet_address.hpp:73