HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
changeList.h
Go to the documentation of this file.
1 //
2 // Copyright 2016 Pixar
3 //
4 // Licensed under the Apache License, Version 2.0 (the "Apache License")
5 // with the following modification; you may not use this file except in
6 // compliance with the Apache License and the following modification to it:
7 // Section 6. Trademarks. is deleted and replaced with:
8 //
9 // 6. Trademarks. This License does not grant permission to use the trade
10 // names, trademarks, service marks, or product names of the Licensor
11 // and its affiliates, except as required to comply with Section 4(c) of
12 // the License and to reproduce the content of the NOTICE file.
13 //
14 // You may obtain a copy of the Apache License at
15 //
16 // http://www.apache.org/licenses/LICENSE-2.0
17 //
18 // Unless required by applicable law or agreed to in writing, software
19 // distributed under the Apache License with the above modification is
20 // distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
21 // KIND, either express or implied. See the Apache License for the specific
22 // language governing permissions and limitations under the Apache License.
23 //
24 #ifndef PXR_USD_SDF_CHANGE_LIST_H
25 #define PXR_USD_SDF_CHANGE_LIST_H
26 
27 /// \file sdf/changeList.h
28 
29 #include "pxr/pxr.h"
30 #include "pxr/usd/sdf/api.h"
31 #include "pxr/usd/sdf/path.h"
32 #include "pxr/usd/sdf/types.h"
34 
35 #include <set>
36 #include <map>
37 #include <unordered_map>
38 #include <iosfwd>
39 
41 
43 typedef std::vector<
44  std::pair<SdfLayerHandle, SdfChangeList>
46 
47 /// \class SdfChangeList
48 ///
49 /// A list of scene description modifications, organized by the namespace
50 /// paths where the changes occur.
51 ///
53 {
54 public:
55 
56  SdfChangeList() = default;
58  SdfChangeList(SdfChangeList &&) = default;
59  SDF_API SdfChangeList &operator=(SdfChangeList const &);
60  SdfChangeList &operator=(SdfChangeList &&) = default;
61 
66  };
67 
69  void DidReloadLayerContent();
71  void DidChangeLayerIdentifier(const std::string &oldIdentifier);
72  void DidChangeSublayerPaths(const std::string &subLayerPath,
73  SubLayerChangeType changeType);
74 
75  void DidAddPrim(const SdfPath &primPath, bool inert);
76  void DidRemovePrim(const SdfPath &primPath, bool inert);
77  void DidReorderPrims(const SdfPath &parentPath);
78  void DidChangePrimName(const SdfPath &oldPath, const SdfPath &newPath);
79  void DidChangePrimVariantSets(const SdfPath &primPath);
80  void DidChangePrimInheritPaths(const SdfPath &primPath);
81  void DidChangePrimReferences(const SdfPath &primPath);
82  void DidChangePrimSpecializes(const SdfPath &primPath);
83 
84  void DidAddProperty(const SdfPath &propPath, bool hasOnlyRequiredFields);
85  void DidRemoveProperty(const SdfPath &propPath, bool hasOnlyRequiredFields);
86  void DidReorderProperties(const SdfPath &propPath);
87  void DidChangePropertyName(const SdfPath &oldPath, const SdfPath &newPath);
88 
89  void DidChangeAttributeTimeSamples(const SdfPath &attrPath);
90  void DidChangeAttributeConnection(const SdfPath &attrPath);
91  void DidChangeRelationshipTargets(const SdfPath &relPath);
92  void DidAddTarget(const SdfPath &targetPath);
93  void DidRemoveTarget(const SdfPath &targetPath);
94 
95  void DidChangeInfo(const SdfPath &path, const TfToken &key,
96  VtValue &&oldValue, const VtValue &newValue);
97 
98  /// \struct Entry
99  ///
100  /// Entry of changes at a single path in namespace.
101  ///
102  /// If the path is SdfPath::AbsoluteRootPath(), that indicates a change
103  /// to the root of namespace (that is, a layer or stage).
104  ///
105  /// Note: Our language for invalidation used to be more precise
106  /// about items added, removed, or reordered. It might seem that
107  /// this would afford more opportunities for efficient updates,
108  /// but in practice it does not. Because our derived data typically
109  /// must recompose or reinstantiate based on the underlying data,
110  /// the particular delta might be ignored, overridden, or invalid.
111  /// It is simpler to treat all changes identically, and focus on
112  /// making the common base case fast, rather than have complicated
113  /// differential update logic. It also vastly simplifies the
114  /// language of invalidation.
115  ///
116  struct Entry {
117  // Map of info keys that have changed to (old, new) value pairs.
118  typedef std::pair<VtValue, VtValue> InfoChange;
119  // We usually change just a few fields on a spec in one go, so we store
120  // up to three locally (e.g. typeName, variability, default).
123 
124  /// Return the iterator in infoChanged whose first element is \p key, or
125  /// infoChanged.end() if there is no such element.
127  FindInfoChange(TfToken const &key) const {
130  iter != end; ++iter) {
131  if (iter->first == key) {
132  break;
133  }
134  }
135  return iter;
136  }
137 
138  /// Return true if this entry has an info change for \p key, false
139  /// otherwise.
140  bool HasInfoChange(TfToken const &key) const {
141  return FindInfoChange(key) != infoChanged.end();
142  }
143 
144  typedef std::pair<std::string, SubLayerChangeType> SubLayerChange;
145  std::vector<SubLayerChange> subLayerChanges;
146 
147  // Empty if didRename is not set
149 
150  // Empty if didChangeIdentifier is not set
152 
153  // Most changes are stored as simple bits.
154  struct _Flags {
155  _Flags() {
156  memset(this, 0, sizeof(*this));
157  }
158 
159  // SdfLayer
164 
165  // SdfLayer, SdfPrimSpec, SdfRelationshipTarget.
168 
169  // SdfPrimSpec, SdfPropertySpec
170  bool didRename:1;
171 
172  // SdfPrimSpec
177 
178  // SdfPropertySpec
182  bool didAddTarget:1;
184 
185  // SdfPrimSpec add/remove
190 
191  // Property add/remove
196  };
197 
199  };
200 
201  /// Map of change entries at various paths in a layer. We store one entry
202  /// in local space, since it's very common to edit just a single spec in a
203  /// single round of changes.
205 
206 public:
207  const EntryList & GetEntryList() const { return _entries; }
208 
209  // Change accessors/mutators
210  SDF_API
211  Entry const &GetEntry( const SdfPath & ) const;
212 
214 
215  SDF_API
216  const_iterator FindEntry(SdfPath const &) const;
217 
219  return _entries.begin();
220  }
221 
223  return _entries.cbegin();
224  }
225 
226  const_iterator end() const {
227  return _entries.end();
228  }
229 
231  return _entries.cend();
232  }
233 
234 private:
235  friend void swap(SdfChangeList &a, SdfChangeList &b) {
236  a._entries.swap(b._entries);
237  a._entriesAccel.swap(b._entriesAccel);
238  }
239 
240  Entry &_GetEntry(SdfPath const &);
241 
242  // If no entry with `newPath` exists, create one. If an entry with
243  // `oldPath` exists, move its contents over `newPath`'s and erase it.
244  // Return a reference to `newPath`'s entry.
245  Entry &_MoveEntry(SdfPath const &oldPath, SdfPath const &newPath);
246 
247  EntryList::iterator _MakeNonConstIterator(EntryList::const_iterator i);
248 
249  Entry &_AddNewEntry(SdfPath const &path);
250 
251  void _EraseEntry(SdfPath const &);
252 
253  void _RebuildAccel();
254 
255  EntryList _entries;
256  using _AccelTable = std::unordered_map<SdfPath, size_t, SdfPath::Hash>;
257  std::unique_ptr<_AccelTable> _entriesAccel;
258  static constexpr size_t _AccelThreshold = 64;
259 };
260 
261 // Stream-output operator
262 SDF_API std::ostream& operator<<(std::ostream&, const SdfChangeList &);
263 
265 
266 #endif // PXR_USD_SDF_CHANGE_LIST_H
SDF_API Entry const & GetEntry(const SdfPath &) const
void DidReorderProperties(const SdfPath &propPath)
const_iterator cend() const
Definition: changeList.h:230
std::pair< VtValue, VtValue > InfoChange
Definition: changeList.h:118
iterator end()
Definition: smallVector.h:682
TfSmallVector< std::pair< SdfPath, Entry >, 1 > EntryList
Definition: changeList.h:204
void DidChangePrimInheritPaths(const SdfPath &primPath)
const_iterator cbegin() const
Definition: smallVector.h:673
bool didRemovePropertyWithOnlyRequiredFields
Definition: changeList.h:194
void DidAddPrim(const SdfPath &primPath, bool inert)
bool didChangeIdentifier
Definition: changeList.h:160
GLsizei const GLchar *const * string
Definition: glcorearb.h:814
void DidReloadLayerContent()
Definition: changeList.h:154
bool didAddNonInertPrim
Definition: changeList.h:187
GLsizei const GLchar *const * path
Definition: glcorearb.h:3341
InfoChangeVec infoChanged
Definition: changeList.h:122
bool didAddInertPrim
Definition: changeList.h:186
SDF_API const_iterator FindEntry(SdfPath const &) const
TfSmallVector< std::pair< TfToken, InfoChange >, 3 > InfoChangeVec
Definition: changeList.h:121
bool didRemoveNonInertPrim
Definition: changeList.h:189
GLboolean GLboolean GLboolean GLboolean a
Definition: glcorearb.h:1222
bool didRename
Definition: changeList.h:170
void DidChangeRelationshipTargets(const SdfPath &relPath)
std::vector< SubLayerChange > subLayerChanges
Definition: changeList.h:145
std::string oldIdentifier
Definition: changeList.h:151
std::pair< std::string, SubLayerChangeType > SubLayerChange
Definition: changeList.h:144
bool didReorderProperties
Definition: changeList.h:167
void DidChangeAttributeConnection(const SdfPath &attrPath)
friend void swap(SdfChangeList &a, SdfChangeList &b)
Definition: changeList.h:235
bool didChangeRelationshipTargets
Definition: changeList.h:181
bool didRemoveInertPrim
Definition: changeList.h:188
void DidChangePrimReferences(const SdfPath &primPath)
bool didAddPropertyWithOnlyRequiredFields
Definition: changeList.h:192
void DidRemoveProperty(const SdfPath &propPath, bool hasOnlyRequiredFields)
void DidRemovePrim(const SdfPath &primPath, bool inert)
Definition: token.h:87
_Flags flags
Definition: changeList.h:198
bool didChangeAttributeTimeSamples
Definition: changeList.h:179
bool didChangeResolvedPath
Definition: changeList.h:161
void DidChangeInfo(const SdfPath &path, const TfToken &key, VtValue &&oldValue, const VtValue &newValue)
bool didRemoveProperty
Definition: changeList.h:195
bool didAddProperty
Definition: changeList.h:193
iterator begin()
Definition: smallVector.h:665
void DidChangeLayerResolvedPath()
GLuint GLuint end
Definition: glcorearb.h:475
bool didChangePrimReferences
Definition: changeList.h:176
void DidChangeSublayerPaths(const std::string &subLayerPath, SubLayerChangeType changeType)
void DidReorderPrims(const SdfPath &parentPath)
SdfChangeList()=default
bool didReloadContent
Definition: changeList.h:163
bool didReorderChildren
Definition: changeList.h:166
bool didReplaceContent
Definition: changeList.h:162
bool didChangePrimSpecializes
Definition: changeList.h:175
Definition: path.h:291
SDF_API SdfChangeList & operator=(SdfChangeList const &)
GLboolean GLboolean GLboolean b
Definition: glcorearb.h:1222
void DidAddTarget(const SdfPath &targetPath)
#define SDF_API
Definition: api.h:40
EntryList::const_iterator const_iterator
Definition: changeList.h:213
std::vector< std::pair< SdfLayerHandle, SdfChangeList > > SdfLayerChangeListVec
Definition: changeList.h:42
_Flags()
Definition: changeList.h:155
PXR_NAMESPACE_CLOSE_SCOPE PXR_NAMESPACE_OPEN_SCOPE
Definition: path.h:1441
void DidAddProperty(const SdfPath &propPath, bool hasOnlyRequiredFields)
const_iterator begin() const
Definition: changeList.h:218
const EntryList & GetEntryList() const
Definition: changeList.h:207
SDF_API std::ostream & operator<<(std::ostream &, const SdfChangeList &)
SdfPath oldPath
Definition: changeList.h:148
#define PXR_NAMESPACE_CLOSE_SCOPE
Definition: pxr.h:91
bool didChangePrimInheritPaths
Definition: changeList.h:174
std::pair< SdfPath, Entry > * iterator
Definition: smallVector.h:201
bool didChangeAttributeConnection
Definition: changeList.h:180
const_iterator cend() const
Definition: smallVector.h:690
const_iterator end() const
Definition: changeList.h:226
bool didAddTarget
Definition: changeList.h:182
void DidReplaceLayerContent()
void DidChangePrimName(const SdfPath &oldPath, const SdfPath &newPath)
const std::pair< TfToken, InfoChange > * const_iterator
Definition: smallVector.h:202
bool didChangePrimVariantSets
Definition: changeList.h:173
void DidChangePrimVariantSets(const SdfPath &primPath)
Definition: changeList.h:116
const_iterator cbegin() const
Definition: changeList.h:222
void DidChangeAttributeTimeSamples(const SdfPath &attrPath)
bool HasInfoChange(TfToken const &key) const
Definition: changeList.h:140
void DidChangePrimSpecializes(const SdfPath &primPath)
Definition: value.h:167
void DidChangeLayerIdentifier(const std::string &oldIdentifier)
void DidChangePropertyName(const SdfPath &oldPath, const SdfPath &newPath)
bool didRemoveTarget
Definition: changeList.h:183
void swap(TfSmallVector &rhs)
Definition: smallVector.h:330
void DidRemoveTarget(const SdfPath &targetPath)
InfoChangeVec::const_iterator FindInfoChange(TfToken const &key) const
Definition: changeList.h:127