// // Copyright 2016 Pixar // // Licensed under the Apache License, Version 2.0 (the "Apache License") // with the following modification; you may not use this file except in // compliance with the Apache License and the following modification to it: // Section 6. Trademarks. is deleted and replaced with: // // 6. Trademarks. This License does not grant permission to use the trade // names, trademarks, service marks, or product names of the Licensor // and its affiliates, except as required to comply with Section 4(c) of // the License and to reproduce the content of the NOTICE file. // // You may obtain a copy of the Apache License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the Apache License with the above modification is // distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the Apache License for the specific // language governing permissions and limitations under the Apache License. // #include "pxr/pxr.h" #include "pxr/usd/sdf/children.h" #include "pxr/usd/sdf/attributeSpec.h" #include "pxr/usd/sdf/childrenPolicies.h" #include "pxr/usd/sdf/childrenUtils.h" #include "pxr/usd/sdf/layer.h" #include "pxr/usd/sdf/primSpec.h" #include "pxr/usd/sdf/propertySpec.h" #include "pxr/usd/sdf/relationshipSpec.h" #include "pxr/usd/sdf/variantSetSpec.h" #include "pxr/usd/sdf/variantSpec.h" #include "pxr/base/tf/ostreamMethods.h" PXR_NAMESPACE_OPEN_SCOPE template Sdf_Children::Sdf_Children() : _childNamesValid(false) { } template Sdf_Children::Sdf_Children(const Sdf_Children &other) : _layer(other._layer), _parentPath(other._parentPath), _childrenKey(other._childrenKey), _keyPolicy(other._keyPolicy), _childNamesValid(false) { } template Sdf_Children::Sdf_Children(const SdfLayerHandle &layer, const SdfPath &parentPath, const TfToken &childrenKey, const KeyPolicy& keyPolicy) : _layer(layer), _parentPath(parentPath), _childrenKey(childrenKey), _keyPolicy(keyPolicy), _childNamesValid(false) { } template size_t Sdf_Children::GetSize() const { _UpdateChildNames(); return _childNames.size(); } template typename Sdf_Children::ValueType Sdf_Children::GetChild(size_t index) const { if (!TF_VERIFY(IsValid())) { return ValueType(); } _UpdateChildNames(); // XXX: Would like to avoid unnecessary dynamic_casts... SdfPath childPath = ChildPolicy::GetChildPath(_parentPath, _childNames[index]); return TfDynamic_cast(_layer->GetObjectAtPath(childPath)); } template bool Sdf_Children::IsValid() const { // XXX: Should we also check for the existence of the spec? return _layer && !_parentPath.IsEmpty(); } template size_t Sdf_Children::Find(const KeyType &key) const { if (!TF_VERIFY(IsValid())) { return 0; } _UpdateChildNames(); const FieldType expectedKey(_keyPolicy.Canonicalize(key)); size_t i = 0; for (i=0; i < _childNames.size(); i++) { if (_childNames[i] == expectedKey) { break; } } return i; } template typename Sdf_Children::KeyType Sdf_Children::FindKey(const ValueType &x) const { if (!TF_VERIFY(IsValid())) { return KeyType(); } // If the value is invalid or does not belong to this layer, // then return a default-constructed key. if (!x || x->GetLayer() != _layer) { return KeyType(); } // If the value's path is not a child path of the parent path, // then return a default-constructed key. if (ChildPolicy::GetParentPath(x->GetPath()) != _parentPath) { return KeyType(); } return ChildPolicy::GetKey(x); } template bool Sdf_Children::IsEqualTo(const Sdf_Children &other) const { // Return true if this and other refer to the same set of children // on the same object in the same layer. return (_layer == other._layer && _parentPath == other._parentPath && _childrenKey == other._childrenKey); } template bool Sdf_Children::Copy( const std::vector & values, const std::string &type) { _childNamesValid = false; if (!TF_VERIFY(IsValid())) { return false; } return Sdf_ChildrenUtils::SetChildren( _layer, _parentPath, values); } template bool Sdf_Children::Insert(const ValueType& value, size_t index, const std::string &type) { _childNamesValid = false; if (!TF_VERIFY(IsValid())) { return false; } return Sdf_ChildrenUtils::InsertChild( _layer, _parentPath, value, index); } template bool Sdf_Children::Erase(const KeyType& key, const std::string &type) { _childNamesValid = false; if (!TF_VERIFY(IsValid())) { return false; } const FieldType expectedKey(_keyPolicy.Canonicalize(key)); return Sdf_ChildrenUtils::RemoveChild( _layer, _parentPath, expectedKey); } template void Sdf_Children::_UpdateChildNames() const { if (_childNamesValid) { return; } _childNamesValid = true; if (_layer) { _childNames = _layer->GetFieldAs >( _parentPath, _childrenKey); } else { _childNames.clear(); } } template class Sdf_Children; template class Sdf_Children; template class Sdf_Children; template class Sdf_Children; template class Sdf_Children; template class Sdf_Children; template class Sdf_Children; template class Sdf_Children; PXR_NAMESPACE_CLOSE_SCOPE