listOp.h
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_LIST_OP_H
25 #define PXR_USD_SDF_LIST_OP_H
26 
27 #include "pxr/pxr.h"
28 #include "pxr/usd/sdf/api.h"
29 #include "pxr/base/tf/token.h"
30 #include "pxr/base/tf/hash.h"
31 
32 #include <boost/optional/optional_fwd.hpp>
33 
34 #include <functional>
35 #include <iosfwd>
36 #include <list>
37 #include <map>
38 #include <string>
39 #include <vector>
40 
41 PXR_NAMESPACE_OPEN_SCOPE
42 
47 enum SdfListOpType {
48  SdfListOpTypeExplicit,
49  SdfListOpTypeAdded,
50  SdfListOpTypeDeleted,
51  SdfListOpTypeOrdered,
52  SdfListOpTypePrepended,
53  SdfListOpTypeAppended
54 };
55 
61 template <class T>
62 struct Sdf_ListOpTraits
63 {
64  typedef std::less<T> ItemComparator;
65 };
66 
74 template <typename T>
75 class SdfListOp {
76 public:
77  typedef T ItemType;
78  typedef std::vector<ItemType> ItemVector;
79  typedef ItemType value_type;
80  typedef ItemVector value_vector_type;
81 
83  SDF_API
85  const ItemVector& explicitItems = ItemVector());
86 
89  SDF_API
90  static SdfListOp Create(
91  const ItemVector& prependedItems = ItemVector(),
92  const ItemVector& appendedItems = ItemVector(),
93  const ItemVector& deletedItems = ItemVector());
94 
96  SDF_API SdfListOp();
97 
98  SDF_API void Swap(SdfListOp<T>& rhs);
99 
103  bool HasKeys() const
104  {
105  if (IsExplicit()) {
106  return true;
107  }
108  if (_addedItems.size() != 0 ||
109  _prependedItems.size() != 0 ||
110  _appendedItems.size() != 0 ||
111  _deletedItems.size() != 0) {
112  return true;
113  }
114  return _orderedItems.size() != 0;
115  }
116 
118  SDF_API bool HasItem(const T& item) const;
119 
121  bool IsExplicit() const
122  {
123  return _isExplicit;
124  }
125 
127  const ItemVector& GetExplicitItems() const
128  {
129  return _explicitItems;
130  }
131 
133  const ItemVector& GetAddedItems() const
134  {
135  return _addedItems;
136  }
137 
139  const ItemVector& GetPrependedItems() const
140  {
141  return _prependedItems;
142  }
143 
145  const ItemVector& GetAppendedItems() const
146  {
147  return _appendedItems;
148  }
149 
151  const ItemVector& GetDeletedItems() const
152  {
153  return _deletedItems;
154  }
155 
157  const ItemVector& GetOrderedItems() const
158  {
159  return _orderedItems;
160  }
161 
163  SDF_API const ItemVector& GetItems(SdfListOpType type) const;
164 
171  SDF_API ItemVector GetAppliedItems() const;
172 
173  SDF_API void SetExplicitItems(const ItemVector &items);
174  SDF_API void SetAddedItems(const ItemVector &items);
175  SDF_API void SetPrependedItems(const ItemVector &items);
176  SDF_API void SetAppendedItems(const ItemVector &items);
177  SDF_API void SetDeletedItems(const ItemVector &items);
178  SDF_API void SetOrderedItems(const ItemVector &items);
179 
181  SDF_API void SetItems(const ItemVector &items, SdfListOpType type);
182 
184  SDF_API void Clear();
185 
187  SDF_API void ClearAndMakeExplicit();
188 
190  typedef std::function<
191  boost::optional<ItemType>(SdfListOpType, const ItemType&)
193 
199  SDF_API
200  void ApplyOperations(ItemVector* vec,
201  const ApplyCallback& cb = ApplyCallback()) const;
202 
213  SDF_API
214  boost::optional<SdfListOp<T>>
215  ApplyOperations(const SdfListOp<T> &inner) const;
216 
218  typedef std::function<
219  boost::optional<ItemType>(const ItemType&)
221 
232  SDF_API
233  bool ModifyOperations(const ModifyCallback& callback,
234  bool removeDuplicates = false);
235 
239  SDF_API
240  bool ReplaceOperations(const SdfListOpType op, size_t index, size_t n,
241  const ItemVector& newItems);
242 
245  SDF_API
246  void ComposeOperations(const SdfListOp<T>& stronger, SdfListOpType op);
247 
248  friend inline size_t hash_value(const SdfListOp &op) {
249  return TfHash::Combine(
250  op._isExplicit,
251  op._explicitItems,
252  op._addedItems,
253  op._prependedItems,
254  op._appendedItems,
255  op._deletedItems,
256  op._orderedItems
257  );
258  }
259 
260  bool operator==(const SdfListOp<T> &rhs) const {
261  return _isExplicit == rhs._isExplicit &&
262  _explicitItems == rhs._explicitItems &&
263  _addedItems == rhs._addedItems &&
264  _prependedItems == rhs._prependedItems &&
265  _appendedItems == rhs._appendedItems &&
266  _deletedItems == rhs._deletedItems &&
267  _orderedItems == rhs._orderedItems;
268  };
269 
270  bool operator!=(const SdfListOp<T> &rhs) const {
271  return !(*this == rhs);
272  };
273 
274 private:
275  void _SetExplicit(bool isExplicit);
276 
277  typedef typename Sdf_ListOpTraits<T>::ItemComparator _ItemComparator;
278  typedef std::list<ItemType> _ApplyList;
279  typedef std::map<ItemType, typename _ApplyList::iterator, _ItemComparator>
280  _ApplyMap;
281 
282  void _AddKeys(SdfListOpType, const ApplyCallback& cb,
283  _ApplyList* result, _ApplyMap* search) const;
284  void _PrependKeys(SdfListOpType, const ApplyCallback& cb,
285  _ApplyList* result, _ApplyMap* search) const;
286  void _AppendKeys(SdfListOpType, const ApplyCallback& cb,
287  _ApplyList* result, _ApplyMap* search) const;
288  void _DeleteKeys(SdfListOpType, const ApplyCallback& cb,
289  _ApplyList* result, _ApplyMap* search) const;
290  void _ReorderKeys(SdfListOpType, const ApplyCallback& cb,
291  _ApplyList* result, _ApplyMap* search) const;
292 
293 private:
294  bool _isExplicit;
295  ItemVector _explicitItems;
296  ItemVector _addedItems;
297  ItemVector _prependedItems;
298  ItemVector _appendedItems;
299  ItemVector _deletedItems;
300  ItemVector _orderedItems;
301 };
302 
303 // ADL swap.
304 template <class T>
305 void swap(SdfListOp<T> &x, SdfListOp<T> &y)
306 {
307  x.Swap(y);
308 }
309 
310 // Helper function for applying an ordering operation described by \p orderVector
311 // to vector \p v.
312 template <class ItemType>
313 SDF_API
314 void SdfApplyListOrdering(std::vector<ItemType>* v,
315  const std::vector<ItemType>& order);
316 
317 // Ostream output methods for list values (useful for debugging and required
318 // for storing a list value in a VtValue).
319 template <typename T>
320 SDF_API
321 std::ostream & operator<<( std::ostream &, const SdfListOp<T> & );
322 
323 // Concrete, instantiated listop types.
324 typedef class SdfListOp<int> SdfIntListOp;
325 typedef class SdfListOp<unsigned int> SdfUIntListOp;
326 typedef class SdfListOp<int64_t> SdfInt64ListOp;
327 typedef class SdfListOp<uint64_t> SdfUInt64ListOp;
328 typedef class SdfListOp<TfToken> SdfTokenListOp;
329 typedef class SdfListOp<std::string> SdfStringListOp;
330 typedef class SdfListOp<class SdfPath> SdfPathListOp;
331 typedef class SdfListOp<class SdfReference> SdfReferenceListOp;
332 typedef class SdfListOp<class SdfPayload> SdfPayloadListOp;
333 typedef class SdfListOp<class SdfUnregisteredValue> SdfUnregisteredValueListOp;
334 
335 PXR_NAMESPACE_CLOSE_SCOPE
336 
337 #endif // PXR_USD_SDF_LIST_OP_H
void swap(ArAssetInfo &lhs, ArAssetInfo &rhs)
Definition: assetInfo.h:74
const ItemVector & GetPrependedItems() const
Returns the explicit items.
Definition: listOp.h:139
std::function< boost::optional< ItemType >SdfListOpType, const ItemType &) > ApplyCallback
Callback type for ApplyOperations.
Definition: listOp.h:192
SDF_API const ItemVector & GetItems(SdfListOpType type) const
Return the item vector identified by type.
SDF_API SdfListOp()
Create an empty ListOp in non-explicit mode.
SDF_API void SetItems(const ItemVector &items, SdfListOpType type)
Sets the item vector for the given operation type.
bool HasKeys() const
Returns true if the editor has an explicit list (even if it's empty) or it has any added,...
Definition: listOp.h:103
const ItemVector & GetOrderedItems() const
Returns the ordered items.
Definition: listOp.h:157
SDF_API void ClearAndMakeExplicit()
Removes all items and changes the list to be explicit.
SDF_API void Clear()
Removes all items and changes the list to be non-explicit.
const ItemVector & GetAppendedItems() const
Returns the explicit items.
Definition: listOp.h:145
std::function< boost::optional< ItemType >const ItemType &) > ModifyCallback
Callback type for ModifyOperations.
Definition: listOp.h:220
Token for efficient comparison, assignment, and hashing of known strings.
Definition: token.h:87
static size_t Combine(Args &&... args)
Produce a hash code by combining the hash codes of several objects.
Definition: hash.h:519
SDF_API bool HasItem(const T &item) const
Returns true if the given item is in any of the item lists.
SDF_API ItemVector GetAppliedItems() const
Returns the effective list of items represented by the operations in this list op.
Value type representing a list-edit operation.
Definition: listOp.h:75
GF_API std::ostream & operator<<(std::ostream &, const GfBBox3d &)
Output a GfBBox3d using the format [(range) matrix zeroArea].
static SDF_API SdfListOp CreateExplicit(const ItemVector &explicitItems=ItemVector())
Create a ListOp in explicit mode with the given explicitItems.
SDF_API bool ReplaceOperations(const SdfListOpType op, size_t index, size_t n, const ItemVector &newItems)
Replaces the items in the specified operation vector in the range (index, index + n] with the given n...
const ItemVector & GetDeletedItems() const
Returns the deleted items.
Definition: listOp.h:151
static SDF_API SdfListOp Create(const ItemVector &prependedItems=ItemVector(), const ItemVector &appendedItems=ItemVector(), const ItemVector &deletedItems=ItemVector())
Create a ListOp in non-explicit mode with the given prependedItems, appendedItems,...
SDF_API void ComposeOperations(const SdfListOp< T > &stronger, SdfListOpType op)
Composes a stronger SdfListOp's opinions for a given operation list over this one.
SDF_API bool ModifyOperations(const ModifyCallback &callback, bool removeDuplicates=false)
Modifies operations specified in this object.
const ItemVector & GetExplicitItems() const
Returns the explicit items.
Definition: listOp.h:127
const ItemVector & GetAddedItems() const
Returns the explicit items.
Definition: listOp.h:133
bool IsExplicit() const
Returns true if the list is explicit.
Definition: listOp.h:121
SDF_API void ApplyOperations(ItemVector *vec, const ApplyCallback &cb=ApplyCallback()) const
Applies edit operations to the given ItemVector.
TfToken class for efficient string referencing and hashing, plus conversions to and from stl string c...