@@ -545,15 +545,27 @@ template <typename T>
545545constexpr auto unchecked_mod (T lhs, T rhs) -> policy::value::decision<T> {
546546 policy::value::decision<T> out{};
547547 out.has_value = true ;
548- out.value = static_cast <T>(lhs % rhs);
548+
549+ if constexpr (requires { lhs % rhs; }) {
550+ out.value = static_cast <T>(lhs % rhs);
551+ return out;
552+ }
553+
554+ out.value = T{};
549555 return out;
550556}
551557
552558template <typename T>
553559constexpr auto unchecked_shift_left (T lhs, T rhs) -> policy::value::decision<T> {
554560 policy::value::decision<T> out{};
555561 out.has_value = true ;
556- out.value = static_cast <T>(lhs << rhs);
562+
563+ if constexpr (requires { lhs << rhs; }) {
564+ out.value = static_cast <T>(lhs << rhs);
565+ return out;
566+ }
567+
568+ out.value = T{};
557569 return out;
558570}
559571
@@ -562,55 +574,97 @@ constexpr auto unchecked_shift_right(T lhs, T rhs)
562574 -> policy::value::decision<T> {
563575 policy::value::decision<T> out{};
564576 out.has_value = true ;
565- out.value = static_cast <T>(lhs >> rhs);
577+
578+ if constexpr (requires { lhs >> rhs; }) {
579+ out.value = static_cast <T>(lhs >> rhs);
580+ return out;
581+ }
582+
583+ out.value = T{};
566584 return out;
567585}
568586
569587template <typename T>
570588constexpr auto unchecked_bit_and (T lhs, T rhs) -> policy::value::decision<T> {
571589 policy::value::decision<T> out{};
572590 out.has_value = true ;
573- out.value = static_cast <T>(lhs & rhs);
591+
592+ if constexpr (requires { lhs & rhs; }) {
593+ out.value = static_cast <T>(lhs & rhs);
594+ return out;
595+ }
596+
597+ out.value = T{};
574598 return out;
575599}
576600
577601template <typename T>
578602constexpr auto unchecked_bit_or (T lhs, T rhs) -> policy::value::decision<T> {
579603 policy::value::decision<T> out{};
580604 out.has_value = true ;
581- out.value = static_cast <T>(lhs | rhs);
605+
606+ if constexpr (requires { lhs | rhs; }) {
607+ out.value = static_cast <T>(lhs | rhs);
608+ return out;
609+ }
610+
611+ out.value = T{};
582612 return out;
583613}
584614
585615template <typename T>
586616constexpr auto unchecked_bit_xor (T lhs, T rhs) -> policy::value::decision<T> {
587617 policy::value::decision<T> out{};
588618 out.has_value = true ;
589- out.value = static_cast <T>(lhs ^ rhs);
619+
620+ if constexpr (requires { lhs ^ rhs; }) {
621+ out.value = static_cast <T>(lhs ^ rhs);
622+ return out;
623+ }
624+
625+ out.value = T{};
590626 return out;
591627}
592628
593629template <typename T>
594630constexpr auto unchecked_bit_not (T lhs) -> policy::value::decision<T> {
595631 policy::value::decision<T> out{};
596632 out.has_value = true ;
597- out.value = static_cast <T>(~lhs);
633+
634+ if constexpr (requires { ~lhs; }) {
635+ out.value = static_cast <T>(~lhs);
636+ return out;
637+ }
638+
639+ out.value = T{};
598640 return out;
599641}
600642
601643template <typename T>
602644constexpr auto unchecked_unary_plus (T lhs) -> policy::value::decision<T> {
603645 policy::value::decision<T> out{};
604646 out.has_value = true ;
605- out.value = static_cast <T>(+lhs);
647+
648+ if constexpr (requires { +lhs; }) {
649+ out.value = static_cast <T>(+lhs);
650+ return out;
651+ }
652+
653+ out.value = T{};
606654 return out;
607655}
608656
609657template <typename T>
610658constexpr auto unchecked_unary_minus (T lhs) -> policy::value::decision<T> {
611659 policy::value::decision<T> out{};
612660 out.has_value = true ;
613- out.value = static_cast <T>(-lhs);
661+
662+ if constexpr (requires { -lhs; }) {
663+ out.value = static_cast <T>(-lhs);
664+ return out;
665+ }
666+
667+ out.value = T{};
614668 return out;
615669}
616670
0 commit comments