Loading...
Searching...
No Matches
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
41PXR_NAMESPACE_OPEN_SCOPE
42
47enum SdfListOpType {
48 SdfListOpTypeExplicit,
49 SdfListOpTypeAdded,
50 SdfListOpTypeDeleted,
51 SdfListOpTypeOrdered,
52 SdfListOpTypePrepended,
53 SdfListOpTypeAppended
54};
55
61template <class T>
62struct Sdf_ListOpTraits
63{
64 typedef std::less<T> ItemComparator;
65};
66
74template <typename T>
75class SdfListOp {
76public:
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
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
274private:
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
293private:
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.
304template <class T>
305void 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.
312template <class ItemType>
313SDF_API
314void 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).
319template <typename T>
320SDF_API
321std::ostream & operator<<( std::ostream &, const SdfListOp<T> & );
322
323// Concrete, instantiated listop types.
324typedef class SdfListOp<int> SdfIntListOp;
325typedef class SdfListOp<unsigned int> SdfUIntListOp;
326typedef class SdfListOp<int64_t> SdfInt64ListOp;
327typedef class SdfListOp<uint64_t> SdfUInt64ListOp;
328typedef class SdfListOp<TfToken> SdfTokenListOp;
329typedef class SdfListOp<std::string> SdfStringListOp;
330typedef class SdfListOp<class SdfPath> SdfPathListOp;
331typedef class SdfListOp<class SdfReference> SdfReferenceListOp;
332typedef class SdfListOp<class SdfPayload> SdfPayloadListOp;
333typedef class SdfListOp<class SdfUnregisteredValue> SdfUnregisteredValueListOp;
334
335PXR_NAMESPACE_CLOSE_SCOPE
336
337#endif // PXR_USD_SDF_LIST_OP_H
Value type representing a list-edit operation.
Definition: listOp.h:75
std::function< boost::optional< ItemType >(SdfListOpType, const ItemType &) > ApplyCallback
Callback type for ApplyOperations.
Definition: listOp.h:192
SDF_API bool HasItem(const T &item) const
Returns true if the given item is in any of the item lists.
static SDF_API SdfListOp CreateExplicit(const ItemVector &explicitItems=ItemVector())
Create a ListOp in explicit mode with the given explicitItems.
std::function< boost::optional< ItemType >(const ItemType &) > ModifyCallback
Callback type for ModifyOperations.
Definition: listOp.h:220
const ItemVector & GetOrderedItems() const
Returns the ordered items.
Definition: listOp.h:157
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,...
const ItemVector & GetDeletedItems() const
Returns the deleted items.
Definition: listOp.h:151
SDF_API const ItemVector & GetItems(SdfListOpType type) const
Return the item vector identified by type.
bool IsExplicit() const
Returns true if the list is explicit.
Definition: listOp.h:121
SDF_API void Clear()
Removes all items and changes the list to be non-explicit.
const ItemVector & GetPrependedItems() const
Returns the explicit items.
Definition: listOp.h:139
SDF_API boost::optional< SdfListOp< T > > ApplyOperations(const SdfListOp< T > &inner) const
Applies edit operations to the given ListOp.
const ItemVector & GetExplicitItems() const
Returns the explicit items.
Definition: listOp.h:127
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...
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.
SDF_API void ApplyOperations(ItemVector *vec, const ApplyCallback &cb=ApplyCallback()) const
Applies edit operations to the given ItemVector.
SDF_API void ClearAndMakeExplicit()
Removes all items and changes the list to be explicit.
SDF_API void ComposeOperations(const SdfListOp< T > &stronger, SdfListOpType op)
Composes a stronger SdfListOp's opinions for a given operation list over this one.
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 & GetAppendedItems() const
Returns the explicit items.
Definition: listOp.h:145
SDF_API ItemVector GetAppliedItems() const
Returns the effective list of items represented by the operations in this list op.
const ItemVector & GetAddedItems() const
Returns the explicit items.
Definition: listOp.h:133
SDF_API bool ModifyOperations(const ModifyCallback &callback, bool removeDuplicates=false)
Modifies operations specified in this object.
static size_t Combine(Args &&... args)
Produce a hash code by combining the hash codes of several objects.
Definition: hash.h:492
Token for efficient comparison, assignment, and hashing of known strings.
Definition: token.h:88
GF_API std::ostream & operator<<(std::ostream &, const GfBBox3d &)
Output a GfBBox3d using the format [(range) matrix zeroArea].
STL namespace.
TfToken class for efficient string referencing and hashing, plus conversions to and from stl string c...