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
26#pragma once
27
28#include "../utility/utility.hpp"
29#include "../algorithm/module.hpp"
30#include "../macros.hpp"
31#include <tuple>
32#include <string_view>
33
34
35
36namespace hi::inline v1 {
37
38inline std::tuple<bool, std::size_t, bool, std::size_t> _parse_spreadsheet_address(std::string_view& address)
39{
40 bool column_nr_is_relative = true;
41 std::size_t column_nr = 0;
42 bool row_nr_is_relative = true;
44
45 if (address.starts_with("$")) {
47 address.remove_prefix(1);
48 }
49
50 while (!address.empty() && is_alpha(address.front())) {
51 column_nr *= 26;
52 column_nr += address.front() - (is_upper(address.front()) ? 'A' : 'a') + 1;
53 address.remove_prefix(1);
54 }
55
56 if (address.starts_with("$")) {
57 row_nr_is_relative = false;
58 address.remove_prefix(1);
59 }
60
61 while (!address.empty() && is_digit(address.front())) {
62 row_nr *= 10;
63 row_nr += address.front() - '0';
64 address.remove_prefix(1);
65 }
66
67 return {column_nr_is_relative, column_nr - 1, row_nr_is_relative, row_nr - 1};
68}
69
80{
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);
83
85 column_nr += start_column_nr;
86 }
89 }
90 return {column_nr, row_nr};
91}
92
103{
104 auto [column_nr_is_relative1, column_nr1, row_nr_is_relative1, row_nr1] = _parse_spreadsheet_address(address);
107 }
110 }
111
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);
116
119 }
122 }
123
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};
127
128 } else {
129 hi_check(address.empty(), "Extra characters in spread sheet address {}", address);
130 return {column_nr1, row_nr1, column_nr1 + 1, row_nr1 + 1};
131 }
132}
133
134} // 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: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
constexpr Out narrow_cast(In const &rhs) noexcept
Cast numeric values without loss of precision.
Definition cast.hpp:377