HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
listOp.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_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 
31 #include <hboost/functional/hash.hpp>
32 #include <hboost/optional/optional_fwd.hpp>
33 
34 #include <functional>
35 #include <iosfwd>
36 #include <list>
37 #include <map>
38 #include <string>
39 #include <vector>
40 
42 
43 /// \enum SdfListOpType
44 ///
45 /// Enum for specifying one of the list editing operation types.
46 ///
54 };
55 
56 /// \struct Sdf_ListOpTraits
57 ///
58 /// Trait classes for specializing behaviors of SdfListOp for a given item
59 /// type.
60 ///
61 template <class T>
63 {
64  typedef std::less<T> ItemComparator;
65 };
66 
67 /// \class SdfListOp
68 ///
69 /// Value type representing a list-edit operation.
70 ///
71 /// SdfListOp is a value type representing an operation that edits a list.
72 /// It may add or remove items, reorder them, or replace the list entirely.
73 ///
74 template <typename T>
75 class SdfListOp {
76 public:
77  typedef T ItemType;
78  typedef std::vector<ItemType> ItemVector;
81 
82  /// Create a ListOp in explicit mode with the given \p explicitItems.
83  SDF_API
85  const ItemVector& explicitItems = ItemVector());
86 
87  /// Create a ListOp in non-explicit mode with the given
88  /// \p prependedItems, \p appendedItems, and \p deletedItems
89  SDF_API
90  static SdfListOp Create(
91  const ItemVector& prependedItems = ItemVector(),
92  const ItemVector& appendedItems = ItemVector(),
93  const ItemVector& deletedItems = ItemVector());
94 
95  /// Create an empty ListOp in non-explicit mode.
97 
98  SDF_API void Swap(SdfListOp<T>& rhs);
99 
100  /// Returns \c true if the editor has an explicit list (even if it's
101  /// empty) or it has any added, prepended, appended, deleted,
102  /// or ordered keys.
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 
117  /// Returns \c true if the given item is in any of the item lists.
118  SDF_API bool HasItem(const T& item) const;
119 
120  /// Returns \c true if the list is explicit.
121  bool IsExplicit() const
122  {
123  return _isExplicit;
124  }
125 
126  /// Returns the explicit items.
128  {
129  return _explicitItems;
130  }
131 
132  /// Returns the explicit items.
133  const ItemVector& GetAddedItems() const
134  {
135  return _addedItems;
136  }
137 
138  /// Returns the explicit items.
140  {
141  return _prependedItems;
142  }
143 
144  /// Returns the explicit items.
146  {
147  return _appendedItems;
148  }
149 
150  /// Returns the deleted items.
152  {
153  return _deletedItems;
154  }
155 
156  /// Returns the ordered items.
158  {
159  return _orderedItems;
160  }
161 
162  /// Return the item vector identified by \p type.
164 
165  SDF_API void SetExplicitItems(const ItemVector &items);
166  SDF_API void SetAddedItems(const ItemVector &items);
167  SDF_API void SetPrependedItems(const ItemVector &items);
168  SDF_API void SetAppendedItems(const ItemVector &items);
169  SDF_API void SetDeletedItems(const ItemVector &items);
170  SDF_API void SetOrderedItems(const ItemVector &items);
171 
172  /// Sets the item vector for the given operation \p type.
173  SDF_API void SetItems(const ItemVector &items, SdfListOpType type);
174 
175  /// Removes all items and changes the list to be non-explicit.
176  SDF_API void Clear();
177 
178  /// Removes all items and changes the list to be explicit.
180 
181  /// Callback type for ApplyOperations.
182  typedef std::function<
183  hboost::optional<ItemType>(SdfListOpType, const ItemType&)
185 
186  /// Applies edit operations to the given ItemVector.
187  /// If supplied, \p cb will be called on each item in the operation vectors
188  /// before they are applied to \p vec. Consumers can use this to transform
189  /// the items stored in the operation vectors to match what's stored in
190  /// \p vec.
191  SDF_API
192  void ApplyOperations(ItemVector* vec,
193  const ApplyCallback& cb = ApplyCallback()) const;
194 
195  /// Applies edit operations to the given ListOp.
196  ///
197  /// The result is a ListOp that, when applied to a list, has the same
198  /// effect as applying \p inner and then \p this in sequence.
199  ///
200  /// The result will be empty if the result is not well defined.
201  /// The result is well-defined when \p inner and \p this do not
202  /// use the 'ordered' or 'added' item lists. In other words, only
203  /// the explicit, prepended, appended, and deleted portions of
204  /// SdfListOp are closed under composition with ApplyOperations().
205  SDF_API
206  hboost::optional<SdfListOp<T>>
207  ApplyOperations(const SdfListOp<T> &inner) const;
208 
209  /// Callback type for ModifyOperations.
210  typedef std::function<
211  hboost::optional<ItemType>(const ItemType&)
213 
214  /// Modifies operations specified in this object.
215  /// \p callback is called for every item in all operation vectors. If the
216  /// returned key is empty then the key is removed, otherwise it's replaced
217  /// with the returned key.
218  ///
219  /// Returns true if a change was made, false otherwise.
220  SDF_API bool ModifyOperations(const ModifyCallback& callback);
221 
222  /// Replaces the items in the specified operation vector in the range
223  /// (index, index + n] with the given \p newItems. If \p newItems is empty
224  /// the items in the range will simply be removed.
225  SDF_API
226  bool ReplaceOperations(const SdfListOpType op, size_t index, size_t n,
227  const ItemVector& newItems);
228 
229  /// Composes a stronger SdfListOp's opinions for a given operation list
230  /// over this one.
231  SDF_API
232  void ComposeOperations(const SdfListOp<T>& stronger, SdfListOpType op);
233 
234  friend inline size_t hash_value(const SdfListOp &op) {
235  size_t h = 0;
236  hboost::hash_combine(h, op._isExplicit);
237  hboost::hash_combine(h, op._explicitItems);
238  hboost::hash_combine(h, op._addedItems);
239  hboost::hash_combine(h, op._prependedItems);
240  hboost::hash_combine(h, op._appendedItems);
241  hboost::hash_combine(h, op._deletedItems);
242  hboost::hash_combine(h, op._orderedItems);
243  return h;
244  }
245 
246  bool operator==(const SdfListOp<T> &rhs) const {
247  return _isExplicit == rhs._isExplicit &&
248  _explicitItems == rhs._explicitItems &&
249  _addedItems == rhs._addedItems &&
250  _prependedItems == rhs._prependedItems &&
251  _appendedItems == rhs._appendedItems &&
252  _deletedItems == rhs._deletedItems &&
253  _orderedItems == rhs._orderedItems;
254  };
255 
256  bool operator!=(const SdfListOp<T> &rhs) const {
257  return !(*this == rhs);
258  };
259 
260 private:
261  void _SetExplicit(bool isExplicit);
262 
263  typedef typename Sdf_ListOpTraits<T>::ItemComparator _ItemComparator;
264  typedef std::list<ItemType> _ApplyList;
265  typedef std::map<ItemType, typename _ApplyList::iterator, _ItemComparator>
266  _ApplyMap;
267 
268  void _AddKeys(SdfListOpType, const ApplyCallback& cb,
269  _ApplyList* result, _ApplyMap* search) const;
270  void _PrependKeys(SdfListOpType, const ApplyCallback& cb,
271  _ApplyList* result, _ApplyMap* search) const;
272  void _AppendKeys(SdfListOpType, const ApplyCallback& cb,
273  _ApplyList* result, _ApplyMap* search) const;
274  void _DeleteKeys(SdfListOpType, const ApplyCallback& cb,
275  _ApplyList* result, _ApplyMap* search) const;
276  void _ReorderKeys(SdfListOpType, const ApplyCallback& cb,
277  _ApplyList* result, _ApplyMap* search) const;
278 
279 private:
280  bool _isExplicit;
281  ItemVector _explicitItems;
282  ItemVector _addedItems;
283  ItemVector _prependedItems;
284  ItemVector _appendedItems;
285  ItemVector _deletedItems;
286  ItemVector _orderedItems;
287 };
288 
289 // ADL swap.
290 template <class T>
292 {
293  x.Swap(y);
294 }
295 
296 // Helper function for applying an ordering operation described by \p orderVector
297 // to vector \p v.
298 template <class ItemType>
299 SDF_API
300 void SdfApplyListOrdering(std::vector<ItemType>* v,
301  const std::vector<ItemType>& order);
302 
303 // Ostream output methods for list values (useful for debugging and required
304 // for storing a list value in a VtValue).
305 template <typename T>
306 SDF_API
307 std::ostream & operator<<( std::ostream &, const SdfListOp<T> & );
308 
309 // Concrete, instantiated listop types.
310 typedef class SdfListOp<int> SdfIntListOp;
311 typedef class SdfListOp<unsigned int> SdfUIntListOp;
312 typedef class SdfListOp<int64_t> SdfInt64ListOp;
313 typedef class SdfListOp<uint64_t> SdfUInt64ListOp;
315 typedef class SdfListOp<std::string> SdfStringListOp;
316 typedef class SdfListOp<class SdfPath> SdfPathListOp;
317 typedef class SdfListOp<class SdfReference> SdfReferenceListOp;
318 typedef class SdfListOp<class SdfPayload> SdfPayloadListOp;
319 typedef class SdfListOp<class SdfUnregisteredValue> SdfUnregisteredValueListOp;
320 
322 
323 #endif // PXR_USD_SDF_LIST_OP_H
void swap(ArAssetInfo &lhs, ArAssetInfo &rhs)
Definition: assetInfo.h:61
ItemVector value_vector_type
Definition: listOp.h:80
const ItemVector & GetPrependedItems() const
Returns the explicit items.
Definition: listOp.h:139
SDF_API void ComposeOperations(const SdfListOp< T > &stronger, SdfListOpType op)
GLuint GLdouble GLdouble GLint GLint order
Definition: glew.h:3460
const ItemVector & GetExplicitItems() const
Returns the explicit items.
Definition: listOp.h:127
*get result *(waiting if necessary)*A common idiom is to fire a bunch of sub tasks at the and then *wait for them to all complete We provide a helper class
Definition: thread.h:629
const ItemVector & GetAppendedItems() const
Returns the explicit items.
Definition: listOp.h:145
SDF_API const ItemVector & GetItems(SdfListOpType type) const
Return the item vector identified by type.
SDF_API bool ReplaceOperations(const SdfListOpType op, size_t index, size_t n, const ItemVector &newItems)
class SdfListOp< class SdfReference > SdfReferenceListOp
Definition: listOp.h:317
SDF_API void ClearAndMakeExplicit()
Removes all items and changes the list to be explicit.
class SdfListOp< uint64_t > SdfUInt64ListOp
Definition: listOp.h:313
SDF_API void Swap(SdfListOp< T > &rhs)
class SdfListOp< class SdfPayload > SdfPayloadListOp
Definition: listOp.h:318
class SdfListOp< class SdfUnregisteredValue > SdfUnregisteredValueListOp
Definition: listOp.h:319
GLint GLenum GLint x
Definition: glcorearb.h:408
class SdfListOp< class SdfPath > SdfPathListOp
Definition: listOp.h:316
Definition: token.h:87
SDF_API bool ModifyOperations(const ModifyCallback &callback)
GLuint64EXT * result
Definition: glew.h:14311
T ItemType
Definition: listOp.h:77
GLint GLint GLsizei GLint GLenum GLenum type
Definition: glcorearb.h:107
class SdfListOp< int > SdfIntListOp
Definition: listOp.h:310
const ItemVector & GetOrderedItems() const
Returns the ordered items.
Definition: listOp.h:157
const ItemVector & GetAddedItems() const
Returns the explicit items.
Definition: listOp.h:133
SdfListOpType
Definition: listOp.h:47
bool HasKeys() const
Definition: listOp.h:103
const GLdouble * v
Definition: glcorearb.h:836
std::function< hboost::optional< ItemType >SdfListOpType, const ItemType &) > ApplyCallback
Callback type for ApplyOperations.
Definition: listOp.h:184
const ItemVector & GetDeletedItems() const
Returns the deleted items.
Definition: listOp.h:151
GLsizei const GLchar *const * string
Definition: glcorearb.h:813
class SdfListOp< std::string > SdfStringListOp
Definition: listOp.h:315
typedef int(WINAPI *PFNWGLRELEASEPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer
SDF_API void SetOrderedItems(const ItemVector &items)
SDF_API void SetExplicitItems(const ItemVector &items)
SDF_API void Clear()
Removes all items and changes the list to be non-explicit.
class SdfListOp< int64_t > SdfInt64ListOp
Definition: listOp.h:312
class SdfListOp< TfToken > SdfTokenListOp
Definition: listOp.h:314
class SdfListOp< unsigned int > SdfUIntListOp
Definition: listOp.h:311
GLdouble n
Definition: glcorearb.h:2007
SDF_API SdfListOp()
Create an empty ListOp in non-explicit mode.
bool operator!=(const SdfListOp< T > &rhs) const
Definition: listOp.h:256
#define SDF_API
Definition: api.h:40
GLfloat GLfloat GLfloat GLfloat h
Definition: glcorearb.h:2001
PXR_NAMESPACE_CLOSE_SCOPE PXR_NAMESPACE_OPEN_SCOPE
Definition: path.h:1375
SDF_API void SetAddedItems(const ItemVector &items)
SDF_API void ApplyOperations(ItemVector *vec, const ApplyCallback &cb=ApplyCallback()) const
static SDF_API SdfListOp CreateExplicit(const ItemVector &explicitItems=ItemVector())
Create a ListOp in explicit mode with the given explicitItems.
SDF_API void SdfApplyListOrdering(std::vector< ItemType > *v, const std::vector< ItemType > &order)
GLuint index
Definition: glcorearb.h:785
#define PXR_NAMESPACE_CLOSE_SCOPE
Definition: pxr.h:91
std::vector< ItemType > ItemVector
Definition: listOp.h:78
SDF_API void SetDeletedItems(const ItemVector &items)
SDF_API void SetItems(const ItemVector &items, SdfListOpType type)
Sets the item vector for the given operation type.
std::function< hboost::optional< ItemType >const ItemType &) > ModifyCallback
Callback type for ModifyOperations.
Definition: listOp.h:212
static SDF_API SdfListOp Create(const ItemVector &prependedItems=ItemVector(), const ItemVector &appendedItems=ItemVector(), const ItemVector &deletedItems=ItemVector())
SDF_API void SetPrependedItems(const ItemVector &items)
bool operator==(const SdfListOp< T > &rhs) const
Definition: listOp.h:246
std::less< T > ItemComparator
Definition: listOp.h:64
ItemType value_type
Definition: listOp.h:79
SDF_API bool HasItem(const T &item) const
Returns true if the given item is in any of the item lists.
GLint y
Definition: glcorearb.h:102
bool IsExplicit() const
Returns true if the list is explicit.
Definition: listOp.h:121
SDF_API void SetAppendedItems(const ItemVector &items)
friend size_t hash_value(const SdfListOp &op)
Definition: listOp.h:234