tqchen commented on code in PR #16183:
URL: https://github.com/apache/tvm/pull/16183#discussion_r1409880559
##########
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:
actually i have a quick question, can we do the follows?
```c++
if (ptr != nullptr) {
if constexpr (condition) {
}
}
```
I feel it should still allow compiler to eliminate the content and would be
equivalent. the main reason to put `ptr != nullptr` first is that it is a more
likely path
--
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]