diff options
author | Rider Linden <rider@lindenlab.com> | 2018-02-27 09:38:06 -0800 |
---|---|---|
committer | Rider Linden <rider@lindenlab.com> | 2018-02-27 09:38:06 -0800 |
commit | 9f2f2a28740274fa23f1cbcee7dcdefaefb2c469 (patch) | |
tree | c5a42434481ec77aaaf0de93a9fe395be2e036ff /indra/llmessage | |
parent | e2e63598d40109d01e0311ce1444d3feedffcf66 (diff) |
Replace variadic template with more specific expansion.
Diffstat (limited to 'indra/llmessage')
-rw-r--r-- | indra/llmessage/llassetstorage.cpp | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/indra/llmessage/llassetstorage.cpp b/indra/llmessage/llassetstorage.cpp index 3d93f5aeb8..2b12a062c3 100644 --- a/indra/llmessage/llassetstorage.cpp +++ b/indra/llmessage/llassetstorage.cpp @@ -64,20 +64,38 @@ const U64 TOXIC_ASSET_LIFETIME = (120 * 1000000); // microseconds namespace { - template<typename T, typename... U> - bool operator == (const std::function<T(U...)> &a, const std::function <T(U...)> &b) + bool operator == (const LLAssetStorage::LLGetAssetCallback &lhs, const LLAssetStorage::LLGetAssetCallback &rhs) { - typedef T(fnType)(U...); - - auto fnPtrA = a.target<T(*)(U...)>(); - auto fnPtrB = b.target<T(*)(U...)>(); - if (fnPtrA && fnPtrB) - return (*fnPtrA == *fnPtrB); - else if (!fnPtrA && !fnPtrB) + auto fnPtrLhs = lhs.target<LLAssetStorage::LLGetAssetCallback>(); + auto fnPtrRhs = rhs.target<LLAssetStorage::LLGetAssetCallback>(); + if (fnPtrLhs && fnPtrRhs) + return (*fnPtrLhs == *fnPtrRhs); + else if (!fnPtrLhs && !fnPtrRhs) return true; return false; } +// Rider: This is the general case of the operator declared above. The code compares the callback +// passed into the LLAssetStorage functions to determine if there are duplicated requests for an +// asset. Unfortunately std::function does not provide a direct way to compare two variables so +// we define the operator here. +// XCode is not very happy with the variadic temples in use below so we will just define the specific +// case of comparing two LLGetAssetCallback objects since that is all we really use. +// +// template<typename T, typename... U> +// bool operator == (const std::function<T(U...)> &a, const std::function <T(U...)> &b) +// { +// typedef T(fnType)(U...); +// +// auto fnPtrA = a.target<T(*)(U...)>(); +// auto fnPtrB = b.target<T(*)(U...)>(); +// if (fnPtrA && fnPtrB) +// return (*fnPtrA == *fnPtrB); +// else if (!fnPtrA && !fnPtrB) +// return true; +// return false; +// } + } ///---------------------------------------------------------------------------- @@ -467,7 +485,7 @@ bool LLAssetStorage::findInStaticVFSAndInvokeCallback(const LLUUID& uuid, LLAsse // IW - uuid is passed by value to avoid side effects, please don't re-add & void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, - LLGetAssetCallback callback, + LLAssetStorage::LLGetAssetCallback callback, void *user_data, BOOL is_priority) { |