29typedef uint32_t dimension_t;
31constexpr size_t sizeof_dimension =
sizeof(
EDimension);
32constexpr size_t bits_of_dimension = sizeof_dimension * 8;
35#define _AST_DIM_EXP_OPBIN(value1, value2, op) \
36 (unsigned(( dim_get_exponent(value1, 0) op dim_get_exponent(value2, 0)) & 0xF) << 0) | \
37 (unsigned(( dim_get_exponent(value1, 1) op dim_get_exponent(value2, 1)) & 0xF) << 4) | \
38 (unsigned(( dim_get_exponent(value1, 2) op dim_get_exponent(value2, 2)) & 0xF) << 8) | \
39 (unsigned(( dim_get_exponent(value1, 3) op dim_get_exponent(value2, 3)) & 0xF) << 12) | \
40 (unsigned(( dim_get_exponent(value1, 4) op dim_get_exponent(value2, 4)) & 0xF) << 16) | \
41 (unsigned(( dim_get_exponent(value1, 5) op dim_get_exponent(value2, 5)) & 0xF) << 20) | \
42 (unsigned(( dim_get_exponent(value1, 6) op dim_get_exponent(value2, 6)) & 0xF) << 24) | \
43 (unsigned(( dim_get_exponent(value1, 7) op dim_get_exponent(value2, 7)) & 0xF) << 28)
46#define _AST_DIM_EXP_TIMES(value, times)\
47 (unsigned(( dim_get_exponent(value, 0) * times) & 0xF) << 0) | \
48 (unsigned(( dim_get_exponent(value, 1) * times) & 0xF) << 4) | \
49 (unsigned(( dim_get_exponent(value, 2) * times) & 0xF) << 8) | \
50 (unsigned(( dim_get_exponent(value, 3) * times) & 0xF) << 12) | \
51 (unsigned(( dim_get_exponent(value, 4) * times) & 0xF) << 16) | \
52 (unsigned(( dim_get_exponent(value, 5) * times) & 0xF) << 20) | \
53 (unsigned(( dim_get_exponent(value, 6) * times) & 0xF) << 24) | \
54 (unsigned(( dim_get_exponent(value, 7) * times) & 0xF) << 28)
58# define _AST_DIM_USE_CXX14
65 static_assert(
sizeof(T) ==
sizeof(
EDimension),
"size not correct");
66 return (
int((
unsigned)dimension << (bits_of_dimension - 4 - idx * 4)) >> (bits_of_dimension - 4));
73 static_assert(
sizeof(T) ==
sizeof(
EDimension),
"size not correct");
78 dimension_t value = (dimension_t) dimension;
79 int shift =
static_cast<int>(idx) * 4;
80 int mask = 0xF << shift;
81 dimension_t newValue = value & ~mask;
83 int expBits = exponent & 0xF;
84 newValue |= (expBits << shift);
94#if defined(_AST_DIM_USE_CXX14)
96 for (
int i = 0; i < 8; ++i) {
116 #if defined(_AST_DIM_USE_CXX14)
117 static_assert(
sizeof(T) ==
sizeof(
EDimension),
"size not correct");
118 const size_t size =
sizeof(T) * 8;
119 dimension_t result = 0;
120 dimension_t value1 = (dimension_t)dim1;
121 dimension_t value2 = (dimension_t)dim2;
124 for (
int i = 0; i < 8; ++i) {
127 int exp1 = (int((
unsigned)value1 << (size - 4 - shift)) >> (size - 4));
128 int exp2 = (int((
unsigned)value2 << (size - 4 - shift)) >> (size - 4));
131 int sum = exp1 + exp2;
139 int sumBits = sum & 0xF;
140 result |= (sumBits << shift);
145 return _AST_DIM_EXP_OPBIN(dim1, dim2, +);
151constexpr dimension_t dim_divide(T dim1, T dim2)
noexcept
153 #if defined(_AST_DIM_USE_CXX14)
154 static_assert(
sizeof(T) ==
sizeof(EDimension),
"size not correct");
155 const size_t size =
sizeof(T) * 8;
156 dimension_t result = 0;
157 dimension_t value1 = (dimension_t)dim1;
158 dimension_t value2 = (dimension_t)dim2;
162 for (
int i = 0; i < 8; ++i) {
165 int exp1 = (int((
unsigned)value1 << (size - 4 - shift)) >> (size - 4));
166 int exp2 = (int((
unsigned)value2 << (size - 4 - shift)) >> (size - 4));
169 int diff = exp1 - exp2;
177 int diffBits = diff & 0xF;
178 result |= (diffBits << shift);
183 return _AST_DIM_EXP_OPBIN(dim1, dim2, -);
189constexpr dimension_t
dim_pow(T dimension,
int n)
noexcept
191 #if defined(_AST_DIM_USE_CXX14)
192 static_assert(
sizeof(T) ==
sizeof(
EDimension),
"size not correct");
193 const size_t size =
sizeof(T) * 8;
194 dimension_t result = 0;
195 dimension_t value = (dimension_t)dimension;
197 for (
int i = 0; i < 8; ++i) {
199 int exp = (int((
unsigned)value << (size - 4 - shift)) >> (size - 4));
201 int newExp = exp * n;
208 int newExpBits = newExp & 0xF;
209 result |= (newExpBits << shift);
214 return _AST_DIM_EXP_TIMES(dimension, n);
220constexpr dimension_t dim_invert(T dimension)
noexcept
222 return dim_pow(dimension, -1);
261 constexpr dimension_t kUnit = 0;
264 constexpr dimension_t kLength = 1 << kIdxLength * 4;
265 constexpr dimension_t kMass = 1 << kIdxMass * 4;
266 constexpr dimension_t kTime = 1 << kIdxTime * 4;
267 constexpr dimension_t kCurrent = 1 << kIdxCurrent * 4;
268 constexpr dimension_t kTemperature = 1 << kIdxTemperature * 4;
269 constexpr dimension_t kAmount = 1 << kIdxAmount * 4;
270 constexpr dimension_t kLuminous = 1 << kIdxLuminous * 4;
272 constexpr dimension_t kAngle = 1 << kIdxAngle * 4;
275 constexpr dimension_t kAngVel = dim_divide(kAngle, kTime);
276 constexpr dimension_t kAngularVelocity = kAngVel;
279 constexpr dimension_t kArea =
dim_product(kLength, kLength);
280 constexpr dimension_t kVolume =
dim_product(kArea, kLength);
281 constexpr dimension_t kSpeed = dim_divide(kLength, kTime);
282 constexpr dimension_t kAcceleration = dim_divide(kSpeed, kTime);
283 constexpr dimension_t kForce =
dim_product(kMass, kAcceleration);
284 constexpr dimension_t kPressure = dim_divide(kForce, kArea);
285 constexpr dimension_t kEnergy =
dim_product(kForce, kLength);
286 constexpr dimension_t kPower = dim_divide(kEnergy, kTime);
287 constexpr dimension_t kFrequency = dim_divide(kUnit, kTime);
295 eUnit = dimensions::kUnit,
299 eMass = dimensions::kMass,
300 eTime = dimensions::kTime,
306 eAngle = dimensions::kAngle,
313 eArea = dimensions::kArea,
315 eSpeed = dimensions::kSpeed,
317 eForce = dimensions::kForce,
320 ePower = dimensions::kPower,
328AST_UTIL_API std::string aDimName(EDimension dimension);
331AST_UTIL_API std::string aDimSymbol(EDimension dimension);
348 return dimension == EDimension::eUnit;
428 return value() * other.value();
433 this->dimension_ = value() * other.value();
439 return value() / other.value();
444 this->dimension_ = value() / other.value();
450 return value() == other.value();
455 return value() != other.value();
457 A_CONSTEXPR_CXX14
bool operator==(
EDimension other)
const noexcept
459 return value() == other;
461 A_CONSTEXPR_CXX14
bool operator!=(EDimension other)
const noexcept
463 return value() != other;
467 A_CONSTEXPR_CXX14
operator EDimension() const noexcept {
return dimension_; }
539 void decompose(std::array<std::pair<Dimension, int>, 8>& basicDimensions)
const;
constexpr EDimension pow(EDimension dimension, int n) noexcept
量纲指数幂运算符
定义 Dimension.hpp:240
A_CONSTEXPR_CXX14 Dimension & setAmount(int n) noexcept
设置量纲中的物质量维度
定义 Dimension.hpp:524
static constexpr Dimension Volume() noexcept
获取体积量纲
定义 Dimension.hpp:388
constexpr Dimension() noexcept
默认构造函数,默认单位量纲
定义 Dimension.hpp:358
A_CONSTEXPR_CXX14 Dimension & operator/=(Dimension other) noexcept
量纲除法赋值运算符
定义 Dimension.hpp:442
static constexpr Dimension Area() noexcept
获取面积量纲
定义 Dimension.hpp:386
static constexpr Dimension AngVel() noexcept
获取角速度量纲
定义 Dimension.hpp:382
A_CONSTEXPR_CXX14 bool isBase() const noexcept
判断量纲是否为基本量纲
定义 Dimension.hpp:409
A_CONSTEXPR_CXX14 int getCurrent() const noexcept
获取量纲中的电流维度
定义 Dimension.hpp:477
A_CONSTEXPR_CXX14 EDimension value() const noexcept
获取量纲的值
定义 Dimension.hpp:469
static constexpr Dimension Angle()
获取角度量纲
定义 Dimension.hpp:380
A_CONSTEXPR_CXX14 int getMass() const noexcept
获取量纲中的质量维度
定义 Dimension.hpp:471
static constexpr Dimension Frequency() noexcept
获取频率量纲
定义 Dimension.hpp:400
A_CONSTEXPR_CXX14 Dimension & setTime(int n) noexcept
设置量纲中的时间维度
定义 Dimension.hpp:500
static constexpr Dimension Speed() noexcept
获取速度量纲
定义 Dimension.hpp:390
A_CONSTEXPR_CXX14 bool operator!=(Dimension other) const noexcept
量纲不相等运算符
定义 Dimension.hpp:453
static constexpr Dimension Current()
获取电流量纲
定义 Dimension.hpp:372
A_CONSTEXPR_CXX14 Dimension invert() const noexcept
量纲倒数
定义 Dimension.hpp:421
A_CONSTEXPR_CXX14 Dimension & setMass(int n) noexcept
设置量纲中的质量维度
定义 Dimension.hpp:488
A_CONSTEXPR_CXX14 Dimension & setLuminous(int n) noexcept
设置量纲中的发光强度维度
定义 Dimension.hpp:530
A_CONSTEXPR_CXX14 int getTemperature() const noexcept
获取量纲中的温度维度
定义 Dimension.hpp:481
A_CONSTEXPR_CXX14 int getLuminous() const noexcept
获取量纲中的发光强度维度
定义 Dimension.hpp:485
A_CONSTEXPR_CXX14 int getTime() const noexcept
获取量纲中的时间维度
定义 Dimension.hpp:475
A_CONSTEXPR_CXX14 bool isUnit() const noexcept
判断量纲是否为单位量纲
定义 Dimension.hpp:413
static constexpr Dimension Energy() noexcept
获取能量量纲
定义 Dimension.hpp:396
static constexpr Dimension Mass()
获取质量量纲
定义 Dimension.hpp:368
A_CONSTEXPR_CXX14 Dimension operator*(Dimension other) const noexcept
量纲乘法运算符
定义 Dimension.hpp:426
std::string name() const
获取量纲的名称
定义 Dimension.hpp:405
static constexpr Dimension Power() noexcept
获取功率量纲
定义 Dimension.hpp:398
A_CONSTEXPR_CXX14 Dimension & operator*=(Dimension other) noexcept
量纲乘法赋值运算符
定义 Dimension.hpp:431
std::string symbol() const
获取量纲的符号
定义 Dimension.hpp:407
static constexpr Dimension Pressure() noexcept
获取压力量纲
定义 Dimension.hpp:394
A_CONSTEXPR_CXX14 Dimension & setCurrent(int n) noexcept
设置量纲中的电流维度
定义 Dimension.hpp:506
static constexpr Dimension Acceleration() noexcept
获取加速度量纲
定义 Dimension.hpp:392
A_CONSTEXPR_CXX14 int getLength() const noexcept
获取量纲中的长度维度
定义 Dimension.hpp:473
static constexpr Dimension Temperature()
获取温度量纲
定义 Dimension.hpp:374
static constexpr Dimension Amount()
获取物质量量纲
定义 Dimension.hpp:376
A_CONSTEXPR_CXX14 int getAngle() const noexcept
获取量纲中的角度维度
定义 Dimension.hpp:479
static constexpr Dimension Luminous()
获取发光强度量纲
定义 Dimension.hpp:378
A_CONSTEXPR_CXX14 Dimension pow(int n) const noexcept
量纲指数幂
定义 Dimension.hpp:416
A_CONSTEXPR_CXX14 int getAmount() const noexcept
获取量纲中的物质量维度
定义 Dimension.hpp:483
static constexpr Dimension Length()
获取长度量纲
定义 Dimension.hpp:366
A_CONSTEXPR_CXX14 Dimension & setTemperature(int n) noexcept
设置量纲中的温度维度
定义 Dimension.hpp:518
static constexpr Dimension Force() noexcept
获取力量纲
定义 Dimension.hpp:402
static constexpr Dimension Unit()
获取单位量纲
定义 Dimension.hpp:364
A_CONSTEXPR_CXX14 Dimension & setLength(int n) noexcept
设置量纲中的长度维度
定义 Dimension.hpp:494
A_CONSTEXPR_CXX14 Dimension operator/(Dimension other) const noexcept
量纲除法运算符
定义 Dimension.hpp:437
A_CONSTEXPR_CXX14 Dimension & setAngle(int n) noexcept
设置量纲中的角度维度
定义 Dimension.hpp:512
constexpr Dimension(EDimension dimension) noexcept
隐式构造函数
定义 Dimension.hpp:361
static constexpr Dimension AngularVelocity() noexcept
获取角速度量纲
定义 Dimension.hpp:384
static constexpr Dimension Time()
获取时间量纲
定义 Dimension.hpp:370
A_CONSTEXPR_CXX14 bool isDerived() const noexcept
判断量纲是否为导出量纲
定义 Dimension.hpp:411
A_CONSTEXPR_CXX14 bool operator==(Dimension other) const noexcept
量纲相等运算符
定义 Dimension.hpp:448
A_CONSTEXPR_CXX14 EDimension dim_set_exponent(T dimension, int idx, int exponent) noexcept
设置量纲的指数
定义 Dimension.hpp:71
constexpr dimension_t dim_product(T dim1, T dim2) noexcept
量纲乘法
定义 Dimension.hpp:114
A_CONSTEXPR_CXX14 bool aDimIsBase(EDimension dimension) noexcept
判断量纲是否为基本量纲
定义 Dimension.hpp:334
constexpr dimension_t dim_pow(T dimension, int n) noexcept
量纲指数幂
定义 Dimension.hpp:189
A_CONSTEXPR_CXX14 bool aDimIsUnit(EDimension dimension) noexcept
判断量纲是否为单位量纲
定义 Dimension.hpp:346
constexpr EDimension operator/(EDimension dim1, EDimension dim2) noexcept
量纲除法运算符
定义 Dimension.hpp:232
constexpr int dim_get_exponent(T dimension, int idx) noexcept
获取量纲的指数
定义 Dimension.hpp:63
std::string aDimName(EDimension dimension)
获取量纲的名称
定义 Dimension.cpp:80
constexpr int dim_get_sum_abs_exponent(T dimension) noexcept
获取量纲的指数绝对值的和
定义 Dimension.hpp:92
EDimension
量纲枚举类
定义 Dimension.hpp:294
@ eAmount
物质量N (相应的基本单位: mol)
@ eLuminous
发光强度J (相应的基本单位: cd)
@ eTemperature
温度Θ (相应的基本单位: K)
@ eCurrent
电流I (相应的基本单位: A)
@ eAcceleration
加速度 L·T^-2
@ eLength
长度L (相应的基本单位: m)
@ ePressure
压力 M·L^-1·T^-2
A_CONSTEXPR_CXX14 bool aDimIsDerived(EDimension dimension) noexcept
判断量纲是否为导出量纲
定义 Dimension.hpp:340
std::string aDimSymbol(EDimension dimension)
获取量纲的符号
定义 Dimension.cpp:167