52 using CachePtr = std::shared_ptr<CachedType>;
54 void BeginCacheScope(
VtValue* cacheScopeData)
59 if (!cacheScopeData ||
61 !cacheScopeData->
IsHolding<CachePtr>())) {
66 _CachePtrStack& cacheStack = _threadCacheStack.local();
67 if (cacheScopeData->
IsHolding<CachePtr>()) {
68 cacheStack.push_back(cacheScopeData->
UncheckedGet<CachePtr>());
71 if (cacheStack.empty()) {
72 cacheStack.push_back(std::make_shared<CachedType>());
75 cacheStack.push_back(cacheStack.back());
78 *cacheScopeData = cacheStack.back();
81 void EndCacheScope(
VtValue* cacheScopeData)
83 _CachePtrStack& cacheStack = _threadCacheStack.local();
85 cacheStack.pop_back();
89 CachePtr GetCurrentCache()
91 _CachePtrStack& cacheStack = _threadCacheStack.local();
92 return (cacheStack.empty() ? CachePtr() : cacheStack.back());
96 using _CachePtrStack = std::vector<CachePtr>;
97 using _ThreadLocalCachePtrStack =
98 tbb::enumerable_thread_specific<_CachePtrStack>;
99 _ThreadLocalCachePtrStack _threadCacheStack;