@@ -60,6 +60,13 @@ static_assert(sizeof(1ull) == 8);
6060#error "Compiler does not support __int128"
6161#endif
6262
63+ #ifndef IGNOREUNDEFINED
64+ #define UNDEFINED_VALUE_ERROR (s ) throw UndefinedValueError (s)
65+ #else
66+ #define UNDEFINED_VALUE_ERROR (s )
67+ #endif
68+
69+
6370namespace udb {
6471
6572 // helper to find the max of N unsigned values at compile time
@@ -694,6 +701,10 @@ namespace udb {
694701 }
695702 }
696703
704+ constexpr std::conditional_t <Signed, SignedStorageType, const StorageType &> get_ignore_unknown () const {
705+ return m_val;
706+ }
707+
697708 constexpr const _Bits& to_defined () const { return *this ; }
698709
699710 // cast to other Bits types
@@ -2408,27 +2419,25 @@ namespace udb {
24082419 constexpr operator BitsType<M, _Signed>() const {
24092420 if constexpr (!BitsType<M, _Signed>::PossiblyUnknown) {
24102421 if (m_unknown_mask != 0 ) {
2411- throw UndefinedValueError (" Cannot convert value with unknowns to Bits type" );
2422+ UNDEFINED_VALUE_ERROR (" Cannot convert value with unknowns to Bits type" );
24122423 }
24132424 }
24142425 return BitsType<M, _Signed>{*this };
24152426 }
24162427
24172428 template <typename T = std::conditional_t <Signed, SignedStorageType, StorageType>>
24182429 constexpr T get () const {
2419- if (m_unknown_mask == 0_b) {
2420- return m_val.get ();
2421- } else {
2422- throw UndefinedValueError (" Cannot convert value with unknowns to a native C++ type" );
2430+ if (m_unknown_mask != 0_b) {
2431+ UNDEFINED_VALUE_ERROR (" Cannot convert value with unknowns to a native C++ type" );
24232432 }
2433+ return m_val.get ();
24242434 }
24252435
24262436 constexpr _Bits<N, Signed> to_defined () const {
2427- if (m_unknown_mask == 0_b) {
2428- return m_val;
2429- } else {
2430- throw UndefinedValueError (" Cannot convert value with unknowns to a defined type" );
2437+ if (m_unknown_mask != 0_b) {
2438+ UNDEFINED_VALUE_ERROR (" Cannot convert value with unknowns to a defined type" );
24312439 }
2440+ return m_val;
24322441 }
24332442
24342443
@@ -2480,7 +2489,7 @@ namespace udb {
24802489 constexpr bool operator op (const BitsType<M, _Signed> &rhs) const { \
24812490 if (m_unknown_mask != 0_b || \
24822491 (BitsType<M, _Signed>::PossiblyUnknown && (rhs.unknown_mask () != 0_b))) { \
2483- throw UndefinedValueError (" Cannot compare unknown value" ); \
2492+ UNDEFINED_VALUE_ERROR (" Cannot compare unknown value" ); \
24842493 } \
24852494 return get () op rhs.to_defined ().get (); \
24862495 }
@@ -2626,7 +2635,7 @@ namespace udb {
26262635 constexpr _PossiblyUnknownBits operator <<(const BitsType<M, false > &shamt) const {
26272636 if constexpr (BitsType<M, false >::PossiblyUnknown) {
26282637 if (shamt.unknown_mask () != 0_b) {
2629- throw UndefinedValueError (" Cannot shift an unknown amount" );
2638+ UNDEFINED_VALUE_ERROR (" Cannot shift an unknown amount" );
26302639 }
26312640 }
26322641 if (shamt.get () >= N) {
@@ -2641,7 +2650,7 @@ namespace udb {
26412650 constexpr _PossiblyUnknownBits operator >>(const BitsClass<M, false > &shamt) const {
26422651 if constexpr (BitsClass<M, false >::PossiblyUnknown) {
26432652 if (shamt.unknown_mask () != 0_b) {
2644- throw UndefinedValueError (" Cannot shift an unknown amount" );
2653+ UNDEFINED_VALUE_ERROR (" Cannot shift an unknown amount" );
26452654 }
26462655 }
26472656 if (shamt.get () >= N) {
@@ -2656,7 +2665,7 @@ namespace udb {
26562665 constexpr _PossiblyUnknownBits sra (const BitsClass<M, false > &shamt) const {
26572666 if constexpr (BitsClass<M, false >::PossiblyUnknown) {
26582667 if (shamt.unknown_mask () != 0_b) {
2659- throw UndefinedValueError (" Cannot shift an unknown amount" );
2668+ UNDEFINED_VALUE_ERROR (" Cannot shift an unknown amount" );
26602669 }
26612670 }
26622671 if (shamt.get () >= N) {
@@ -2715,7 +2724,7 @@ namespace udb {
27152724 _Bits<constmax_v<N, RhsN> + 1 , Signed> lhs{*this };
27162725
27172726 if (m_unknown_mask != 0_b || _rhs.unknown_mask () != 0_b) {
2718- throw UndefinedValueError (" Addition is not defined on undefined values" );
2727+ UNDEFINED_VALUE_ERROR (" Addition is not defined on undefined values" );
27192728 }
27202729
27212730 if constexpr (RhsBitsType<RhsN, RhsSigned>::RuntimeWidth) {
@@ -2738,7 +2747,7 @@ namespace udb {
27382747 _Bits<constmax_v<N, RhsN> + 1 , Signed> lhs{*this };
27392748
27402749 if (m_unknown_mask != 0_b || _rhs.unknown_mask () != 0_b) {
2741- throw UndefinedValueError (" Addition is not defined on undefined values" );
2750+ UNDEFINED_VALUE_ERROR (" Addition is not defined on undefined values" );
27422751 }
27432752
27442753 if constexpr (RhsBitsType<RhsN, RhsSigned>::RuntimeWidth) {
@@ -2767,7 +2776,7 @@ namespace udb {
27672776 _Bits<addsat_v<N, RhsN>, Signed> lhs{*this };
27682777
27692778 if (m_unknown_mask != 0_b || _rhs.unknown_mask () != 0_b) {
2770- throw UndefinedValueError (" Addition is not defined on undefined values" );
2779+ UNDEFINED_VALUE_ERROR (" Addition is not defined on undefined values" );
27712780 }
27722781
27732782 if constexpr (RhsBitsType<RhsN, RhsSigned>::RuntimeWidth) {
@@ -3171,7 +3180,7 @@ namespace udb {
31713180 m_val, result_width};
31723181
31733182 if (unknown_mask () != 0_b || other.unknown_mask () != 0_b) {
3174- throw UndefinedValueError (" Multiplication not defined on undefined values" );
3183+ UNDEFINED_VALUE_ERROR (" Multiplication not defined on undefined values" );
31753184 }
31763185
31773186 if constexpr (RhsBitsType<addsat_v<MaxN, RhsN>, RhsSigned>::RuntimeWidth) {
@@ -3194,7 +3203,7 @@ namespace udb {
31943203 m_val, result_width};
31953204
31963205 if (unknown_mask () != 0_b || other.unknown_mask () != 0_b) {
3197- throw UndefinedValueError (" Addition not defined on undefined values" );
3206+ UNDEFINED_VALUE_ERROR (" Addition not defined on undefined values" );
31983207 }
31993208
32003209 if constexpr (RhsBitsType<constmax_v<MaxN, RhsN> + 1 , RhsSigned>::RuntimeWidth) {
@@ -3217,7 +3226,7 @@ namespace udb {
32173226 m_val, result_width};
32183227
32193228 if (unknown_mask () != 0_b || other.unknown_mask () != 0_b) {
3220- throw UndefinedValueError (" Subtraction not defined on undefined values" );
3229+ UNDEFINED_VALUE_ERROR (" Subtraction not defined on undefined values" );
32213230 }
32223231
32233232 if constexpr (RhsBitsType<constmax_v<MaxN, RhsN> + 1 , RhsSigned>::RuntimeWidth) {
@@ -3467,7 +3476,7 @@ struct fmt::formatter<BitsClass<N, Signed>>
34673476 : formatter<typename BitsClass<N, Signed>::StorageType> {
34683477 template <typename CONTEXT_TYPE>
34693478 auto format (BitsClass<N, Signed> value, CONTEXT_TYPE &ctx) const {
3470- return fmt::formatter<typename BitsClass<N, Signed>::StorageType>::format (value.get (), ctx);
3479+ return fmt::formatter<typename BitsClass<N, Signed>::StorageType>::format (value.get_ignore_unknown (), ctx);
34713480 }
34723481};
34733482
0 commit comments