static void _ProcessChildren( const TfToken& childrenField, const VtValue& srcChildrenValue, const VtValue& dstChildrenValue, const SdfLayerHandle& srcLayer, const SdfPath& srcPath, bool childrenInSrc, const SdfLayerHandle& dstLayer, const SdfPath& dstPath, bool childrenInDst, _CopyStack* copyStack) { typedef typename ChildPolicy::FieldType FieldType; typedef std::vector<FieldType> ChildrenVector; if (!TF_VERIFY(srcChildrenValue.IsHolding<ChildrenVector>() || srcChildrenValue.IsEmpty()) || !TF_VERIFY(dstChildrenValue.IsHolding<ChildrenVector>() || dstChildrenValue.IsEmpty())) { return; } const ChildrenVector emptyChildren; const ChildrenVector& srcChildren = srcChildrenValue.IsEmpty() ? emptyChildren : srcChildrenValue.UncheckedGet<ChildrenVector>(); const ChildrenVector& dstChildren = dstChildrenValue.IsEmpty() ? emptyChildren : dstChildrenValue.UncheckedGet<ChildrenVector>(); for (size_t i = 0; i < srcChildren.size(); ++i) { if (srcChildren[i].IsEmpty() || dstChildren[i].IsEmpty()) { continue; } const SdfPath srcChildPath = ChildPolicy::GetChildPath(srcPath, srcChildren[i]); const SdfPath dstChildPath = ChildPolicy::GetChildPath(dstPath, dstChildren[i]); copyStack->emplace_back(srcChildPath, dstChildPath); } // Add entries to the copy stack to mark the removal of child specs // in the destination layer that aren't included in the list of children // to copy. if (childrenInDst) { const VtValue oldDstChildrenValue = dstLayer->GetField(dstPath, childrenField); if (!TF_VERIFY(oldDstChildrenValue.IsHolding<ChildrenVector>())) { return; } for (const auto& oldDstChild : oldDstChildrenValue.UncheckedGet<ChildrenVector>()) { if (std::find(dstChildren.begin(), dstChildren.end(), oldDstChild) == dstChildren.end()) { const SdfPath oldDstChildPath = ChildPolicy::GetChildPath(dstPath, oldDstChild); copyStack->emplace_back(SdfPath(), oldDstChildPath); } } } }
// Add a (field, value) entry to the list of fields to copy as directed by // the given policy. The value may be empty to indicate that the field // should be removed from the destination. static void _AddFieldValueToCopy( SdfSpecType specType, const TfToken& field, const SdfLayerHandle& srcLayer, const SdfPath& srcPath, bool fieldInSrc, const SdfLayerHandle& dstLayer, const SdfPath& dstPath, bool fieldInDst, const SdfShouldCopyValueFn& shouldCopyValue, _FieldValueList* valueList) { boost::optional<VtValue> value; if (shouldCopyValue( specType, field, srcLayer, srcPath, fieldInSrc, dstLayer, dstPath, fieldInDst, &value)) { valueList->emplace_back( field, value ? *value : srcLayer->GetField(srcPath, field)); } }
static void _ProcessChildField( const TfToken& childField, const SdfLayerHandle& srcLayer, const SdfPath& srcPath, bool childrenInSrc, const SdfLayerHandle& dstLayer, const SdfPath& dstPath, bool childrenInDst, const SdfShouldCopyChildrenFn& shouldCopyChildren, _CopyStack* copyStack) { boost::optional<VtValue> srcChildrenToCopy, dstChildrenToCopy; if (!shouldCopyChildren( childField, srcLayer, srcPath, childrenInSrc, dstLayer, dstPath, childrenInDst, &srcChildrenToCopy, &dstChildrenToCopy)) { return; } if (!srcChildrenToCopy || !dstChildrenToCopy) { srcChildrenToCopy = srcLayer->GetField(srcPath, childField); dstChildrenToCopy = srcChildrenToCopy; } const VtValue& srcChildren = *srcChildrenToCopy; const VtValue& dstChildren = *dstChildrenToCopy; if (childField == SdfChildrenKeys->ConnectionChildren) { _ProcessChildren<Sdf_AttributeConnectionChildPolicy>( childField, srcChildren, dstChildren, srcLayer, srcPath, childrenInSrc, dstLayer, dstPath, childrenInDst, copyStack); return; } if (childField == SdfChildrenKeys->MapperChildren) { _ProcessChildren<Sdf_MapperChildPolicy>( childField, srcChildren, dstChildren, srcLayer, srcPath, childrenInSrc, dstLayer, dstPath, childrenInDst, copyStack); return; } if (childField == SdfChildrenKeys->MapperArgChildren) { _ProcessChildren<Sdf_MapperArgChildPolicy>( childField, srcChildren, dstChildren, srcLayer, srcPath, childrenInSrc, dstLayer, dstPath, childrenInDst, copyStack); return; } if (childField == SdfChildrenKeys->ExpressionChildren) { _ProcessChildren<Sdf_ExpressionChildPolicy>( childField, srcChildren, dstChildren, srcLayer, srcPath, childrenInSrc, dstLayer, dstPath, childrenInDst, copyStack); return; } if (childField == SdfChildrenKeys->RelationshipTargetChildren) { _ProcessChildren<Sdf_RelationshipTargetChildPolicy>( childField, srcChildren, dstChildren, srcLayer, srcPath, childrenInSrc, dstLayer, dstPath, childrenInDst, copyStack); return; } if (childField == SdfChildrenKeys->VariantChildren) { _ProcessChildren<Sdf_VariantChildPolicy>( childField, srcChildren, dstChildren, srcLayer, srcPath, childrenInSrc, dstLayer, dstPath, childrenInDst, copyStack); return; } if (childField == SdfChildrenKeys->VariantSetChildren) { _ProcessChildren<Sdf_VariantSetChildPolicy>( childField, srcChildren, dstChildren, srcLayer, srcPath, childrenInSrc, dstLayer, dstPath, childrenInDst, copyStack); return; } if (childField == SdfChildrenKeys->PropertyChildren) { _ProcessChildren<Sdf_PropertyChildPolicy>( childField, srcChildren, dstChildren, srcLayer, srcPath, childrenInSrc, dstLayer, dstPath, childrenInDst, copyStack); return; } if (childField == SdfChildrenKeys->PrimChildren) { _ProcessChildren<Sdf_PrimChildPolicy>( childField, srcChildren, dstChildren, srcLayer, srcPath, childrenInSrc, dstLayer, dstPath, childrenInDst, copyStack); return; } TF_CODING_ERROR("Unknown child field '%s'", childField.GetText()); }