knowL: Knowledge Libraries
Loading...
Searching...
No Matches
Unit.h
1#pragma once
2
3#include <QExplicitlySharedDataPointer>
4
5#include "Forward.h"
6
7namespace knowCore
8{
9 class UnitRegistration;
16 class Unit
17 {
18 friend class UnitRegistration;
19 public:
20 enum class Prefix
21 {
22 Yotta,
23 Zetta,
24 Exa,
25 Peta,
26 Tera,
27 Giga,
28 Mega,
29 Kilo,
30 Hecto,
31 Deca,
32 Base,
33 Deci,
34 Centi,
35 Milli,
36 Micro,
37 Nano,
38 Pico,
39 Femto,
40 Atto,
41 Zepto,
42 Yocto
43 };
44 public:
45 static Unit empty();
46 Unit();
47 Unit(const Unit& _unit);
48 Unit& operator=(const Unit& _unit);
49 ~Unit();
53 QString symbol() const;
57 QString name() const;
62 knowCore::Uri uri() const;
67 Unit base() const;
75 bool operator==(const Unit& _unit) const;
79 bool isValid() const;
83 cres_qresult<Unit> operator/(const Unit& _unit) const;
87 cres_qresult<Unit> operator*(const Unit& _unit) const;
93 qreal scale() const;
94 public:
98 static QString prefixSymbol(Prefix p);
102 static QString prefixName(Prefix p);
106 static qreal prefixScale(Prefix p);
107 public:
111 static QList<Unit> baseUnits();
115 static cres_qresult<Unit> bySymbol(const QString& _symbol);
119 static cres_qresult<Unit> byName(const QString& _name);
123 static cres_qresult<Unit> byUri(const knowCore::Uri& _symbol);
124 private:
125 struct Private;
126 QExplicitlySharedDataPointer<const Private> d;
127 Unit(const QExplicitlySharedDataPointer<const Private>& _d);
128 };
136 {
137 public:
138 using PrefixToScale = std::function<double(Unit::Prefix)>;
139 using PrefixesToScale = std::function<double(const QList<Unit::Prefix>&)>;
140 using PrefixToString = std::function<QString(Unit::Prefix)>;
141 public:
142 UnitRegistration(const QString& _symbol, const QString& _name, const QString& _uri,
143 const QList<Unit::Prefix>& _prefixes, const PrefixToScale& _scale,
144 const PrefixToString& _to_uri);
145 UnitRegistration(const QString& _symbol, const QString& _name, const QString& _uri,
146 const QList<QList<Unit::Prefix>>& _prefixes, const PrefixesToScale& _scale,
147 const PrefixToString& _to_uri);
149 };
150
151} // namespace knowCore
152
153#define __KNOWCORE_UNIT_ADD_PREFIX(X, I) knowCore::Unit::Prefix::X,
154
155#define KNOWCORE_UNIT_PREFIX_LIST(...) KNOWCORE_FOREACH(__KNOWCORE_UNIT_ADD_PREFIX, __VA_ARGS__)
156
170#define KNOWCORE_DEFINE_UNIT(_CPP_SYMBOL_, _SYMBOL_, _NAME_, _URI_, _SCALE_F_, _TO_URI_F_, ...) \
171 knowCore::UnitRegistration __KNOWCORE_UNIQUE_STATIC_NAME(_CPP_SYMBOL_)( \
172 _SYMBOL_, _NAME_, _URI_, {KNOWCORE_UNIT_PREFIX_LIST(__VA_ARGS__)}, _SCALE_F_, _TO_URI_F_)
173
187#define KNOWCORE_DEFINE_COMPOSITE_UNIT(_CPP_SYMBOL_, _SYMBOL_, _NAME_, _URI_, _SCALE_F_, \
188 _TO_URI_F_, ...) \
189 knowCore::UnitRegistration __KNOWCORE_UNIQUE_STATIC_NAME(_CPP_SYMBOL_)( \
190 _SYMBOL_, _NAME_, _URI_, {__VA_ARGS__}, _SCALE_F_, _TO_URI_F_)
191
192#include "Formatter.h"
193
194clog_format_declare_formatter(knowCore::Unit)
195{
196 return std::format_to(ctx.out(), "{}", p.symbol());
197}
Definition Forward.h:14
Definition Unit.h:136
Definition Unit.h:17
static qreal prefixScale(Prefix p)
Definition Unit.cpp:346
cres_qresult< Unit > operator/(const Unit &_unit) const
Definition Unit.cpp:261
static QList< Unit > baseUnits()
Definition Unit.cpp:375
bool operator==(const Unit &_unit) const
Definition Unit.cpp:257
qreal scale() const
Definition Unit.cpp:255
Unit base() const
Definition Unit.cpp:251
static QString prefixName(Prefix p)
Definition Unit.cpp:275
static QString prefixSymbol(Prefix p)
Definition Unit.cpp:309
static cres_qresult< Unit > byName(const QString &_name)
Definition Unit.cpp:389
static cres_qresult< Unit > byUri(const knowCore::Uri &_symbol)
Definition Unit.cpp:401
QString name() const
Definition Unit.cpp:247
cres_qresult< Unit > operator*(const Unit &_unit) const
Definition Unit.cpp:266
QList< Unit > derivedUnits() const
Definition Unit.cpp:253
QString symbol() const
Definition Unit.cpp:245
bool isValid() const
Definition Unit.cpp:259
static cres_qresult< Unit > bySymbol(const QString &_symbol)
Definition Unit.cpp:377
knowCore::Uri uri() const
Definition Unit.cpp:249
Definition Uri.h:15
Definition Unit.cpp:17