1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
|
/*
* This file is part of the PulseView project.
*
* Copyright (C) 2012 Joel Holdsworth <joel@airwebreathe.org.uk>
*
* This program 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 2 of the License, or
* (at your option) any later version.
*
* This program 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 this program; if not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PULSEVIEW_UTIL_HPP
#define PULSEVIEW_UTIL_HPP
#include <cmath>
#include <string>
#include <vector>
#ifndef Q_MOC_RUN
#include <boost/multiprecision/cpp_dec_float.hpp>
#endif
#include <QMetaType>
#include <QString>
#include <QFontMetrics>
using std::string;
using std::vector;
namespace pv {
namespace util {
enum class TimeUnit {
None = 0,
Time = 1,
Samples = 2
};
enum class SIPrefix {
unspecified = -1,
yocto, zepto,
atto, femto, pico,
nano, micro, milli,
none,
kilo, mega, giga,
tera, peta, exa,
zetta, yotta
};
/// Returns the exponent that corresponds to a given prefix.
int exponent(SIPrefix prefix);
/// Timestamp type providing yoctosecond resolution.
typedef boost::multiprecision::number<
boost::multiprecision::cpp_dec_float<24>,
boost::multiprecision::et_off> Timestamp;
/**
* Formats a given timestamp with the specified SI prefix.
*
* If 'prefix' is left 'unspecified', the function chooses a prefix so that
* the value in front of the decimal point is between 1 and 999.
*
* The default value "s" for the unit argument makes the most sense when
* formatting time values, but a different value can be given if the function
* is reused to format a value of another quantity.
*
* @param t The value to format.
* @param prefix The SI prefix to use.
* @param precision The number of digits after the decimal separator.
* @param unit The unit of quantity.
* @param sign Whether or not to add a sign also for positive numbers.
*
* @return The formatted value.
*/
QString format_time_si(const Timestamp& v,
SIPrefix prefix = SIPrefix::unspecified, unsigned precision = 0,
QString unit = "s", bool sign = true);
/**
* Formats a given value into a representation using SI units.
*
* If 'prefix' is left 'unspecified', the function chooses a prefix so that
* the value in front of the decimal point is between 1 and 999.
*
* @param value The value to format.
* @param prefix The SI prefix to use.
* @param precision The number of digits after the decimal separator.
* @param unit The unit of quantity.
* @param sign Whether or not to add a sign also for positive numbers.
*
* @return The formatted value.
*/
QString format_value_si(double v,
SIPrefix prefix = SIPrefix::unspecified, unsigned precision = 0,
QString unit = "", bool sign = true);
/**
* Wrapper around 'format_time_si()' that interprets the given 'precision'
* value as the number of decimal places if the timestamp would be formatted
* without a SI prefix (using 'SIPrefix::none') and adjusts the precision to
* match the given 'prefix'
*
* @param t The value to format.
* @param prefix The SI prefix to use.
* @param precision The number of digits after the decimal separator if the
* 'prefix' would be 'SIPrefix::none', see above for more information.
* @param unit The unit of quantity.
* @param sign Whether or not to add a sign also for positive numbers.
*
* @return The formatted value.
*/
QString format_time_si_adjusted(const Timestamp& t, SIPrefix prefix,
unsigned precision = 0, QString unit = "s", bool sign = true);
/**
* Formats the given timestamp using "[+-]DD:HH:MM:SS.mmm uuu nnn ppp..." format.
*
* "DD" and "HH" are left out if they would be "00" (but if "DD" is generated,
* "HH" is also always generated. The "MM:SS" part is always produced, the
* number of subsecond digits can be influenced using the 'precision' parameter.
*
* @param t The value to format.
* @param precision The number of digits after the decimal separator.
* @param sign Whether or not to add a sign also for positive numbers.
*
* @return The formatted value.
*/
QString format_time_minutes(const Timestamp& t, signed precision = 0,
bool sign = true);
vector<string> split_string(string text, string separator);
/**
* Return the width of a string in a given font.
* @param[in] metric metrics of the font
* @param[in] string the string whose width should be determined
*
* @return width of the string in pixels
*/
std::streamsize text_width(const QFontMetrics &metric, const QString &string);
} // namespace util
} // namespace pv
Q_DECLARE_METATYPE(pv::util::Timestamp)
#endif // PULSEVIEW_UTIL_HPP
|