6#ifndef ACTIVE_SETTING_MEASURED_VALUE
7#define ACTIVE_SETTING_MEASURED_VALUE
9#include "Active/Setting/Values/DoubleValue.h"
10#include "Active/Utility/BufferIn.h"
91 using Type =
typename T::Type;
121 using DoubleValue::operator=;
145 using UnitValue = std::pair<double, Type>;
147 auto collect = [](UnitValue& value,
const T& unit, Type type) {
148 UnitValue otherValue{0.0, type};
149 auto total = value.first;
150 value.first = math::roundDown(total, 1.0);
151 otherValue.first = unit.conversion(otherValue.second, unit.conversion(value.second, total - value.first,
true));
153 if (unit.isLeadingZero || !math::isZero(value.first, 1.0))
154 result =
utility::String{value.first, 1.0} + unit.suffix(value.second);
159 bool isSuffix = unit.isUnitSuffix || unit.secondary;
160 UnitValue value{unit.conversion(unit.primary,
data), unit.primary};
163 if (unit.secondary) {
164 result = collect(value, unit, *unit.secondary);
167 result +=
" " + collect(value, unit, *unit.tertiary);
170 if (unit.isDecimal()) {
176 auto wholePart = math::roundDown(value.first, 1.0);
177 if (!math::isZero(wholePart)) {
178 value.first -= wholePart;
183 auto dividend =
static_cast<uint64_t
>(
math::round(fabs(value.first) / unit.eps(), 1.0));
185 auto divisor =
static_cast<uint64_t
>(unit.divisor());
186 while ((dividend % 2) == 0) {
198 result += unit.suffix(value.second);
208 virtual T
getUnit()
const {
return m_unitFinder ? m_unitFinder() : m_unit; }
216 virtual void setUnit(
const T& unit) { m_unit = unit; }
233 using UnitExpression = std::pair<utility::String, Type>;
234 std::vector<UnitExpression> measureExpressions;
236 while (start < val.
size()) {
237 if (
auto match = unit.findSuffix(val, start); match) {
238 if (match->second == 0)
240 measureExpressions.push_back(UnitExpression(val.
substr(start, match->second - start), match->first));
241 start = match->second + unit.suffix(match->first).size();
243 measureExpressions.push_back(UnitExpression(val.
substr(start), unit.primary));
248 const auto& numPunct{std::use_facet<std::numpunct<char>>(std::locale{})};
251 for (
auto& expression : measureExpressions) {
256 for (
auto& word : words) {
260 auto dividend = 0.0, divisor = 1.0;
263 if (
auto divisionPos = word.find(
"/"); divisionPos) {
264 if (number = word.substr(*divisionPos + 1); (number.
status == good) && !math::isZero(number.
data))
268 word = word.substr(0, divisionPos);
271 if (number.
status == good)
276 data += unit.conversion(expression.second, dividend / divisor,
true);
Template specialisation of DoubleValue for values of measurement.
Definition MeasuredValue.h:85
std::function< T()> UnitRetrieval
Function retrieving a measument unit.
Definition MeasuredValue.h:93
MeasuredValue()
Definition MeasuredValue.h:100
virtual void setUnit(UnitRetrieval unitFinder)
Definition MeasuredValue.h:221
virtual void setUnit(const T &unit)
Definition MeasuredValue.h:216
Value & operator=(const utility::String &val) override
Definition MeasuredValue.h:128
MeasuredValue(UnitRetrieval unitFinder, double val=0.0)
Definition MeasuredValue.h:117
virtual T getUnit() const
Definition MeasuredValue.h:208
MeasuredValue(double val)
Definition MeasuredValue.h:105
virtual utility::String operator()(const T &unit) const
Definition MeasuredValue.h:143
virtual Value & assign(const utility::String &val, const T &unit)
Definition MeasuredValue.h:228
MeasuredValue(const T &unit, double val=0.0)
Definition MeasuredValue.h:111
Definition ValueBase.h:21
T data
The value data.
Definition ValueBase.h:58
Status status
The value status.
Definition Value.h:100
std::vector< String > readWords(Memory::sizeOption howMany=std::nullopt, const String &division=String::allWhiteSpace) const
Definition BufferIn.cpp:385
A Unicode-aware string class.
Definition String.h:51
bool empty() const
Definition String.h:409
std::string::size_type size_type
Class size type.
Definition String.h:65
String substr(size_type startPos=0, sizeOption howMany=std::nullopt) const
Definition String.cpp:958
size_type size() const
Definition String.cpp:903
double round(const double &val, double module=eps)
Rounding functions.
Definition MathFunctions.h:160
Definition Transportable.h:13