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;
15 class Unit
16 {
17 friend class UnitRegistration;
18 public:
19 enum class Prefix
20 {
21 Yotta, Zetta, Exa, Peta, Tera, Giga, Mega, Kilo, Hecto, Deca, Base, Deci, Centi, Milli, Micro, Nano, Pico, Femto, Atto, Zepto, Yocto
22 };
23 public:
24 static Unit empty();
25 Unit();
26 Unit(const Unit& _unit);
27 Unit& operator=(const Unit& _unit);
28 ~Unit();
32 QString symbol() const;
36 QString name() const;
40 knowCore::Uri uri() const;
44 Unit base() const;
52 bool operator==(const Unit& _unit) const;
56 bool isValid() const;
60 ReturnValue<Unit> operator/(const Unit& _unit) const;
64 ReturnValue<Unit> operator*(const Unit& _unit) const;
69 qreal scale() const;
70 public:
74 static QString prefixSymbol(Prefix p);
78 static QString prefixName(Prefix p);
82 static qreal prefixScale(Prefix p);
83 public:
87 static QList<Unit> baseUnits();
91 static ReturnValue<Unit> bySymbol(const QString& _symbol);
95 static ReturnValue<Unit> byName(const QString& _name);
99 static ReturnValue<Unit> byUri(const knowCore::Uri& _symbol);
100 private:
101 struct Private;
102 QExplicitlySharedDataPointer<const Private> d;
103 Unit(const QExplicitlySharedDataPointer<const Private>& _d);
104 };
111 {
112 public:
113 using PrefixToScale = std::function<double(Unit::Prefix)>;
114 using PrefixesToScale = std::function<double(const QList<Unit::Prefix>&)>;
115 using PrefixToString = std::function<QString(Unit::Prefix)>;
116 public:
117 UnitRegistration(const QString& _symbol, const QString& _name, const QString& _uri, const QList<Unit::Prefix>& _prefixes, const PrefixToScale& _scale, const PrefixToString& _to_uri);
118 UnitRegistration(const QString& _symbol, const QString& _name, const QString& _uri, const QList<QList<Unit::Prefix>>& _prefixes, const PrefixesToScale& _scale, const PrefixToString& _to_uri);
120 };
121
122}
123
124#define __KNOWCORE_UNIT_ADD_PREFIX(X, I) knowCore::Unit::Prefix:: X,
125
126#define KNOWCORE_UNIT_PREFIX_LIST(...) \
127 KNOWCORE_FOREACH(__KNOWCORE_UNIT_ADD_PREFIX, __VA_ARGS__)
128
142#define KNOWCORE_DEFINE_UNIT(_CPP_SYMBOL_, _SYMBOL_, _NAME_, _URI_, _SCALE_F_, _TO_URI_F_, ...) \
143 knowCore::UnitRegistration __KNOWCORE_UNIQUE_STATIC_NAME(_CPP_SYMBOL_)(_SYMBOL_, _NAME_, _URI_, { KNOWCORE_UNIT_PREFIX_LIST(__VA_ARGS__) }, _SCALE_F_, _TO_URI_F_)
144
158#define KNOWCORE_DEFINE_COMPOSITE_UNIT(_CPP_SYMBOL_, _SYMBOL_, _NAME_, _URI_, _SCALE_F_, _TO_URI_F_, ...) \
159 knowCore::UnitRegistration __KNOWCORE_UNIQUE_STATIC_NAME(_CPP_SYMBOL_)(_SYMBOL_, _NAME_, _URI_, {__VA_ARGS__}, _SCALE_F_, _TO_URI_F_)
160
161
162#include "Formatter.h"
163
164KNOWCORE_CORE_DECLARE_FORMATTER(knowCore::Unit)
165{
166 return forward(p.symbol(), ctx);
167}
Definition Forward.h:12
Definition ReturnValue.h:29
Definition Unit.h:111
Definition Unit.h:16
static qreal prefixScale(Prefix p)
Definition Unit.cpp:370
static QList< Unit > baseUnits()
Definition Unit.cpp:399
static ReturnValue< Unit > bySymbol(const QString &_symbol)
Definition Unit.cpp:404
bool operator==(const Unit &_unit) const
Definition Unit.cpp:274
qreal scale() const
Definition Unit.cpp:269
static ReturnValue< Unit > byUri(const knowCore::Uri &_symbol)
Definition Unit.cpp:424
ReturnValue< Unit > operator*(const Unit &_unit) const
Definition Unit.cpp:289
Unit base() const
Definition Unit.cpp:259
static QString prefixName(Prefix p)
Definition Unit.cpp:299
static ReturnValue< Unit > byName(const QString &_name)
Definition Unit.cpp:414
static QString prefixSymbol(Prefix p)
Definition Unit.cpp:333
QString name() const
Definition Unit.cpp:249
QList< Unit > derivedUnits() const
Definition Unit.cpp:264
QString symbol() const
Definition Unit.cpp:244
bool isValid() const
Definition Unit.cpp:279
ReturnValue< Unit > operator/(const Unit &_unit) const
Definition Unit.cpp:284
knowCore::Uri uri() const
Definition Unit.cpp:254
Definition Uri.h:14
Definition Unit.cpp:17