Skip to content

Commit 5e85b09

Browse files
refactor: Enhance unchecked operations with constexpr checks for type compatibility
Signed-off-by: FrozenlemonTee <1115306170@qq.com>
1 parent 90dd070 commit 5e85b09

1 file changed

Lines changed: 63 additions & 9 deletions

File tree

src/operations/invoker.cppm

Lines changed: 63 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -545,15 +545,27 @@ template <typename T>
545545
constexpr 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

552558
template <typename T>
553559
constexpr 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

569587
template <typename T>
570588
constexpr 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

577601
template <typename T>
578602
constexpr 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

585615
template <typename T>
586616
constexpr 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

593629
template <typename T>
594630
constexpr 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

601643
template <typename T>
602644
constexpr 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

609657
template <typename T>
610658
constexpr 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

Comments
 (0)