28#include "../utility/utility.hpp"
29#include "../algorithm/module.hpp"
30#include "../macros.hpp"
36namespace hi::inline
v1 {
38inline std::tuple<bool, std::size_t, bool, std::size_t> _parse_spreadsheet_address(std::string_view& address)
40 bool column_nr_is_relative =
true;
41 std::size_t column_nr = 0;
42 bool row_nr_is_relative =
true;
43 std::size_t row_nr = 0;
45 if (address.starts_with(
"$")) {
46 column_nr_is_relative =
false;
47 address.remove_prefix(1);
50 while (!address.empty() && is_alpha(address.front())) {
52 column_nr += address.front() - (is_upper(address.front()) ?
'A' :
'a') + 1;
53 address.remove_prefix(1);
56 if (address.starts_with(
"$")) {
57 row_nr_is_relative =
false;
58 address.remove_prefix(1);
61 while (!address.empty() && is_digit(address.front())) {
63 row_nr += address.front() -
'0';
64 address.remove_prefix(1);
67 return {column_nr_is_relative, column_nr - 1, row_nr_is_relative, row_nr - 1};
78inline std::pair<std::size_t, std::size_t>
81 auto [column_nr_is_relative, column_nr, row_nr_is_relative, row_nr] = _parse_spreadsheet_address(address);
82 hi_check(address.empty(),
"Extra characters in spread sheet address {}", address);
84 if (column_nr_is_relative) {
85 column_nr += start_column_nr;
87 if (row_nr_is_relative) {
88 row_nr += start_row_nr;
90 return {column_nr, row_nr};
104 auto [column_nr_is_relative1, column_nr1, row_nr_is_relative1, row_nr1] = _parse_spreadsheet_address(address);
105 if (column_nr_is_relative1) {
106 column_nr1 += start_column_nr;
108 if (row_nr_is_relative1) {
109 row_nr1 += start_row_nr;
112 if (address.starts_with(
":")) {
113 address.remove_prefix(1);
114 auto [column_nr_is_relative2, column_nr2, row_nr_is_relative2, row_nr2] = _parse_spreadsheet_address(address);
115 hi_check(address.empty(),
"Extra characters in spread sheet address {}", address);
117 if (column_nr_is_relative2) {
118 column_nr2 += start_column_nr;
120 if (row_nr_is_relative2) {
121 row_nr2 += start_row_nr;
124 hi_check(column_nr1 <= column_nr2,
"Column range must be in ascending direction");
125 hi_check(row_nr1 <= row_nr2,
"Column range must be in ascending direction");
126 return {column_nr1, row_nr1, column_nr2 + 1, row_nr2 + 1};
129 hi_check(address.empty(),
"Extra characters in spread sheet address {}", address);
130 return {column_nr1, row_nr1, column_nr1 + 1, row_nr1 + 1};
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:79
std::tuple< std::size_t, std::size_t, std::size_t, std::size_t > parse_spreadsheet_range(std::string_view address, std::size_t start_column_nr=0, std::size_t start_row_nr=0)
Parse a spreadsheet range.
Definition spreadsheet_address.hpp:102
DOXYGEN BUG.
Definition algorithm.hpp:16