std::pair<std::string, row_t> cell_reference::split_reference(const std::string &reference_string, bool &absolute_column, bool &absolute_row) { absolute_column = false; absolute_row = false; // Convert a coordinate string like 'B12' to a tuple ('B', 12) bool column_part = true; std::string column_string; for(auto character : reference_string) { char upper = std::toupper(character, std::locale::classic()); if(std::isalpha(character, std::locale::classic())) { if(column_part) { column_string.append(1, upper); } else { throw cell_coordinates_exception(reference_string); } } else { if(column_part) { column_part = false; } else if(!(std::isdigit(character, std::locale::classic()) || character == '$')) { throw cell_coordinates_exception(reference_string); } } } std::string row_string = reference_string.substr(column_string.length()); if(row_string.length() == 0) { throw cell_coordinates_exception(reference_string); } if(column_string[0] == '$') { absolute_row = true; column_string = column_string.substr(1); } if(row_string[0] == '$') { absolute_column = true; row_string = row_string.substr(1); } return {column_string, std::stoi(row_string)}; }
cell_reference::cell_reference(column_t column_index, row_t row) : column_(column_index), row_(row), absolute_row_(false), absolute_column_(false) { if (row_ == 0 || !(row_ <= constants::MaxRow()) || column_ == 0 || !(column_ <= constants::MaxColumn())) { throw cell_coordinates_exception(column_, row_); } }
cell_reference::cell_reference(column_t column_index, row_t row_index, bool absolute) : column_index_(column_index), row_index_(row_index), absolute_(absolute) { if(row_index_ >= constants::MaxRow || column_index_ >= constants::MaxColumn) { throw cell_coordinates_exception(column_index_, row_index_); } }
cell_reference::cell_reference(const std::string &column, row_t row, bool absolute) : column_index_(column_index_from_string(column) - 1), row_index_(row - 1), absolute_(absolute) { if(row == 0 || row_index_ >= constants::MaxRow || column_index_ >= constants::MaxColumn) { throw cell_coordinates_exception(column_index_, row_index_); } }