Description
Replace the PdmValueFieldSpecialization<T> policy class pattern with ADL-based free functions (pdmToVariant / pdmFromVariant / pdmVariantEqual). This removes the centralized cafInternal* specialization header and allows each type to declare its own serialization next to its own declaration. It also eliminates the two redundant base classes and fixes the incorrect isEqual implementations inherited from PdmValueFieldSpecializationDefaults.
ADL design
// Default implementations — work for any Qt-metatype-registered type
namespace caf {
template <typename T>
QVariant pdmToVariant( const T& value ) { return QVariant::fromValue( value ); }
template <typename T>
void pdmFromVariant( const QVariant& v, T& out ) { out = v.value<T>(); }
template <typename T>
bool pdmVariantEqual( const QVariant& a, const QVariant& b ) { return a.value<T>() == b.value<T>(); }
}
Each type provides overloads in its own header. PdmDataValueField and PdmProxyValueField call these via using caf::pdmToVariant to enable ADL. pdmVariantEqual uses if constexpr to handle containers, PdmPointer, and AppEnum, with full specializations for FilePath, float, double, and cvf types.
Steps
Files affected
Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmFieldTraits.h (new)
Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafInternalPdmValueFieldSpecializations.h (deleted)
Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmDataValueField.h
Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmProxyValueField.h
Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafInternalPdmFieldTypeSpecializations.h
Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafInternalPdmUiFieldCapability.inl
Fwk/AppFwk/cafPdmCvf/cafPdmCoreVec3d.h
Fwk/AppFwk/cafPdmCvf/cafPdmCoreMat4d.h
Fwk/AppFwk/cafPdmCvf/cafPdmCoreColor3f.h
Fwk/AppFwk/cafPdmCvf/cafPdmMat3d/cafPdmCoreMat3d.h
Description
Replace the
PdmValueFieldSpecialization<T>policy class pattern with ADL-based free functions (pdmToVariant/pdmFromVariant/pdmVariantEqual). This removes the centralizedcafInternal*specialization header and allows each type to declare its own serialization next to its own declaration. It also eliminates the two redundant base classes and fixes the incorrectisEqualimplementations inherited fromPdmValueFieldSpecializationDefaults.ADL design
Each type provides overloads in its own header.
PdmDataValueFieldandPdmProxyValueFieldcall these viausing caf::pdmToVariantto enable ADL.pdmVariantEqualusesif constexprto handle containers, PdmPointer, and AppEnum, with full specializations for FilePath, float, double, and cvf types.Steps
cafPdmFieldTraits.hwith defaultpdmToVariant/pdmFromVariant/pdmVariantEqual— commit1ecc456AppEnum<T>incafPdmFieldTraits.h— commit1ecc456FilePathincafPdmFieldTraits.h— commit1ecc456std::vector<T>(delegating element-wise topdmVariantEqual) — commit1ecc456std::pair<T,U>— commit1ecc456PdmPointer<T>— commit1ecc456floatanddouble(pdmVariantEqualwith epsilon) — commit1ecc456cvf::Vec3d,cvf::Mat4d,cvf::Color3f,cvf::Mat3din their respectivecafPdmCvfheaders — commit77e5b03PdmDataValueFieldandPdmProxyValueFieldto call the free functions — commitf02fbeecafInternalPdmFieldTypeSpecializations.h,cafInternalPdmUiFieldCapability.inl) to call free functions — commit411b98f77e5b03,f02fbee,1ffbc4bcafInternalPdmValueFieldSpecializations.hand updateCMakeLists.txt— commit1ffbc4bFiles affected
Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmFieldTraits.h(new)Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafInternalPdmValueFieldSpecializations.h(deleted)Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmDataValueField.hFwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmProxyValueField.hFwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafInternalPdmFieldTypeSpecializations.hFwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafInternalPdmUiFieldCapability.inlFwk/AppFwk/cafPdmCvf/cafPdmCoreVec3d.hFwk/AppFwk/cafPdmCvf/cafPdmCoreMat4d.hFwk/AppFwk/cafPdmCvf/cafPdmCoreColor3f.hFwk/AppFwk/cafPdmCvf/cafPdmMat3d/cafPdmCoreMat3d.h