File indexing completed on 2025-09-13 08:53:53
0001
0002
0003
0004
0005
0006
0007 #pragma once
0008
0009 #include <type_traits>
0010
0011 #include "corecel/Macros.hh"
0012
0013 namespace celeritas
0014 {
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035 class Constant
0036 {
0037 public:
0038
0039
0040 using real_type = double;
0041
0042
0043 public:
0044
0045 explicit CELER_CONSTEXPR_FUNCTION Constant(real_type v) : value_{v} {}
0046
0047
0048 CELER_CONSTEXPR_FUNCTION real_type value() const { return value_; }
0049
0050
0051 explicit CELER_CONSTEXPR_FUNCTION operator float() const { return value_; }
0052
0053 explicit CELER_CONSTEXPR_FUNCTION operator double() const
0054 {
0055 return value_;
0056 }
0057
0058 private:
0059 real_type value_;
0060 };
0061
0062
0063 CELER_CONSTEXPR_FUNCTION Constant operator-(Constant lhs) noexcept
0064 {
0065 return Constant{-lhs.value()};
0066 }
0067
0068
0069
0070 #define CELER_DEFINE_CONSTANT_CMP(TOKEN) \
0071 template<class T, std::enable_if_t<std::is_floating_point_v<T>, bool> = true> \
0072 CELER_CONSTEXPR_FUNCTION bool operator TOKEN(Constant lhs, T rhs) noexcept \
0073 { \
0074 return static_cast<T>(lhs.value()) TOKEN rhs; \
0075 } \
0076 template<class T, std::enable_if_t<std::is_floating_point_v<T>, bool> = true> \
0077 CELER_CONSTEXPR_FUNCTION bool operator TOKEN(T lhs, Constant rhs) noexcept \
0078 { \
0079 return lhs TOKEN static_cast<T>(rhs.value()); \
0080 } \
0081 template<class T, std::enable_if_t<std::is_integral_v<T>, bool> = true> \
0082 CELER_CONSTEXPR_FUNCTION bool operator TOKEN(Constant lhs, T rhs) noexcept \
0083 { \
0084 return lhs.value() TOKEN static_cast<Constant::real_type>(rhs); \
0085 } \
0086 template<class T, std::enable_if_t<std::is_integral_v<T>, bool> = true> \
0087 CELER_CONSTEXPR_FUNCTION bool operator TOKEN(T lhs, Constant rhs) noexcept \
0088 { \
0089 return static_cast<Constant::real_type>(lhs) TOKEN rhs.value(); \
0090 } \
0091 CELER_CONSTEXPR_FUNCTION bool operator TOKEN(Constant lhs, \
0092 Constant rhs) noexcept \
0093 { \
0094 return lhs.value() TOKEN rhs.value(); \
0095 }
0096
0097
0098
0099 CELER_DEFINE_CONSTANT_CMP(==)
0100 CELER_DEFINE_CONSTANT_CMP(!=)
0101 CELER_DEFINE_CONSTANT_CMP(<)
0102 CELER_DEFINE_CONSTANT_CMP(>)
0103 CELER_DEFINE_CONSTANT_CMP(<=)
0104 CELER_DEFINE_CONSTANT_CMP(>=)
0105
0106
0107 #undef CELER_DEFINE_CONSTANT_CMP
0108
0109
0110
0111 #define CELER_DEFINE_CONSTANT_OP(TOKEN) \
0112 template<class T, std::enable_if_t<std::is_floating_point_v<T>, bool> = true> \
0113 CELER_CONSTEXPR_FUNCTION T operator TOKEN(Constant lhs, T rhs) noexcept \
0114 { \
0115 return static_cast<T>(lhs.value()) TOKEN rhs; \
0116 } \
0117 template<class T, std::enable_if_t<std::is_floating_point_v<T>, bool> = true> \
0118 CELER_CONSTEXPR_FUNCTION T operator TOKEN(T lhs, Constant rhs) noexcept \
0119 { \
0120 return lhs TOKEN static_cast<T>(rhs.value()); \
0121 } \
0122 template<class T, std::enable_if_t<std::is_integral_v<T>, bool> = true> \
0123 CELER_CONSTEXPR_FUNCTION Constant operator TOKEN(Constant lhs, \
0124 T rhs) noexcept \
0125 { \
0126 return Constant{lhs.value() TOKEN rhs}; \
0127 } \
0128 template<class T, std::enable_if_t<std::is_integral_v<T>, bool> = true> \
0129 CELER_CONSTEXPR_FUNCTION Constant operator TOKEN(T lhs, \
0130 Constant rhs) noexcept \
0131 { \
0132 return Constant{lhs TOKEN rhs.value()}; \
0133 } \
0134 CELER_CONSTEXPR_FUNCTION Constant operator TOKEN(Constant lhs, \
0135 Constant rhs) noexcept \
0136 { \
0137 return Constant{lhs.value() TOKEN rhs.value()}; \
0138 }
0139
0140 CELER_DEFINE_CONSTANT_OP(*)
0141 CELER_DEFINE_CONSTANT_OP(/)
0142 CELER_DEFINE_CONSTANT_OP(+)
0143 CELER_DEFINE_CONSTANT_OP(-)
0144
0145
0146 #undef CELER_DEFINE_CONSTANT_OP
0147
0148
0149
0150 #define CELER_DEFINE_CONSTANT_OP(TOKEN) \
0151 template<class T, std::enable_if_t<std::is_floating_point_v<T>, bool> = true> \
0152 CELER_CONSTEXPR_FUNCTION T& operator TOKEN(T & lhs, Constant rhs) noexcept \
0153 { \
0154 return lhs TOKEN static_cast<T>(rhs.value()); \
0155 }
0156
0157 CELER_DEFINE_CONSTANT_OP(*=)
0158 CELER_DEFINE_CONSTANT_OP(/=)
0159 CELER_DEFINE_CONSTANT_OP(+=)
0160 CELER_DEFINE_CONSTANT_OP(-=)
0161
0162
0163 #undef CELER_DEFINE_CONSTANT_OP
0164
0165
0166
0167 }