File indexing completed on 2025-09-15 09:06:16
0001
0002
0003
0004
0005
0006
0007
0008 #pragma once
0009
0010 #include "corecel/Macros.hh"
0011 #include "corecel/cont/Bitset.hh"
0012
0013 #include "OrangeTypes.hh"
0014
0015 namespace celeritas
0016 {
0017
0018
0019
0020
0021
0022
0023 CELER_CONSTEXPR_FUNCTION Sense to_sense(bool s)
0024 {
0025 return static_cast<Sense>(s);
0026 }
0027
0028
0029
0030
0031
0032 [[nodiscard]] CELER_CONSTEXPR_FUNCTION Sense flip_sense(Sense orig)
0033 {
0034 return static_cast<Sense>(!static_cast<bool>(orig));
0035 }
0036
0037
0038
0039
0040
0041 [[nodiscard]] CELER_CONSTEXPR_FUNCTION SignedSense flip_sense(SignedSense orig)
0042 {
0043 using IntT = std::underlying_type_t<SignedSense>;
0044 return static_cast<SignedSense>(-static_cast<IntT>(orig));
0045 }
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067 [[nodiscard]] CELER_CONSTEXPR_FUNCTION SignedSense
0068 real_to_sense(real_type quadric)
0069 {
0070 return static_cast<SignedSense>(!(quadric <= 0) - (quadric < 0));
0071 }
0072
0073
0074
0075
0076
0077 CELER_CONSTEXPR_FUNCTION Sense to_sense(SignedSense s)
0078 {
0079 return Sense(static_cast<int>(s) >= 0);
0080 }
0081
0082
0083
0084
0085
0086 CELER_CONSTEXPR_FUNCTION SurfaceState to_surface_state(SignedSense s)
0087 {
0088 return s == SignedSense::on ? SurfaceState::on : SurfaceState::off;
0089 }
0090
0091
0092
0093
0094
0095 inline constexpr char to_char(Sense s)
0096 {
0097 return s == Sense::inside ? '-' : '+';
0098 }
0099
0100
0101 inline char const* to_cstring(SignedSense s)
0102 {
0103 switch (s)
0104 {
0105 case SignedSense::inside:
0106 return "inside";
0107 case SignedSense::on:
0108 return "on";
0109 case SignedSense::outside:
0110 return "outside";
0111 }
0112 return "<invalid>";
0113 }
0114
0115
0116
0117
0118
0119
0120
0121 class SenseValue
0122 {
0123 private:
0124 enum : char
0125 {
0126 sense_bit,
0127 is_assigned_bit,
0128 };
0129
0130 public:
0131 constexpr SenseValue() = default;
0132
0133
0134 CELER_CONSTEXPR_FUNCTION SenseValue(Sense sense)
0135 {
0136 sense_[sense_bit] = static_cast<bool>(sense);
0137 sense_[is_assigned_bit] = true;
0138 }
0139
0140
0141 CELER_CONSTEXPR_FUNCTION operator Sense() const
0142 {
0143 return to_sense(sense_[sense_bit]);
0144 }
0145
0146
0147 CELER_CONSTEXPR_FUNCTION explicit operator bool() const
0148 {
0149 return sense_[sense_bit];
0150 }
0151
0152
0153 CELER_CONSTEXPR_FUNCTION SenseValue& operator=(Sense sense)
0154 {
0155 sense_[sense_bit] = static_cast<bool>(sense);
0156 sense_[is_assigned_bit] = true;
0157 return *this;
0158 }
0159
0160
0161 CELER_CONSTEXPR_FUNCTION bool is_assigned() const
0162 {
0163 return sense_[is_assigned_bit];
0164 }
0165
0166
0167 CELER_CONSTEXPR_FUNCTION void clear() { sense_.reset(); }
0168
0169 private:
0170 Bitset<2> sense_;
0171 };
0172
0173 }