HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
spread_sheet_address.hpp
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
5#pragma once
6
7#include "../strings.hpp"
8#include "../check.hpp"
9#include <tuple>
10#include <string_view>
11
12namespace tt {
13
14inline std::tuple<bool, size_t, bool, size_t> parse_spread_sheet_address(std::string_view address)
15{
16 bool relative_column_nr = true;
17 size_t column_nr = 0;
18 bool relative_row_nr = true;
19 size_t row_nr = 0;
20
21 if (address.starts_with("$")) {
22 relative_column_nr = false;
23 address.remove_prefix(1);
24 }
25
26 while (!address.empty() && is_alpha(address.front())) {
27 column_nr *= 26;
28 column_nr += address.front() - (is_upper(address.front()) ? 'A' : 'a') + 1;
29 address.remove_prefix(1);
30 }
31
32 if (address.starts_with("$")) {
33 relative_row_nr = false;
34 address.remove_prefix(1);
35 }
36
37 while (!address.empty() && is_digit(address.front())) {
38 row_nr *= 10;
39 row_nr += address.front() - '0';
40 address.remove_prefix(1);
41 }
42
43 tt_parse_check(address.empty(), "Extra characters in spread sheet address {}", address);
44
45 return {relative_column_nr, column_nr - 1, relative_row_nr, row_nr - 1};
46}
47
48inline std::pair<size_t, size_t> parse_absolute_spread_sheet_address(std::string_view address)
49{
50 ttlet[relative_column_nr, column_nr, relative_row_nr, row_nr] = parse_spread_sheet_address(address);
51 return {column_nr, row_nr};
52}
53
54} // namespace tt