Lunderberg commented on code in PR #16183:
URL: https://github.com/apache/tvm/pull/16183#discussion_r1409869092
##########
include/tvm/runtime/packed_func.h:
##########
@@ -2035,46 +2167,100 @@ inline TObjectRef TVMPODValue_::AsObjectRef() const {
ICHECK(!checked_type.defined()) << "Expected " <<
ObjectTypeChecker<TObjectRef>::TypeName()
<< ", but got " << checked_type.value();
return TObjectRef(GetObjectPtr<Object>(ptr));
- } else if (std::is_base_of<ContainerType, NDArray::ContainerType>::value &&
- type_code_ == kTVMNDArrayHandle) {
- // Casting to a base class that NDArray can sub-class
- ObjectPtr<Object> data =
-
NDArray::FFIDataFromHandle(static_cast<TVMArrayHandle>(value_.v_handle));
- return TObjectRef(data);
- } else if (std::is_base_of<ContainerType, Module::ContainerType>::value &&
- type_code_ == kTVMModuleHandle) {
- // Casting to a base class that Module can sub-class
- return
TObjectRef(GetObjectPtr<Object>(static_cast<Object*>(value_.v_handle)));
- } else if (std::is_base_of<ContainerType, PackedFunc::ContainerType>::value
&&
- type_code_ == kTVMPackedFuncHandle) {
- // Casting to a base class that PackedFunc can sub-class
- return
TObjectRef(GetObjectPtr<Object>(static_cast<Object*>(value_.v_handle)));
- } else {
- TVM_CHECK_TYPE_CODE(type_code_, kTVMObjectHandle);
- return TObjectRef(ObjectPtr<Object>(nullptr));
}
+
+ if constexpr (std::is_base_of_v<ContainerType, NDArray::ContainerType>) {
+ if (type_code_ == kTVMNDArrayHandle) {
+ // Casting to a base class that NDArray can sub-class
+ ObjectPtr<Object> data =
+
NDArray::FFIDataFromHandle(static_cast<TVMArrayHandle>(value_.v_handle));
+ return TObjectRef(data);
+ }
+ }
+
+ if constexpr (std::is_base_of_v<ContainerType, Module::ContainerType>) {
+ if (type_code_ == kTVMModuleHandle) {
+ // Casting to a base class that Module can sub-class
+ return
TObjectRef(GetObjectPtr<Object>(static_cast<Object*>(value_.v_handle)));
+ }
+ }
+
+ if constexpr (std::is_base_of_v<ContainerType, PackedFunc::ContainerType>) {
+ if (type_code_ == kTVMPackedFuncHandle) {
+ // Casting to a base class that PackedFunc can sub-class
+ return
TObjectRef(GetObjectPtr<Object>(static_cast<Object*>(value_.v_handle)));
+ }
+ }
+
+ if constexpr (std::is_base_of_v<TObjectRef, BoxInt>) {
+ if (type_code_ == kTVMArgInt) {
+ return BoxInt(value_.v_int64);
+ }
+ }
+
+ if constexpr (std::is_base_of_v<TObjectRef, BoxFloat>) {
+ if (type_code_ == kTVMArgFloat) {
+ return BoxFloat(value_.v_float64);
+ }
+ }
+
+ if constexpr (std::is_base_of_v<TObjectRef, String>) {
+ if (type_code_ == kTVMStr) {
+ return String(value_.v_str);
+ }
+ }
+
+ TVM_CHECK_TYPE_CODE(type_code_, kTVMObjectHandle);
+ return TObjectRef(ObjectPtr<Object>(nullptr));
}
template <typename TObjectRef, typename>
inline TVMRetValue& TVMRetValue::operator=(TObjectRef other) {
using ContainerType = typename TObjectRef::ContainerType;
const Object* ptr = other.get();
- if (ptr != nullptr) {
- if (std::is_base_of<NDArray::ContainerType, ContainerType>::value ||
- (std::is_base_of<ContainerType, NDArray::ContainerType>::value &&
- ptr->IsInstance<NDArray::ContainerType>())) {
+
+ if constexpr (std::is_base_of_v<ContainerType, NDArray::ContainerType> ||
+ std::is_base_of_v<NDArray::ContainerType, ContainerType>) {
+ if (ptr && (std::is_base_of_v<NDArray::ContainerType, ContainerType> ||
Review Comment:
I mainly restructured it in order to make sure the `if constexpr` checks
were on the outermost conditional, so that they would be guaranteed to be
applied to the entire contents. I agree on the readability and repetition
though, and will take a look to see if there's a way to make it more readable
overall.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]