Last time, we developed some functions for cloning a Windows Runtime map via C++/WinRT. This time, we’ll do it in C++/CX, for those still using that language.
template<typename M> auto clone_as_kvp_vector(M const& m) { using KVP = decltype(m->First()->Current); std::vector<KVP> pairs; unsigned expected; unsigned actual; do { expected = m->Size; pairs.resize(expected + 1); try { actual = m->First()->GetMany(Platform:: ArrayReference<KVP>(pairs.data(), expected + 1)); } catch (Platform::ChangedStateException^) { continue; } } while (actual > expected); pairs.resize(actual); return pairs; } // override_or_fallback_t unchanged template<typename M, typename KeyOverride, typename ValueOverride> struct inferred_runtime_map_traits { using KVP = decltype(std::declval<M>()->First()->Current); using Key = override_or_fallback_t< KeyOverride, decltype(KVP()->Key)>; using Value = override_or_fallback_t< ValueOverride, decltype(KVP()->Value)>; }; // inferred_map_traits, inferred_unordered_map_traits, // clone_as_map, and clone_as_unordered_map unchanged template<typename Key = void, typename Value = void, typename Compare = void, typename M, typename Traits = inferred_map_traits <M, Key, Value, Compare>> auto CloneMap(M const& m, typename Traits::Compare const& compare = {}) { return ref new Platform::Collections::Map< typename Traits::Key, typename Traits::Value, typename Traits::Compare>( clone_as_map<Key, Value, Compare> (m, compare)); } template<typename Key = void, typename Value = void, typename Hash = void, typename KeyEqual = void, typename M, typename Traits = inferred_unordered_map_traits <M, Key, Value, Hash, KeyEqual>> auto CloneUnorderedMap(M const& m, typename Traits::Hash const& hash = {}, typename Traits::KeyEqual const& equal = {}) { return ref new Platform::Collections::UnorderedMap< typename Traits::Key, typename Traits::Hash, typename Traits::KeyEqual>( clone_as_unordered_map<Key, Value, Hash, KeyEqual> (m, hash, equal)); }
Hm, I thought this was going to introduce new wrinkles into the story, but I was pleasantly surprised: Everything translated to C++/CX in a straightforward manner with no gotchas.
0 comments