28typedef uint32_t dimension_t;
30constexpr size_t sizeof_dimension =
sizeof(
EDimension);
31constexpr size_t bits_of_dimension = sizeof_dimension * 8;
34#define _AST_DIM_EXP_OPBIN(value1, value2, op) \
35 (unsigned(( dim_get_exponent(value1, 0) op dim_get_exponent(value2, 0)) & 0xF) << 0) | \
36 (unsigned(( dim_get_exponent(value1, 1) op dim_get_exponent(value2, 1)) & 0xF) << 4) | \
37 (unsigned(( dim_get_exponent(value1, 2) op dim_get_exponent(value2, 2)) & 0xF) << 8) | \
38 (unsigned(( dim_get_exponent(value1, 3) op dim_get_exponent(value2, 3)) & 0xF) << 12) | \
39 (unsigned(( dim_get_exponent(value1, 4) op dim_get_exponent(value2, 4)) & 0xF) << 16) | \
40 (unsigned(( dim_get_exponent(value1, 5) op dim_get_exponent(value2, 5)) & 0xF) << 20) | \
41 (unsigned(( dim_get_exponent(value1, 6) op dim_get_exponent(value2, 6)) & 0xF) << 24) | \
42 (unsigned(( dim_get_exponent(value1, 7) op dim_get_exponent(value2, 7)) & 0xF) << 28)
45#define _AST_DIM_EXP_TIMES(value, times)\
46 (unsigned(( dim_get_exponent(value, 0) * times) & 0xF) << 0) | \
47 (unsigned(( dim_get_exponent(value, 1) * times) & 0xF) << 4) | \
48 (unsigned(( dim_get_exponent(value, 2) * times) & 0xF) << 8) | \
49 (unsigned(( dim_get_exponent(value, 3) * times) & 0xF) << 12) | \
50 (unsigned(( dim_get_exponent(value, 4) * times) & 0xF) << 16) | \
51 (unsigned(( dim_get_exponent(value, 5) * times) & 0xF) << 20) | \
52 (unsigned(( dim_get_exponent(value, 6) * times) & 0xF) << 24) | \
53 (unsigned(( dim_get_exponent(value, 7) * times) & 0xF) << 28)
57# define _AST_DIM_USE_CXX14
64 static_assert(
sizeof(T) ==
sizeof(
EDimension),
"size not correct");
65 return (
int((
unsigned)dimension << (bits_of_dimension - 4 - idx * 4)) >> (bits_of_dimension - 4));
72 static_assert(
sizeof(T) ==
sizeof(
EDimension),
"size not correct");
77 dimension_t value = (dimension_t) dimension;
78 int shift =
static_cast<int>(idx) * 4;
79 int mask = 0xF << shift;
80 dimension_t newValue = value & ~mask;
82 int expBits = exponent & 0xF;
83 newValue |= (expBits << shift);
93#if defined(_AST_DIM_USE_CXX14)
95 for (
int i = 0; i < 8; ++i) {
115 #if defined(_AST_DIM_USE_CXX14)
116 static_assert(
sizeof(T) ==
sizeof(
EDimension),
"size not correct");
117 const size_t size =
sizeof(T) * 8;
118 dimension_t result = 0;
119 dimension_t value1 = (dimension_t)dim1;
120 dimension_t value2 = (dimension_t)dim2;
123 for (
int i = 0; i < 8; ++i) {
126 int exp1 = (int((
unsigned)value1 << (size - 4 - shift)) >> (size - 4));
127 int exp2 = (int((
unsigned)value2 << (size - 4 - shift)) >> (size - 4));
130 int sum = exp1 + exp2;
138 int sumBits = sum & 0xF;
139 result |= (sumBits << shift);
144 return _AST_DIM_EXP_OPBIN(dim1, dim2, +);
150constexpr dimension_t dim_divide(T dim1, T dim2)
noexcept
152 #if defined(_AST_DIM_USE_CXX14)
153 static_assert(
sizeof(T) ==
sizeof(EDimension),
"size not correct");
154 const size_t size =
sizeof(T) * 8;
155 dimension_t result = 0;
156 dimension_t value1 = (dimension_t)dim1;
157 dimension_t value2 = (dimension_t)dim2;
161 for (
int i = 0; i < 8; ++i) {
164 int exp1 = (int((
unsigned)value1 << (size - 4 - shift)) >> (size - 4));
165 int exp2 = (int((
unsigned)value2 << (size - 4 - shift)) >> (size - 4));
168 int diff = exp1 - exp2;
176 int diffBits = diff & 0xF;
177 result |= (diffBits << shift);
182 return _AST_DIM_EXP_OPBIN(dim1, dim2, -);
188constexpr dimension_t
dim_pow(T dimension,
int n)
noexcept
190 #if defined(_AST_DIM_USE_CXX14)
191 static_assert(
sizeof(T) ==
sizeof(
EDimension),
"size not correct");
192 const size_t size =
sizeof(T) * 8;
193 dimension_t result = 0;
194 dimension_t value = (dimension_t)dimension;
196 for (
int i = 0; i < 8; ++i) {
198 int exp = (int((
unsigned)value << (size - 4 - shift)) >> (size - 4));
200 int newExp = exp * n;
207 int newExpBits = newExp & 0xF;
208 result |= (newExpBits << shift);
213 return _AST_DIM_EXP_TIMES(dimension, n);
219constexpr dimension_t dim_invert(T dimension)
noexcept
221 return dim_pow(dimension, -1);
260 constexpr dimension_t kUnit = 0;
263 constexpr dimension_t kLength = 1 << kIdxLength * 4;
264 constexpr dimension_t kMass = 1 << kIdxMass * 4;
265 constexpr dimension_t kTime = 1 << kIdxTime * 4;
266 constexpr dimension_t kCurrent = 1 << kIdxCurrent * 4;
267 constexpr dimension_t kTemperature = 1 << kIdxTemperature * 4;
268 constexpr dimension_t kAmount = 1 << kIdxAmount * 4;
269 constexpr dimension_t kLuminous = 1 << kIdxLuminous * 4;
271 constexpr dimension_t kAngle = 1 << kIdxAngle * 4;
274 constexpr dimension_t kAngVel = dim_divide(kAngle, kTime);
275 constexpr dimension_t kAngularVelocity = kAngVel;
278 constexpr dimension_t kArea =
dim_product(kLength, kLength);
279 constexpr dimension_t kVolume =
dim_product(kArea, kLength);
280 constexpr dimension_t kSpeed = dim_divide(kLength, kTime);
281 constexpr dimension_t kAcceleration = dim_divide(kSpeed, kTime);
282 constexpr dimension_t kForce =
dim_product(kMass, kAcceleration);
283 constexpr dimension_t kPressure = dim_divide(kForce, kArea);
284 constexpr dimension_t kEnergy =
dim_product(kForce, kLength);
285 constexpr dimension_t kPower = dim_divide(kEnergy, kTime);
286 constexpr dimension_t kFrequency = dim_divide(kUnit, kTime);
294 eUnit = dimensions::kUnit,
298 eMass = dimensions::kMass,
299 eTime = dimensions::kTime,
305 eAngle = dimensions::kAngle,
312 eArea = dimensions::kArea,
314 eSpeed = dimensions::kSpeed,
316 eForce = dimensions::kForce,
319 ePower = dimensions::kPower,
327AST_UTIL_API std::string aDimName(EDimension dimension);
330AST_UTIL_API std::string aDimSymbol(EDimension dimension);
347 return dimension == EDimension::eUnit;
427 return value() * other.value();
432 this->dimension_ = value() * other.value();
438 return value() / other.value();
443 this->dimension_ = value() / other.value();
449 return value() == other.value();
454 return value() != other.value();
456 A_CONSTEXPR_CXX14
bool operator==(
EDimension other)
const noexcept
458 return value() == other;
460 A_CONSTEXPR_CXX14
bool operator!=(EDimension other)
const noexcept
462 return value() != other;
466 A_CONSTEXPR_CXX14
operator EDimension() const noexcept {
return dimension_; }
constexpr EDimension pow(EDimension dimension, int n) noexcept
量纲指数幂运算符
定义 Dimension.hpp:239
A_CONSTEXPR_CXX14 Dimension & setAmount(int n) noexcept
设置量纲中的物质量维度
定义 Dimension.hpp:523
static constexpr Dimension Volume() noexcept
获取体积量纲
定义 Dimension.hpp:387
constexpr Dimension() noexcept
默认构造函数,默认单位量纲
定义 Dimension.hpp:357
A_CONSTEXPR_CXX14 Dimension & operator/=(Dimension other) noexcept
量纲除法赋值运算符
定义 Dimension.hpp:441
static constexpr Dimension Area() noexcept
获取面积量纲
定义 Dimension.hpp:385
static constexpr Dimension AngVel() noexcept
获取角速度量纲
定义 Dimension.hpp:381
A_CONSTEXPR_CXX14 bool isBase() const noexcept
判断量纲是否为基本量纲
定义 Dimension.hpp:408
A_CONSTEXPR_CXX14 int getCurrent() const noexcept
获取量纲中的电流维度
定义 Dimension.hpp:476
A_CONSTEXPR_CXX14 EDimension value() const noexcept
获取量纲的值
定义 Dimension.hpp:468
static constexpr Dimension Angle()
获取角度量纲
定义 Dimension.hpp:379
A_CONSTEXPR_CXX14 int getMass() const noexcept
获取量纲中的质量维度
定义 Dimension.hpp:470
static constexpr Dimension Frequency() noexcept
获取频率量纲
定义 Dimension.hpp:399
A_CONSTEXPR_CXX14 Dimension & setTime(int n) noexcept
设置量纲中的时间维度
定义 Dimension.hpp:499
static constexpr Dimension Speed() noexcept
获取速度量纲
定义 Dimension.hpp:389
A_CONSTEXPR_CXX14 bool operator!=(Dimension other) const noexcept
量纲不相等运算符
定义 Dimension.hpp:452
static constexpr Dimension Current()
获取电流量纲
定义 Dimension.hpp:371
A_CONSTEXPR_CXX14 Dimension invert() const noexcept
量纲倒数
定义 Dimension.hpp:420
A_CONSTEXPR_CXX14 Dimension & setMass(int n) noexcept
设置量纲中的质量维度
定义 Dimension.hpp:487
A_CONSTEXPR_CXX14 Dimension & setLuminous(int n) noexcept
设置量纲中的发光强度维度
定义 Dimension.hpp:529
A_CONSTEXPR_CXX14 int getTemperature() const noexcept
获取量纲中的温度维度
定义 Dimension.hpp:480
A_CONSTEXPR_CXX14 int getLuminous() const noexcept
获取量纲中的发光强度维度
定义 Dimension.hpp:484
A_CONSTEXPR_CXX14 int getTime() const noexcept
获取量纲中的时间维度
定义 Dimension.hpp:474
A_CONSTEXPR_CXX14 bool isUnit() const noexcept
判断量纲是否为单位量纲
定义 Dimension.hpp:412
static constexpr Dimension Energy() noexcept
获取能量量纲
定义 Dimension.hpp:395
static constexpr Dimension Mass()
获取质量量纲
定义 Dimension.hpp:367
A_CONSTEXPR_CXX14 Dimension operator*(Dimension other) const noexcept
量纲乘法运算符
定义 Dimension.hpp:425
std::string name() const
获取量纲的名称
定义 Dimension.hpp:404
static constexpr Dimension Power() noexcept
获取功率量纲
定义 Dimension.hpp:397
A_CONSTEXPR_CXX14 Dimension & operator*=(Dimension other) noexcept
量纲乘法赋值运算符
定义 Dimension.hpp:430
std::string symbol() const
获取量纲的符号
定义 Dimension.hpp:406
static constexpr Dimension Pressure() noexcept
获取压力量纲
定义 Dimension.hpp:393
A_CONSTEXPR_CXX14 Dimension & setCurrent(int n) noexcept
设置量纲中的电流维度
定义 Dimension.hpp:505
static constexpr Dimension Acceleration() noexcept
获取加速度量纲
定义 Dimension.hpp:391
A_CONSTEXPR_CXX14 int getLength() const noexcept
获取量纲中的长度维度
定义 Dimension.hpp:472
static constexpr Dimension Temperature()
获取温度量纲
定义 Dimension.hpp:373
static constexpr Dimension Amount()
获取物质量量纲
定义 Dimension.hpp:375
A_CONSTEXPR_CXX14 int getAngle() const noexcept
获取量纲中的角度维度
定义 Dimension.hpp:478
static constexpr Dimension Luminous()
获取发光强度量纲
定义 Dimension.hpp:377
A_CONSTEXPR_CXX14 Dimension pow(int n) const noexcept
量纲指数幂
定义 Dimension.hpp:415
A_CONSTEXPR_CXX14 int getAmount() const noexcept
获取量纲中的物质量维度
定义 Dimension.hpp:482
static constexpr Dimension Length()
获取长度量纲
定义 Dimension.hpp:365
A_CONSTEXPR_CXX14 Dimension & setTemperature(int n) noexcept
设置量纲中的温度维度
定义 Dimension.hpp:517
static constexpr Dimension Force() noexcept
获取力量纲
定义 Dimension.hpp:401
static constexpr Dimension Unit()
获取单位量纲
定义 Dimension.hpp:363
A_CONSTEXPR_CXX14 Dimension & setLength(int n) noexcept
设置量纲中的长度维度
定义 Dimension.hpp:493
A_CONSTEXPR_CXX14 Dimension operator/(Dimension other) const noexcept
量纲除法运算符
定义 Dimension.hpp:436
A_CONSTEXPR_CXX14 Dimension & setAngle(int n) noexcept
设置量纲中的角度维度
定义 Dimension.hpp:511
constexpr Dimension(EDimension dimension) noexcept
隐式构造函数
定义 Dimension.hpp:360
static constexpr Dimension AngularVelocity() noexcept
获取角速度量纲
定义 Dimension.hpp:383
static constexpr Dimension Time()
获取时间量纲
定义 Dimension.hpp:369
A_CONSTEXPR_CXX14 bool isDerived() const noexcept
判断量纲是否为导出量纲
定义 Dimension.hpp:410
A_CONSTEXPR_CXX14 bool operator==(Dimension other) const noexcept
量纲相等运算符
定义 Dimension.hpp:447
A_CONSTEXPR_CXX14 EDimension dim_set_exponent(T dimension, int idx, int exponent) noexcept
设置量纲的指数
定义 Dimension.hpp:70
constexpr dimension_t dim_product(T dim1, T dim2) noexcept
量纲乘法
定义 Dimension.hpp:113
A_CONSTEXPR_CXX14 bool aDimIsBase(EDimension dimension) noexcept
判断量纲是否为基本量纲
定义 Dimension.hpp:333
constexpr dimension_t dim_pow(T dimension, int n) noexcept
量纲指数幂
定义 Dimension.hpp:188
A_CONSTEXPR_CXX14 bool aDimIsUnit(EDimension dimension) noexcept
判断量纲是否为单位量纲
定义 Dimension.hpp:345
constexpr EDimension operator/(EDimension dim1, EDimension dim2) noexcept
量纲除法运算符
定义 Dimension.hpp:231
constexpr int dim_get_exponent(T dimension, int idx) noexcept
获取量纲的指数
定义 Dimension.hpp:62
std::string aDimName(EDimension dimension)
获取量纲的名称
定义 Dimension.cpp:80
constexpr int dim_get_sum_abs_exponent(T dimension) noexcept
获取量纲的指数绝对值的和
定义 Dimension.hpp:91
EDimension
量纲枚举类
定义 Dimension.hpp:293
@ 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:339
std::string aDimSymbol(EDimension dimension)
获取量纲的符号
定义 Dimension.cpp:167