7#ifndef PXR_USD_PCP_MAP_FUNCTION_H
8#define PXR_USD_PCP_MAP_FUNCTION_H
11#include "pxr/usd/pcp/api.h"
12#include "pxr/usd/sdf/path.h"
14#include "pxr/usd/sdf/pathExpression.h"
19PXR_NAMESPACE_OPEN_SCOPE
68 typedef std::map<SdfPath, SdfPath, SdfPath::FastLessThan>
PathMap;
69 typedef std::pair<SdfPath, SdfPath> PathPair;
70 typedef std::vector<PathPair> PathPairVector;
154 std::vector<SdfPathExpression::PathPattern>
155 *unmappedPatterns =
nullptr,
156 std::vector<SdfPathExpression::ExpressionReference>
157 *unmappedRefs =
nullptr
177 std::vector<SdfPathExpression::PathPattern>
178 *unmappedPatterns =
nullptr,
179 std::vector<SdfPathExpression::ExpressionReference>
180 *unmappedRefs =
nullptr
221 PathPair
const *sourceToTargetEnd,
223 bool hasRootIdentity);
227 _MapPathExpressionImpl(
230 std::vector<SdfPathExpression::PathPattern> *unmappedPatterns,
231 std::vector<SdfPathExpression::ExpressionReference> *unmappedRefs
237 static const int _MaxLocalPairs = 2;
241 _Data(PathPair
const *begin, PathPair
const *end,
bool hasRootIdentity)
242 : numPairs(end-begin)
243 , hasRootIdentity(hasRootIdentity) {
246 if (numPairs <= _MaxLocalPairs) {
247 std::uninitialized_copy(begin, end, localPairs);
250 new (&remotePairs) std::shared_ptr<PathPair>(
251 new PathPair[numPairs], std::default_delete<PathPair[]>());
252 std::copy(begin, end, remotePairs.get());
256 _Data(_Data
const &other)
257 : numPairs(other.numPairs)
258 , hasRootIdentity(other.hasRootIdentity) {
259 if (numPairs <= _MaxLocalPairs) {
260 std::uninitialized_copy(
262 other.localPairs + other.numPairs, localPairs);
265 new (&remotePairs) std::shared_ptr<PathPair>(other.remotePairs);
269 : numPairs(other.numPairs)
270 , hasRootIdentity(other.hasRootIdentity) {
271 if (numPairs <= _MaxLocalPairs) {
272 PathPair *dst = localPairs;
273 PathPair *src = other.localPairs;
274 PathPair *srcEnd = other.localPairs + other.numPairs;
275 for (; src != srcEnd; ++src, ++dst) {
276 ::new (
static_cast<void*
>(std::addressof(*dst)))
277 PathPair(std::move(*src));
282 std::shared_ptr<PathPair>(std::move(other.remotePairs));
285 _Data &operator=(_Data
const &other) {
286 if (
this != &other) {
288 new (
this) _Data(other);
292 _Data &operator=(_Data &&other) {
293 if (
this != &other) {
295 new (
this) _Data(std::move(other));
300 if (numPairs <= _MaxLocalPairs) {
301 for (PathPair *p = localPairs; numPairs--; ++p) {
306 remotePairs.~shared_ptr<PathPair>();
310 bool IsNull()
const {
311 return numPairs == 0 && !hasRootIdentity;
314 PathPair
const *begin()
const {
315 return numPairs <= _MaxLocalPairs ? localPairs : remotePairs.get();
318 PathPair
const *end()
const {
319 return begin() + numPairs;
322 bool operator==(_Data
const &other)
const {
323 return numPairs == other.numPairs &&
324 hasRootIdentity == other.hasRootIdentity &&
325 std::equal(begin(), end(), other.begin());
328 bool operator!=(_Data
const &other)
const {
329 return !(*
this == other);
332 template <
class HashState>
333 friend void TfHashAppend(HashState &h, _Data
const &data){
334 h.Append(data.hasRootIdentity);
335 h.Append(data.numPairs);
336 h.AppendRange(std::begin(data), std::end(data));
340 PathPair localPairs[_MaxLocalPairs > 0 ? _MaxLocalPairs : 1];
341 std::shared_ptr<PathPair> remotePairs;
343 typedef int PairCount;
344 PairCount numPairs = 0;
345 bool hasRootIdentity =
false;
349 template <
typename HashState>
367PXR_NAMESPACE_CLOSE_SCOPE
A function that maps values from one namespace (and time domain) to another.
static PCP_API PcpMapFunction Create(const PathMap &sourceToTargetMap, const SdfLayerOffset &offset)
Constructs a map function with the given arguments.
PCP_API void Swap(PcpMapFunction &map)
Swap the contents of this map function with map.
PCP_API SdfPathExpression MapTargetToSource(const SdfPathExpression &pathExpr, std::vector< SdfPathExpression::PathPattern > *unmappedPatterns=nullptr, std::vector< SdfPathExpression::ExpressionReference > *unmappedRefs=nullptr) const
Map all path pattern prefix paths and expression reference paths in the target namespace to the sourc...
PCP_API SdfPath MapSourceToTarget(const SdfPath &path) const
Map a path in the source namespace to the target.
bool HasRootIdentity() const
Return true if the map function maps the absolute root path to the absolute root path,...
PCP_API bool IsIdentity() const
Return true if the map function is the identity function.
PCP_API size_t Hash() const
Return a size_t hash for this map function.
PCP_API SdfPathExpression MapSourceToTarget(const SdfPathExpression &pathExpr, std::vector< SdfPathExpression::PathPattern > *unmappedPatterns=nullptr, std::vector< SdfPathExpression::ExpressionReference > *unmappedRefs=nullptr) const
Map all path pattern prefix paths and expression reference paths in the source namespace to the targe...
PCP_API std::string GetString() const
Returns a string representation of this mapping for debugging purposes.
static PCP_API const PathMap & IdentityPathMap()
Returns an identity path mapping.
PcpMapFunction()=default
Construct a null function.
PCP_API SdfPath MapTargetToSource(const SdfPath &path) const
Map a path in the target namespace to the source.
PCP_API bool operator!=(const PcpMapFunction &map) const
Inequality.
const SdfLayerOffset & GetTimeOffset() const
The time offset of the mapping.
std::map< SdfPath, SdfPath, SdfPath::FastLessThan > PathMap
A mapping from path to path.
static PCP_API const PcpMapFunction & Identity()
Construct an identity map function.
PCP_API PcpMapFunction ComposeOffset(const SdfLayerOffset &newOffset) const
Compose this map function over a hypothetical map function that has an identity path mapping and offs...
PCP_API PcpMapFunction GetInverse() const
Return the inverse of this map function.
PCP_API PcpMapFunction Compose(const PcpMapFunction &f) const
Compose this map over the given map function.
PCP_API bool IsIdentityPathMapping() const
Return true if the map function uses the identity path mapping.
PCP_API bool operator==(const PcpMapFunction &map) const
Equality.
PCP_API bool IsNull() const
Return true if this map function is the null function.
PCP_API PathMap GetSourceToTargetMap() const
The set of path mappings, from source to target.
Represents a time offset and scale between layers.
Objects of this class represent a logical expression syntax tree consisting of SdfPathPattern s,...
A path value used to locate objects in layers or scenegraphs.
A user-extensible hashing mechanism for use with runtime hash tables.
size_t hash_value(const half h)
Overload hash_value for half.