/* === This file is part of Calamares - === * * Copyright 2019, Adriaan de Groot * * Calamares is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Calamares is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Calamares. If not, see . */ /** @brief Support for unit-suffixed values. * * This combines a value with an (enum) unit indicating what kind * of value it is, e.g. 10 meters, or 64 pixels. Includes simple * parsing support for the values written as strings like , * e.g. "10m" or "64px". * * When a suffixed unit value needs validation, define an isValid() * method; similarly for simple construction from a string (with a fixed * table of suffixes). Typical use then looks like: * * class MyUnit : public NamedSuffix * { * public: * using NamedSuffix::NamedSuffix; // Keep existing constructors * MyUnit( const QString& s ); * bool isValid() const; * } ; */ #ifndef UTILS_NAMEDSUFFIX_H #define UTILS_NAMEDSUFFIX_H #include "NamedEnum.h" /** @brief Template that takes the enum type to work with and a special none-enum. */ template class NamedSuffix { public: using unit_t = T; static constexpr unit_t none = _none; /** @brief Empty value. */ NamedSuffix() : m_value(0) , m_unit( none ) { } /** @brief Specific value and unit. */ NamedSuffix( int value, unit_t unit ) : m_value( value ) , m_unit( unit ) { } /** @brief Construct value and unit from string. * * This parses the given string @p s by comparing with the suffixes * in @p table and uses the first matching suffix as the unit. */ NamedSuffix( const NamedEnumTable& table, const QString& s ) : NamedSuffix() { for( const auto& suffix : table.table ) if ( s.endsWith( suffix.first ) ) { m_value = s.left( s.length() - suffix.first.length() ).toInt(); m_unit = suffix.second; break; } } /** @brief Construct value from string. * * This is not defined in the template, because it should probably * delegate to the constructor above with a fixed table. */ NamedSuffix( const QString& s ); int value() const { return m_value; } unit_t unit() const { return m_unit; } /** @brief Check that a value-unit combination is valid. * * This is not defined in the template, because validity (e.g. * range of acceptable values) depends on the kind of unit. */ bool isValid() const; protected: int m_value; unit_t m_unit; }; #endif