Ejemplo n.º 1
0
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)};
}
Ejemplo n.º 2
0
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_);
    }
}
Ejemplo n.º 3
0
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_);
    }
}
Ejemplo n.º 4
0
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_);
    }
}