HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
spreadsheet_address.hpp
Go to the documentation of this file.
1// Copyright Take Vos 2021.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
24#pragma once
25
26#include "../strings.hpp"
27#include "../check.hpp"
28#include <tuple>
29#include <string_view>
30
31namespace tt {
32
33
34inline std::tuple<bool, size_t, bool, size_t> _parse_spreadsheet_address(std::string_view &address)
35{
36 bool column_nr_is_relative = true;
37 size_t column_nr = 0;
38 bool row_nr_is_relative = true;
39 size_t row_nr = 0;
40
41 if (address.starts_with("$")) {
42 column_nr_is_relative = false;
43 address.remove_prefix(1);
44 }
45
46 while (!address.empty() && is_alpha(address.front())) {
47 column_nr *= 26;
48 column_nr += address.front() - (is_upper(address.front()) ? 'A' : 'a') + 1;
49 address.remove_prefix(1);
50 }
51
52 if (address.starts_with("$")) {
53 row_nr_is_relative = false;
54 address.remove_prefix(1);
55 }
56
57 while (!address.empty() && is_digit(address.front())) {
58 row_nr *= 10;
59 row_nr += address.front() - '0';
60 address.remove_prefix(1);
61 }
62
63 return {column_nr_is_relative, column_nr - 1, row_nr_is_relative, row_nr - 1};
64}
65
73inline std::pair<size_t, size_t> parse_spreadsheet_address(std::string_view address, size_t start_column_nr = 0, size_t start_row_nr = 0)
74{
75 auto [column_nr_is_relative, column_nr, row_nr_is_relative, row_nr] = _parse_spreadsheet_address(address);
76 tt_parse_check(address.empty(), "Extra characters in spread sheet address {}", address);
77
78 if (column_nr_is_relative) {
79 column_nr += start_column_nr;
80 }
81 if (row_nr_is_relative) {
82 row_nr += start_row_nr;
83 }
84 return {column_nr, row_nr};
85}
86
88parse_spreadsheet_range(std::string_view address, size_t start_column_nr = 0, size_t start_row_nr = 0)
89{
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;
93 }
94 if (row_nr_is_relative1) {
95 row_nr1 += start_row_nr;
96 }
97
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 tt_parse_check(address.empty(), "Extra characters in spread sheet address {}", address);
102
103 if (column_nr_is_relative2) {
104 column_nr2 += start_column_nr;
105 }
106 if (row_nr_is_relative2) {
107 row_nr2 += start_row_nr;
108 }
109
110 tt_parse_check(column_nr1 <= column_nr2, "Column range must be in ascending direction");
111 tt_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};
113
114 } else {
115 tt_parse_check(address.empty(), "Extra characters in spread sheet address {}", address);
116 return {column_nr1, row_nr1, column_nr1 + 1, row_nr1 + 1};
117 }
118}
119
120} // namespace tt
std::pair< size_t, size_t > parse_spreadsheet_address(std::string_view address, size_t start_column_nr=0, size_t start_row_nr=0)
Parse a spreadsheet address.
Definition spreadsheet_address.hpp:73