HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
spreadsheet_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
26#pragma once
27
28#include "../strings.hpp"
29#include "../check.hpp"
30#include <tuple>
31#include <string_view>
32
33namespace hi::inline v1 {
34
35inline std::tuple<bool, std::size_t, bool, std::size_t> _parse_spreadsheet_address(std::string_view& address)
36{
37 bool column_nr_is_relative = true;
38 std::size_t column_nr = 0;
39 bool row_nr_is_relative = true;
40 std::size_t row_nr = 0;
41
42 if (address.starts_with("$")) {
43 column_nr_is_relative = false;
44 address.remove_prefix(1);
45 }
46
47 while (!address.empty() && is_alpha(address.front())) {
48 column_nr *= 26;
49 column_nr += address.front() - (is_upper(address.front()) ? 'A' : 'a') + 1;
50 address.remove_prefix(1);
51 }
52
53 if (address.starts_with("$")) {
54 row_nr_is_relative = false;
55 address.remove_prefix(1);
56 }
57
58 while (!address.empty() && is_digit(address.front())) {
59 row_nr *= 10;
60 row_nr += address.front() - '0';
61 address.remove_prefix(1);
62 }
63
64 return {column_nr_is_relative, column_nr - 1, row_nr_is_relative, row_nr - 1};
65}
66
76parse_spreadsheet_address(std::string_view address, std::size_t start_column_nr = 0, std::size_t start_row_nr = 0)
77{
78 auto [column_nr_is_relative, column_nr, row_nr_is_relative, row_nr] = _parse_spreadsheet_address(address);
79 hi_parse_check(address.empty(), "Extra characters in spread sheet address {}", address);
80
81 if (column_nr_is_relative) {
82 column_nr += start_column_nr;
83 }
84 if (row_nr_is_relative) {
85 row_nr += start_row_nr;
86 }
87 return {column_nr, row_nr};
88}
89
99parse_spreadsheet_range(std::string_view address, std::size_t start_column_nr = 0, std::size_t start_row_nr = 0)
100{
101 auto [column_nr_is_relative1, column_nr1, row_nr_is_relative1, row_nr1] = _parse_spreadsheet_address(address);
102 if (column_nr_is_relative1) {
103 column_nr1 += start_column_nr;
104 }
105 if (row_nr_is_relative1) {
106 row_nr1 += start_row_nr;
107 }
108
109 if (address.starts_with(":")) {
110 address.remove_prefix(1);
111 auto [column_nr_is_relative2, column_nr2, row_nr_is_relative2, row_nr2] = _parse_spreadsheet_address(address);
112 hi_parse_check(address.empty(), "Extra characters in spread sheet address {}", address);
113
114 if (column_nr_is_relative2) {
115 column_nr2 += start_column_nr;
116 }
117 if (row_nr_is_relative2) {
118 row_nr2 += start_row_nr;
119 }
120
121 hi_parse_check(column_nr1 <= column_nr2, "Column range must be in ascending direction");
122 hi_parse_check(row_nr1 <= row_nr2, "Column range must be in ascending direction");
123 return {column_nr1, row_nr1, column_nr2 + 1, row_nr2 + 1};
124
125 } else {
126 hi_parse_check(address.empty(), "Extra characters in spread sheet address {}", address);
127 return {column_nr1, row_nr1, column_nr1 + 1, row_nr1 + 1};
128 }
129}
130
131} // namespace hi::inline v1
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:76
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:99
DOXYGEN BUG.
Definition algorithm.hpp:15