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);
262 constexpr dimension_t kUnit = 0;
265 constexpr dimension_t kLength = 1 << kIdxLength * 4;
266 constexpr dimension_t kMass = 1 << kIdxMass * 4;
267 constexpr dimension_t kTime = 1 << kIdxTime * 4;
268 constexpr dimension_t kCurrent = 1 << kIdxCurrent * 4;
269 constexpr dimension_t kTemperature = 1 << kIdxTemperature * 4;
270 constexpr dimension_t kDateTime = 1 << kIdxDateTime * 4;
272 constexpr dimension_t kLuminous = 1 << kIdxLuminous * 4;
274 constexpr dimension_t kAngle = 1 << kIdxAngle * 4;
277 constexpr dimension_t kAngVel = dim_divide(kAngle, kTime);
278 constexpr dimension_t kAngularVelocity = kAngVel;
281 constexpr dimension_t kArea = dim_product(kLength, kLength);
282 constexpr dimension_t kVolume = dim_product(kArea, kLength);
283 constexpr dimension_t kSpeed = dim_divide(kLength, kTime);
284 constexpr dimension_t kAcceleration = dim_divide(kSpeed, kTime);
285 constexpr dimension_t kForce = dim_product(kMass, kAcceleration);
286 constexpr dimension_t kPressure = dim_divide(kForce, kArea);
287 constexpr dimension_t kEnergy = dim_product(kForce, kLength);
288 constexpr dimension_t kPower = dim_divide(kEnergy, kTime);
289 constexpr dimension_t kFrequency = dim_divide(kUnit, kTime);
290 constexpr dimension_t kDensity = dim_divide(kMass, kVolume);
298 eUnit = dimensions::kUnit,
302 eMass = dimensions::kMass,
303 eTime = dimensions::kTime,
310 eAngle = dimensions::kAngle,
317 eArea = dimensions::kArea,
319 eSpeed = dimensions::kSpeed,
321 eForce = dimensions::kForce,
324 ePower = dimensions::kPower,
333AST_UTIL_API std::string aDimName(EDimension dimension);
336AST_UTIL_API std::string aDimSymbol(EDimension dimension);
353 return dimension == EDimension::eUnit;
439 return value() * other.value();
444 this->dimension_ = value() * other.value();
450 return value() / other.value();
455 this->dimension_ = value() / other.value();
461 return value() == other.value();
466 return value() != other.value();
468 A_CONSTEXPR_CXX14
bool operator==(
EDimension other)
const noexcept
470 return value() == other;
472 A_CONSTEXPR_CXX14
bool operator!=(EDimension other)
const noexcept
474 return value() != other;
478 A_CONSTEXPR_CXX14
operator EDimension() const noexcept {
return dimension_; }
563 void decompose(std::array<std::pair<Dimension, int>, 8>& basicDimensions)
const;
constexpr EDimension pow(EDimension dimension, int n) noexcept
量纲指数幂运算符
定义 Dimension.hpp:240
static constexpr Dimension Volume() noexcept
获取体积量纲
定义 Dimension.hpp:397
constexpr Dimension() noexcept
默认构造函数,默认单位量纲
定义 Dimension.hpp:363
A_CONSTEXPR_CXX14 Dimension & operator/=(Dimension other) noexcept
量纲除法赋值运算符
定义 Dimension.hpp:453
A_CONSTEXPR_CXX14 int getDateTime() const noexcept
获取量纲中的日期时间维度
定义 Dimension.hpp:495
static constexpr Dimension Area() noexcept
获取面积量纲
定义 Dimension.hpp:395
static constexpr Dimension AngVel() noexcept
获取角速度量纲
定义 Dimension.hpp:391
A_CONSTEXPR_CXX14 bool isBase() const noexcept
判断量纲是否为基本量纲
定义 Dimension.hpp:420
A_CONSTEXPR_CXX14 int getCurrent() const noexcept
获取量纲中的电流维度
定义 Dimension.hpp:488
A_CONSTEXPR_CXX14 EDimension value() const noexcept
获取量纲的值
定义 Dimension.hpp:480
static constexpr Dimension Angle()
获取角度量纲
定义 Dimension.hpp:389
A_CONSTEXPR_CXX14 int getMass() const noexcept
获取量纲中的质量维度
定义 Dimension.hpp:482
static constexpr Dimension Frequency() noexcept
获取频率量纲
定义 Dimension.hpp:409
A_CONSTEXPR_CXX14 Dimension & setTime(int n) noexcept
设置量纲中的时间维度
定义 Dimension.hpp:516
static constexpr Dimension Speed() noexcept
获取速度量纲
定义 Dimension.hpp:399
A_CONSTEXPR_CXX14 bool operator!=(Dimension other) const noexcept
量纲不相等运算符
定义 Dimension.hpp:464
static constexpr Dimension Current()
获取电流量纲
定义 Dimension.hpp:377
A_CONSTEXPR_CXX14 Dimension invert() const noexcept
量纲倒数
定义 Dimension.hpp:432
A_CONSTEXPR_CXX14 Dimension & setMass(int n) noexcept
设置量纲中的质量维度
定义 Dimension.hpp:504
A_CONSTEXPR_CXX14 Dimension & setLuminous(int n) noexcept
设置量纲中的物质量维度
定义 Dimension.hpp:554
A_CONSTEXPR_CXX14 int getTemperature() const noexcept
获取量纲中的温度维度
定义 Dimension.hpp:492
A_CONSTEXPR_CXX14 int getLuminous() const noexcept
获取量纲中的物质量维度
定义 Dimension.hpp:501
A_CONSTEXPR_CXX14 int getTime() const noexcept
获取量纲中的时间维度
定义 Dimension.hpp:486
A_CONSTEXPR_CXX14 bool isUnit() const noexcept
判断量纲是否为单位量纲
定义 Dimension.hpp:424
static constexpr Dimension Energy() noexcept
获取能量量纲
定义 Dimension.hpp:405
static constexpr Dimension Mass()
获取质量量纲
定义 Dimension.hpp:373
A_CONSTEXPR_CXX14 Dimension operator*(Dimension other) const noexcept
量纲乘法运算符
定义 Dimension.hpp:437
std::string name() const
获取量纲的名称
定义 Dimension.hpp:416
static constexpr Dimension Power() noexcept
获取功率量纲
定义 Dimension.hpp:407
A_CONSTEXPR_CXX14 Dimension & operator*=(Dimension other) noexcept
量纲乘法赋值运算符
定义 Dimension.hpp:442
std::string symbol() const
获取量纲的符号
定义 Dimension.hpp:418
static constexpr Dimension Pressure() noexcept
获取压力量纲
定义 Dimension.hpp:403
A_CONSTEXPR_CXX14 Dimension & setCurrent(int n) noexcept
设置量纲中的电流维度
定义 Dimension.hpp:522
static constexpr Dimension Acceleration() noexcept
获取加速度量纲
定义 Dimension.hpp:401
static constexpr Dimension DateTime()
获取日期时间量纲
定义 Dimension.hpp:381
A_CONSTEXPR_CXX14 int getLength() const noexcept
获取量纲中的长度维度
定义 Dimension.hpp:484
static constexpr Dimension Temperature()
获取温度量纲
定义 Dimension.hpp:379
A_CONSTEXPR_CXX14 int getAngle() const noexcept
获取量纲中的角度维度
定义 Dimension.hpp:490
static constexpr Dimension Luminous()
获取物质量量纲
定义 Dimension.hpp:387
A_CONSTEXPR_CXX14 Dimension pow(int n) const noexcept
量纲指数幂
定义 Dimension.hpp:427
static constexpr Dimension Length()
获取长度量纲
定义 Dimension.hpp:371
A_CONSTEXPR_CXX14 Dimension & setTemperature(int n) noexcept
设置量纲中的温度维度
定义 Dimension.hpp:534
A_CONSTEXPR_CXX14 Dimension & setDateTime(int n) noexcept
设置量纲中的日期时间维度
定义 Dimension.hpp:540
static constexpr Dimension Force() noexcept
获取力量纲
定义 Dimension.hpp:411
static constexpr Dimension Unit()
获取单位量纲
定义 Dimension.hpp:369
A_CONSTEXPR_CXX14 Dimension & setLength(int n) noexcept
设置量纲中的长度维度
定义 Dimension.hpp:510
static constexpr Dimension Density() noexcept
获取密度量纲
定义 Dimension.hpp:413
A_CONSTEXPR_CXX14 Dimension operator/(Dimension other) const noexcept
量纲除法运算符
定义 Dimension.hpp:448
A_CONSTEXPR_CXX14 Dimension & setAngle(int n) noexcept
设置量纲中的角度维度
定义 Dimension.hpp:528
constexpr Dimension(EDimension dimension) noexcept
隐式构造函数
定义 Dimension.hpp:366
static constexpr Dimension AngularVelocity() noexcept
获取角速度量纲
定义 Dimension.hpp:393
static constexpr Dimension Time()
获取时间量纲
定义 Dimension.hpp:375
A_CONSTEXPR_CXX14 bool isDerived() const noexcept
判断量纲是否为导出量纲
定义 Dimension.hpp:422
A_CONSTEXPR_CXX14 bool operator==(Dimension other) const noexcept
量纲相等运算符
定义 Dimension.hpp:459
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:339
constexpr dimension_t dim_pow(T dimension, int n) noexcept
量纲指数幂
定义 Dimension.hpp:189
A_CONSTEXPR_CXX14 bool aDimIsUnit(EDimension dimension) noexcept
判断量纲是否为单位量纲
定义 Dimension.hpp:351
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:297
@ 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:345
@ kIdxAngle
角度[辅助量纲]
定义 Dimension.hpp:251
@ kIdxLength
长度
定义 Dimension.hpp:250
@ kIdxMass
质量
定义 Dimension.hpp:249
@ kIdxLuminous
发光强度
定义 Dimension.hpp:257
@ kIdxTemperature
温度
定义 Dimension.hpp:253
@ kIdxCurrent
电流
定义 Dimension.hpp:254
@ kIdxDateTime
日期时间[动力学扩展量纲]
定义 Dimension.hpp:255
@ kIdxTime
时间
定义 Dimension.hpp:252
std::string aDimSymbol(EDimension dimension)
获取量纲的符号
定义 Dimension.cpp:170