10 #define _COLLECTION_H_
14 #ifndef __cplusplus_winrt
15 #error collection.h requires the /ZW compiler option.
28 #include <unordered_map>
33 #define _COLLECTION_ATTRIBUTES [::Platform::Metadata::RuntimeClassName] [::Windows::Foundation::Metadata::Default]
35 #define _COLLECTION_TRANSLATE \
36 } catch (const ::std::bad_alloc&) { \
37 throw ref new OutOfMemoryException; \
38 } catch (const ::std::exception&) { \
39 throw ref new FailureException; \
42 #ifndef _COLLECTION_WUXI
43 #define _COLLECTION_WUXI 1
47 #pragma pack(push, 16)
52 #pragma warning(push, 4)
54 #pragma warning(disable: 4451) // Usage of ref class 'Meow' inside this context can lead to invalid marshaling of object across contexts
57 namespace Collections {
59 namespace WFC = ::Windows::Foundation::Collections;
62 namespace WUXI = ::Windows::UI::Xaml::Interop;
63 #endif // _COLLECTION_WUXI
65 typedef ::Windows::Foundation::EventRegistrationToken Token;
67 inline void ValidateBounds(
bool b) {
69 throw ref new OutOfBoundsException;
73 inline void ValidateCounter(const ::std::shared_ptr<unsigned int>& ctr,
unsigned int good_ctr) {
74 if (*ctr != good_ctr) {
75 throw ref new ChangedStateException;
79 inline void ValidateSize(
size_t n) {
80 if (n > 0x7FFFFFFFUL) {
81 throw ref new OutOfMemoryException;
85 template <
typename T>
struct AlwaysFalse
88 template <
typename T>
struct Wrap {
92 template <
typename T>
struct Wrap<T^>
93 : public ::std::conditional<__is_winrt_agile(T), T^, Agile<T^>> { };
95 template <
typename T>
inline const T& MakeWrap(
const T& t) {
99 template <
typename T>
inline typename ::std::enable_if<!__is_winrt_agile(T), Agile<T^>>::type MakeWrap(T^
const & t) {
103 template <
typename T>
inline const T& Unwrap(
const T& t) {
107 template <
typename T>
inline T^ Unwrap(
const Agile<T^>& a) {
111 template <
typename T,
typename U>
struct VectorEnableIf
112 :
public ::std::enable_if< ::std::is_same<T, U>::value || ::std::is_same<typename Wrap<T>::type, U>::value, void **> { };
114 template <
typename X>
inline void Init(::std::shared_ptr<unsigned int>& ctr, ::std::shared_ptr<X>& sp) {
116 ctr = ::std::make_shared<unsigned int>(0);
117 sp = ::std::make_shared<X>();
121 template <
typename X,
typename A>
inline void Init(::std::shared_ptr<unsigned int>& ctr, ::std::shared_ptr<X>& sp, A&& a) {
123 ctr = ::std::make_shared<unsigned int>(0);
124 sp = ::std::make_shared<X>(::std::forward<A>(a));
126 ValidateSize(sp->size());
130 template <
typename X,
typename A,
typename B>
inline void Init(::std::shared_ptr<unsigned int>& ctr, ::std::shared_ptr<X>& sp, A&& a, B&& b) {
132 ctr = ::std::make_shared<unsigned int>(0);
133 sp = ::std::make_shared<X>(::std::forward<A>(a), ::std::forward<B>(b));
135 ValidateSize(sp->size());
139 template <
typename X,
typename A,
typename B,
typename C>
inline void Init(::std::shared_ptr<unsigned int>& ctr, ::std::shared_ptr<X>& sp, A&& a, B&& b, C&& c) {
141 ctr = ::std::make_shared<unsigned int>(0);
142 sp = ::std::make_shared<X>(::std::forward<A>(a), ::std::forward<B>(b), ::std::forward<C>(c));
144 ValidateSize(sp->size());
148 template <
typename X,
typename A>
inline void InitMoveVector(::std::shared_ptr<unsigned int>& ctr, ::std::shared_ptr<X>& sp, A&& a) {
149 Init(ctr, sp, a.begin(), a.end());
152 template <
typename X>
inline void InitMoveVector(::std::shared_ptr<unsigned int>& ctr, ::std::shared_ptr<X>& sp, X&& x) {
156 template <
typename K,
typename V,
typename M,
typename InIt>
inline void EmplaceWrappedRange(M&
m, InIt first, InIt last) {
157 for ( ; first != last; ++first) {
158 ::std::pair<const K, V> p(*first);
160 m.emplace(MakeWrap(p.first), MakeWrap(p.second));
164 template <
typename K,
typename V,
typename X,
typename A>
inline void InitMoveMap(::std::shared_ptr<unsigned int>& ctr, ::std::shared_ptr<X>& sp, A&& a) {
165 Init(ctr, sp, a.key_comp());
167 EmplaceWrappedRange<K, V>(*sp, a.begin(), a.end());
170 template <
typename K,
typename V,
typename X>
inline void InitMoveMap(::std::shared_ptr<unsigned int>& ctr, ::std::shared_ptr<X>& sp, X&& x) {
174 inline void IncrementCounter(::std::shared_ptr<unsigned int>& ctr) {
175 if (++*ctr == static_cast<unsigned int>(-1)) {
177 ctr = ::std::make_shared<unsigned int>(0);
183 VectorChangedEventArgs(WFC::CollectionChange change,
unsigned int index)
184 : m_change(change), m_index(index) { }
187 virtual property WFC::CollectionChange CollectionChange {
188 virtual WFC::CollectionChange
get() {
193 virtual property unsigned int Index {
194 virtual unsigned int get() {
195 if (m_change == WFC::CollectionChange::Reset) {
196 throw ref new FailureException;
204 WFC::CollectionChange m_change;
205 unsigned int m_index;
208 template <
typename K>
ref class MapChangedEventArgsReset
sealed :
public _COLLECTION_ATTRIBUTES WFC::IMapChangedEventArgs<K> {
210 virtual property WFC::CollectionChange CollectionChange {
211 virtual WFC::CollectionChange
get() {
212 return WFC::CollectionChange::Reset;
216 virtual property K Key {
218 throw ref new FailureException;
223 template <
typename K>
ref class MapChangedEventArgs
sealed :
public _COLLECTION_ATTRIBUTES WFC::IMapChangedEventArgs<K> {
225 MapChangedEventArgs(WFC::CollectionChange change, K key)
226 : m_change(change), m_key(key) { }
229 virtual property WFC::CollectionChange CollectionChange {
230 virtual WFC::CollectionChange
get() {
235 virtual property K Key {
237 return Unwrap(m_key);
242 WFC::CollectionChange m_change;
243 typename Wrap<K>::type m_key;
246 template <
typename T,
typename E>
inline bool VectorIndexOf(const ::std::vector<
typename Wrap<T>::type>& v, T value,
unsigned int * index) {
247 auto pred = [&](
const typename Wrap<T>::type& elem) {
return E()(Unwrap(elem), value); };
249 *index =
static_cast<unsigned int>(
::std::find_if(v.begin(), v.end(), pred) - v.begin());
251 return *index < v.size();
259 template <
typename T,
typename E>
inline bool VectorBindableIndexOf(::
std::false_type, const ::std::vector<
typename Wrap<T>::type>& v, Object^ o,
unsigned int * index) {
260 IBox<T>^ ib =
dynamic_cast<IBox<T>^
>(o);
263 return VectorIndexOf<T, E>(v, ib->Value, index);
265 *index =
static_cast<unsigned int>(v.size());
270 template <
typename T,
typename E>
inline bool VectorBindableIndexOf(::
std::true_type, const ::std::vector<
typename Wrap<T>::type>& v, Object^ o,
unsigned int * index) {
271 T t =
dynamic_cast<T
>(o);
274 return VectorIndexOf<T, E>(v, t, index);
276 *index =
static_cast<unsigned int>(v.size());
281 template <
typename T,
typename E>
inline bool VectorBindableIndexOf(const ::std::vector<
typename Wrap<T>::type>& v, Object^ o,
unsigned int * index) {
282 return VectorBindableIndexOf<T, E>(is_hat<T>(), v, o, index);
284 #endif // _COLLECTION_WUXI
286 template <
typename T>
inline unsigned int VectorGetMany(const ::std::vector<
typename Wrap<T>::type>& v,
unsigned int startIndex, WriteOnlyArray<T>^ dest) {
287 unsigned int capacity = dest->Length;
289 unsigned int actual =
static_cast<unsigned int>(v.size()) - startIndex;
291 if (actual > capacity) {
295 for (
unsigned int i = 0;
i < actual; ++
i) {
296 dest->set(
i, Unwrap(v[startIndex +
i]));
302 template <
typename T>
ref class IteratorForVectorView
sealed
305 ,
public WUXI::IBindableIterator
306 #endif // _COLLECTION_WUXI
309 typedef ::std::vector<typename Wrap<T>::type> WrappedVector;
310 typedef WFC::IIterator<T> WFC_Base;
313 typedef WUXI::IBindableIterator WUXI_Base;
314 #endif // _COLLECTION_WUXI
317 IteratorForVectorView(const ::std::shared_ptr<unsigned int>& ctr, const ::std::shared_ptr<WrappedVector>& vec)
318 : m_ctr(ctr), m_vec(vec), m_good_ctr(*ctr), m_index(0) { }
321 virtual property T Current {
323 ValidateCounter(m_ctr, m_good_ctr);
325 ValidateBounds(m_index < m_vec->
size());
327 return Unwrap((*m_vec)[m_index]);
331 virtual property bool HasCurrent {
333 ValidateCounter(m_ctr, m_good_ctr);
335 return m_index < m_vec->size();
339 virtual bool MoveNext() {
340 ValidateCounter(m_ctr, m_good_ctr);
342 ValidateBounds(m_index < m_vec->
size());
345 return m_index < m_vec->size();
348 virtual unsigned int GetMany(WriteOnlyArray<T>^ dest) {
349 ValidateCounter(m_ctr, m_good_ctr);
351 unsigned int actual = VectorGetMany(*m_vec, m_index, dest);
364 #endif // _COLLECTION_WUXI
366 ::std::shared_ptr<unsigned int> m_ctr;
367 ::std::shared_ptr<WrappedVector> m_vec;
368 unsigned int m_good_ctr;
369 unsigned int m_index;
373 template <
typename T,
typename E = ::std::equal_to<T>,
bool = __is_val
id_winrt_type(T)>
ref class Vector;
374 template <
typename T,
typename E = ::std::equal_to<T>,
bool = __is_val
id_winrt_type(T)>
ref class VectorView;
376 template <
typename T,
typename E>
ref class VectorView<T, E, false> {
377 static_assert(Details::AlwaysFalse<T>::value,
"Platform::Collections::VectorView<T, E> requires T to be a valid Windows Runtime type.");
380 template <
typename T,
typename E,
bool>
ref class VectorView
sealed
383 ,
public Details::WUXI::IBindableVectorView
384 #endif // _COLLECTION_WUXI
387 typedef ::std::vector<typename Details::Wrap<T>::type> WrappedVector;
388 typedef Details::WFC::IVectorView<T> WFC_Base;
391 typedef Details::WUXI::IBindableVectorView WUXI_Base;
392 #endif // _COLLECTION_WUXI
396 Details::Init(m_ctr, m_vec);
401 explicit VectorView(
unsigned int size) {
402 Details::Init(m_ctr, m_vec, size);
407 VectorView(
unsigned int size, T value) {
408 Details::Init(m_ctr, m_vec, size, Details::MakeWrap(value));
413 template <
typename U>
explicit VectorView(const ::std::vector<U>& v,
typename Details::VectorEnableIf<T, U>::type =
nullptr) {
414 Details::Init(m_ctr, m_vec, v.begin(), v.end());
419 template <
typename U>
explicit VectorView(::std::vector<U>&& v,
typename Details::VectorEnableIf<T, U>::type =
nullptr) {
420 Details::InitMoveVector(m_ctr, m_vec, ::
std::move(v));
425 VectorView(
const T * ptr,
unsigned int size) {
426 Details::Init(m_ctr, m_vec, ptr, ptr + size);
431 template <
size_t N>
explicit VectorView(
const T (&arr)[N]) {
432 Details::Init(m_ctr, m_vec, arr, arr + N);
437 template <
size_t N>
explicit VectorView(const ::std::array<T, N>& a) {
438 Details::Init(m_ctr, m_vec, a.begin(), a.end());
443 explicit VectorView(
const Array<T>^ arr) {
444 Details::Init(m_ctr, m_vec, arr->begin(), arr->end());
449 template <
typename InIt> VectorView(InIt first, InIt last) {
452 Details::Init(m_ctr, m_vec, first, last);
457 VectorView(::std::initializer_list<T> il) {
458 Details::Init(m_ctr, m_vec, il.begin(), il.end());
464 virtual Details::WFC::IIterator<T>^ First() = WFC_Base::First {
465 Details::ValidateCounter(m_ctr, m_good_ctr);
467 return ref new Details::IteratorForVectorView<T>(m_ctr, m_vec);
470 virtual T GetAt(
unsigned int index) = WFC_Base::GetAt {
471 Details::ValidateCounter(m_ctr, m_good_ctr);
473 Details::ValidateBounds(index < m_vec->
size());
475 return Details::Unwrap((*m_vec)[index]);
478 virtual property unsigned int Size {
479 virtual unsigned int get() {
480 Details::ValidateCounter(m_ctr, m_good_ctr);
482 return static_cast<unsigned int>(m_vec->size());
486 virtual bool IndexOf(T value,
unsigned int * index) = WFC_Base::IndexOf {
489 Details::ValidateCounter(m_ctr, m_good_ctr);
491 return Details::VectorIndexOf<T, E>(*m_vec, value, index);
494 virtual unsigned int GetMany(
unsigned int startIndex, WriteOnlyArray<T>^ dest) {
495 Details::ValidateCounter(m_ctr, m_good_ctr);
497 Details::ValidateBounds(startIndex <= m_vec->
size());
499 return Details::VectorGetMany(*m_vec, startIndex, dest);
503 friend ref class Vector<T, E>;
505 VectorView(const ::std::shared_ptr<unsigned int>& ctr, const ::std::shared_ptr<WrappedVector>& vec)
506 : m_ctr(ctr), m_vec(vec), m_good_ctr(*ctr) { }
509 virtual Details::WUXI::IBindableIterator^ BindableFirst() = WUXI_Base::First {
510 return safe_cast<Details::WUXI::IBindableIterator^>(First());
513 virtual Object^ BindableGetAt(
unsigned int index) = WUXI_Base::GetAt {
517 virtual bool BindableIndexOf(Object^ value,
unsigned int * index) = WUXI_Base::IndexOf {
520 Details::ValidateCounter(m_ctr, m_good_ctr);
522 return Details::VectorBindableIndexOf<T, E>(*m_vec, value, index);
524 #endif // _COLLECTION_WUXI
526 ::std::shared_ptr<unsigned int> m_ctr;
527 ::std::shared_ptr<WrappedVector> m_vec;
528 unsigned int m_good_ctr;
531 template <
typename T,
typename E>
ref class Vector<T, E, false> {
532 static_assert(Details::AlwaysFalse<T>::value,
"Platform::Collections::Vector<T, E> requires T to be a valid Windows Runtime type.");
535 template <
typename T,
typename E,
bool>
ref class Vector
sealed
538 ,
public Details::WUXI::IBindableObservableVector
539 #endif // _COLLECTION_WUXI
542 typedef ::std::vector<typename Details::Wrap<T>::type> WrappedVector;
543 typedef Details::WFC::IObservableVector<T> WFC_Base;
544 typedef Details::WFC::VectorChangedEventHandler<T> WFC_Handler;
547 typedef Details::WUXI::IBindableObservableVector WUXI_Base;
548 typedef Details::WUXI::BindableVectorChangedEventHandler WUXI_Handler;
549 #endif // _COLLECTION_WUXI
553 Details::Init(m_ctr, m_vec);
558 explicit Vector(
unsigned int size) {
559 Details::Init(m_ctr, m_vec, size);
564 Vector(
unsigned int size, T value) {
565 Details::Init(m_ctr, m_vec, size, Details::MakeWrap(value));
570 template <
typename U>
explicit Vector(const ::std::vector<U>& v,
typename Details::VectorEnableIf<T, U>::type =
nullptr) {
571 Details::Init(m_ctr, m_vec, v.begin(), v.end());
576 template <
typename U>
explicit Vector(::std::vector<U>&& v,
typename Details::VectorEnableIf<T, U>::type =
nullptr) {
577 Details::InitMoveVector(m_ctr, m_vec, ::
std::move(v));
582 Vector(
const T * ptr,
unsigned int size) {
583 Details::Init(m_ctr, m_vec, ptr, ptr + size);
588 template <
size_t N>
explicit Vector(
const T (&arr)[N]) {
589 Details::Init(m_ctr, m_vec, arr, arr + N);
594 template <
size_t N>
explicit Vector(const ::std::array<T, N>& a) {
595 Details::Init(m_ctr, m_vec, a.begin(), a.end());
600 explicit Vector(
const Array<T>^ arr) {
601 Details::Init(m_ctr, m_vec, arr->begin(), arr->end());
606 template <
typename InIt> Vector(InIt first, InIt last) {
609 Details::Init(m_ctr, m_vec, first, last);
614 Vector(::std::initializer_list<T> il) {
615 Details::Init(m_ctr, m_vec, il.begin(), il.end());
621 virtual Details::WFC::IIterator<T>^ First() = WFC_Base::First {
622 return ref new Details::IteratorForVectorView<T>(m_ctr, m_vec);
625 virtual T GetAt(
unsigned int index) = WFC_Base::GetAt {
626 Details::ValidateBounds(index < m_vec->
size());
628 return Details::Unwrap((*m_vec)[index]);
631 virtual property unsigned int Size {
632 virtual unsigned int get() {
633 return static_cast<unsigned int>(m_vec->size());
637 virtual bool IndexOf(T value,
unsigned int * index) = WFC_Base::IndexOf {
640 return Details::VectorIndexOf<T, E>(*m_vec, value, index);
643 virtual unsigned int GetMany(
unsigned int startIndex, WriteOnlyArray<T>^ dest) {
644 Details::ValidateBounds(startIndex <= m_vec->
size());
646 return Details::VectorGetMany(*m_vec, startIndex, dest);
649 virtual Details::WFC::IVectorView<T>^ GetView() = WFC_Base::GetView {
650 return ref new VectorView<T, E>(m_ctr, m_vec);
653 virtual void SetAt(
unsigned int index, T item) = WFC_Base::SetAt {
655 Details::IncrementCounter(m_ctr);
657 Details::ValidateBounds(index < m_vec->
size());
659 (*m_vec)[index] = item;
661 NotifyChanged(index);
665 virtual void InsertAt(
unsigned int index, T item) = WFC_Base::InsertAt {
667 Details::IncrementCounter(m_ctr);
669 Details::ValidateBounds(index <= m_vec->
size());
671 Details::ValidateSize(m_vec->size() + 1);
673 Emplace(m_vec->begin() + index, item, ::std::is_same<T, bool>());
675 NotifyInserted(index);
679 virtual void Append(T item) = WFC_Base::Append {
681 Details::IncrementCounter(m_ctr);
683 size_t n = m_vec->size();
685 Details::ValidateSize(n + 1);
687 EmplaceBack(item, ::std::is_same<T, bool>());
689 NotifyInserted(static_cast<unsigned int>(n));
693 virtual void RemoveAt(
unsigned int index) {
695 Details::IncrementCounter(m_ctr);
697 Details::ValidateBounds(index < m_vec->
size());
699 m_vec->erase(m_vec->begin() + index);
701 NotifyRemoved(index);
705 virtual void RemoveAtEnd() {
707 Details::IncrementCounter(m_ctr);
709 Details::ValidateBounds(!m_vec->empty());
713 NotifyRemoved(static_cast<unsigned int>(m_vec->size()));
717 virtual void Clear() {
719 Details::IncrementCounter(m_ctr);
727 virtual void ReplaceAll(
const Array<T>^ arr) {
729 Details::IncrementCounter(m_ctr);
731 Details::ValidateSize(arr->Length);
733 m_vec->assign(arr->begin(), arr->end());
739 virtual event WFC_Handler^ VectorChanged {
740 virtual Details::Token add(WFC_Handler^ e) = WFC_Base::VectorChanged::add {
742 return m_wfc_event += e;
751 template <
typename A,
typename B>
void Emplace(A&& a, B&& b, ::
std::false_type) {
752 m_vec->emplace(::std::forward<A>(a), ::std::forward<B>(b));
755 template <
typename A,
typename B>
void Emplace(A&& a, B&& b, ::
std::true_type) {
756 m_vec->insert(::std::forward<A>(a), ::std::forward<B>(b));
760 m_vec->emplace_back(::std::forward<A>(a));
764 m_vec->push_back(::std::forward<A>(a));
767 void Notify(Details::WFC::CollectionChange change,
unsigned int index) {
769 auto args =
ref new Details::VectorChangedEventArgs(change, index);
770 m_wfc_event(
this, args);
773 m_wuxi_event(
this, args);
774 #endif // _COLLECTION_WUXI
780 Notify(Details::WFC::CollectionChange::Reset, 0);
783 void NotifyInserted(
unsigned int index) {
784 Notify(Details::WFC::CollectionChange::ItemInserted, index);
787 void NotifyRemoved(
unsigned int index) {
788 Notify(Details::WFC::CollectionChange::ItemRemoved, index);
791 void NotifyChanged(
unsigned int index) {
792 Notify(Details::WFC::CollectionChange::ItemChanged, index);
796 virtual Details::WUXI::IBindableIterator^ BindableFirst() = WUXI_Base::First {
797 return safe_cast<Details::WUXI::IBindableIterator^>(First());
800 virtual Object^ BindableGetAt(
unsigned int index) = WUXI_Base::GetAt {
804 virtual bool BindableIndexOf(Object^ value,
unsigned int * index) = WUXI_Base::IndexOf {
807 return Details::VectorBindableIndexOf<T, E>(*m_vec, value, index);
810 virtual Details::WUXI::IBindableVectorView^ BindableGetView() = WUXI_Base::GetView {
811 return safe_cast<Details::WUXI::IBindableVectorView^>(GetView());
814 virtual void BindableSetAt(
unsigned int index, Object^ item) = WUXI_Base::SetAt {
815 SetAt(index, safe_cast<T>(item));
818 virtual void BindableInsertAt(
unsigned int index, Object^ item) = WUXI_Base::InsertAt {
819 InsertAt(index, safe_cast<T>(item));
822 virtual void BindableAppend(Object^ item) = WUXI_Base::Append {
823 Append(safe_cast<T>(item));
826 virtual Details::Token BindableEventAdd(WUXI_Handler^ e) = WUXI_Base::VectorChanged::add {
828 return m_wuxi_event += e;
834 #endif // _COLLECTION_WUXI
836 ::std::shared_ptr<unsigned int> m_ctr;
837 ::std::shared_ptr<WrappedVector> m_vec;
840 event WFC_Handler^ m_wfc_event;
843 event WUXI_Handler^ m_wuxi_event;
844 #endif // _COLLECTION_WUXI
850 template <
typename K,
typename V>
ref class KeyValuePair
sealed :
public _COLLECTION_ATTRIBUTES WFC::IKeyValuePair<K, V> {
852 KeyValuePair(
const typename Wrap<K>::type& key,
const typename Wrap<V>::type& value)
853 : m_key(key), m_value(value) { }
856 virtual property K Key {
858 return Unwrap(m_key);
862 virtual property V
Value {
864 return Unwrap(m_value);
869 typename Wrap<K>::type m_key;
870 typename Wrap<V>::type m_value;
873 template <typename K, typename F, bool = ::std::is_same<typename Wrap<K>::type, K>::value>
class WrapFunc {
878 template <
typename K,
typename F>
class WrapFunc<K, F, false> {
880 typedef WrapFunc type;
882 WrapFunc(
const F& func)
885 size_t operator()(
const Agile<K>& k)
const {
886 return m_func(k.Get());
889 bool operator()(
const Agile<K>& l,
const Agile<K>& r)
const {
890 return m_func(l.Get(), r.Get());
897 template <
typename K,
typename V,
typename C>
struct WrapMap {
898 typedef ::std::map<typename Wrap<K>::type,
typename Wrap<V>::type,
typename WrapFunc<K, C>::type> type;
901 template <
typename K,
typename V,
typename H,
typename P>
struct WrapUnorderedMap {
902 typedef ::std::unordered_map<typename Wrap<K>::type,
typename Wrap<V>::type,
typename WrapFunc<K, H>::type,
typename WrapFunc<K, P>::type> type;
905 template <
typename K,
typename V,
typename WrappedMap>
ref class IteratorForAnyMapView
sealed :
public _COLLECTION_ATTRIBUTES WFC::IIterator<WFC::IKeyValuePair<K, V>^> {
908 IteratorForAnyMapView(const ::std::shared_ptr<unsigned int>& ctr, const ::std::shared_ptr<WrappedMap>&
m)
909 : m_ctr(ctr), m_map(m), m_good_ctr(*ctr), m_iter(m->begin()) { }
912 virtual property WFC::IKeyValuePair<K, V>^ Current {
913 virtual WFC::IKeyValuePair<K, V>^
get() {
914 ValidateCounter(m_ctr, m_good_ctr);
916 ValidateBounds(m_iter != m_map->end());
918 return ref new KeyValuePair<K, V>(m_iter->first, m_iter->second);
922 virtual property bool HasCurrent {
924 ValidateCounter(m_ctr, m_good_ctr);
926 return m_iter != m_map->end();
930 virtual bool MoveNext() {
931 ValidateCounter(m_ctr, m_good_ctr);
933 ValidateBounds(m_iter != m_map->end());
936 return m_iter != m_map->end();
939 virtual unsigned int GetMany(WriteOnlyArray<WFC::IKeyValuePair<K, V>^>^ dest) {
940 ValidateCounter(m_ctr, m_good_ctr);
942 unsigned int capacity = dest->Length;
944 unsigned int actual = 0;
946 while (capacity > 0 && m_iter != m_map->end()) {
947 dest->set(actual,
ref new KeyValuePair<K, V>(m_iter->first, m_iter->second));
957 ::std::shared_ptr<unsigned int> m_ctr;
958 ::std::shared_ptr<WrappedMap> m_map;
959 unsigned int m_good_ctr;
960 typename WrappedMap::const_iterator m_iter;
964 template <
typename K,
typename V,
typename C = ::std::less<K>,
bool = __is_val
id_winrt_type(K),
bool = __is_val
id_winrt_type(V)>
ref class Map;
965 template <
typename K,
typename V,
typename C = ::std::less<K>,
bool = __is_val
id_winrt_type(K),
bool = __is_val
id_winrt_type(V)>
ref class MapView;
966 template <
typename K,
typename V,
typename H = ::std::hash<K>,
typename P = ::std::equal_to<K>,
bool = __is_val
id_winrt_type(K),
bool = __is_val
id_winrt_type(V)>
ref class UnorderedMap;
967 template <
typename K,
typename V,
typename H = ::std::hash<K>,
typename P = ::std::equal_to<K>,
bool = __is_val
id_winrt_type(K),
bool = __is_val
id_winrt_type(V)>
ref class UnorderedMapView;
969 template <
typename K,
typename V,
typename C>
ref class MapView<K, V, C, false, false> {
970 static_assert(Details::AlwaysFalse<K>::value,
"Platform::Collections::MapView<K, V, C> requires K and V to be valid Windows Runtime types.");
973 template <
typename K,
typename V,
typename C>
ref class MapView<K, V, C, false, true> {
974 static_assert(Details::AlwaysFalse<K>::value,
"Platform::Collections::MapView<K, V, C> requires K to be a valid Windows Runtime type.");
977 template <
typename K,
typename V,
typename C>
ref class MapView<K, V, C, true, false> {
978 static_assert(Details::AlwaysFalse<K>::value,
"Platform::Collections::MapView<K, V, C> requires V to be a valid Windows Runtime type.");
981 template <
typename K,
typename V,
typename C,
bool,
bool>
ref class MapView
sealed :
public _COLLECTION_ATTRIBUTES Details::WFC::IMapView<K, V> {
983 typedef typename Details::WrapMap<K, V, C>::type WrappedMap;
984 typedef Details::IteratorForAnyMapView<K, V, WrappedMap> MyIterator;
985 friend ref class Map<K, V, C>;
988 explicit MapView(
const C& comp = C()) {
989 Details::Init(m_ctr, m_map, comp);
994 explicit MapView(const ::std::map<K, V, C>&
m) {
995 Details::Init(m_ctr, m_map, m.key_comp());
997 Details::EmplaceWrappedRange<K, V>(*m_map, m.begin(), m.end());
1002 explicit MapView(::std::map<K, V, C>&& m) {
1003 Details::InitMoveMap<K, V>(m_ctr, m_map,
::std::move(m));
1008 template <
typename InIt> MapView(InIt first, InIt last,
const C& comp = C()) {
1009 Details::Init(m_ctr, m_map, comp);
1011 Details::EmplaceWrappedRange<K, V>(*m_map, first, last);
1016 MapView(::std::initializer_list< ::std::pair<const K, V>> il,
const C& comp = C()) {
1017 Details::Init(m_ctr, m_map, comp);
1019 Details::EmplaceWrappedRange<K, V>(*m_map, il.begin(), il.end());
1025 virtual Details::WFC::IIterator<Details::WFC::IKeyValuePair<K, V>^>^ First() {
1026 Details::ValidateCounter(m_ctr, m_good_ctr);
1028 return ref new MyIterator(m_ctr, m_map);
1031 virtual V Lookup(K key) {
1032 Details::ValidateCounter(m_ctr, m_good_ctr);
1034 auto i = m_map->find(Details::MakeWrap(key));
1036 Details::ValidateBounds(
i != m_map->end());
1038 return Details::Unwrap(
i->second);
1041 virtual property unsigned int Size {
1042 virtual unsigned int get() {
1043 Details::ValidateCounter(m_ctr, m_good_ctr);
1045 return static_cast<unsigned int>(m_map->size());
1049 virtual bool HasKey(K key) {
1050 Details::ValidateCounter(m_ctr, m_good_ctr);
1052 return m_map->find(Details::MakeWrap(key)) != m_map->end();
1055 virtual void Split(Details::WFC::IMapView<K, V>^ * firstPartition, Details::WFC::IMapView<K, V>^ * secondPartition) {
1056 *firstPartition =
nullptr;
1057 *secondPartition =
nullptr;
1059 Details::ValidateCounter(m_ctr, m_good_ctr);
1063 MapView(const ::std::shared_ptr<unsigned int>& ctr, const ::std::shared_ptr<WrappedMap>& m)
1064 : m_ctr(ctr), m_map(m), m_good_ctr(*ctr) { }
1066 ::std::shared_ptr<unsigned int> m_ctr;
1067 ::std::shared_ptr<WrappedMap> m_map;
1068 unsigned int m_good_ctr;
1071 template <
typename K,
typename V,
typename H,
typename P>
ref class UnorderedMapView<K, V, H, P, false, false> {
1072 static_assert(Details::AlwaysFalse<K>::value,
"Platform::Collections::UnorderedMapView<K, V, H, P> requires K and V to be valid Windows Runtime types.");
1075 template <
typename K,
typename V,
typename H,
typename P>
ref class UnorderedMapView<K, V, H, P, false, true> {
1076 static_assert(Details::AlwaysFalse<K>::value,
"Platform::Collections::UnorderedMapView<K, V, H, P> requires K to be a valid Windows Runtime type.");
1079 template <
typename K,
typename V,
typename H,
typename P>
ref class UnorderedMapView<K, V, H, P, true, false> {
1080 static_assert(Details::AlwaysFalse<K>::value,
"Platform::Collections::UnorderedMapView<K, V, H, P> requires V to be a valid Windows Runtime type.");
1083 template <
typename K,
typename V,
typename H,
typename P,
bool,
bool>
ref class UnorderedMapView
sealed
1086 typedef typename Details::WrapUnorderedMap<K, V, H, P>::type WrappedMap;
1087 typedef Details::IteratorForAnyMapView<K, V, WrappedMap> MyIterator;
1088 friend ref class UnorderedMap<K, V, H, P>;
1091 UnorderedMapView() {
1092 Details::Init(m_ctr, m_map);
1097 explicit UnorderedMapView(
size_t n) {
1098 Details::Init(m_ctr, m_map, n, H(), P());
1103 UnorderedMapView(
size_t n,
const H& h) {
1104 Details::Init(m_ctr, m_map, n, h, P());
1109 UnorderedMapView(
size_t n,
const H& h,
const P& p) {
1110 Details::Init(m_ctr, m_map, n, h, p);
1115 explicit UnorderedMapView(const ::std::unordered_map<K, V, H, P>&
m) {
1116 Details::Init(m_ctr, m_map, m.bucket_count(), m.hash_function(), m.key_eq());
1118 Details::EmplaceWrappedRange<K, V>(*m_map, m.begin(), m.end());
1123 explicit UnorderedMapView(::std::unordered_map<K, V, H, P>&& m) {
1124 Details::InitMoveMap<K, V>(m_ctr, m_map,
::std::move(m));
1129 template <
typename InIt> UnorderedMapView(InIt first, InIt last) {
1130 Details::Init(m_ctr, m_map);
1132 Details::EmplaceWrappedRange<K, V>(*m_map, first, last);
1137 template <
typename InIt> UnorderedMapView(InIt first, InIt last,
size_t n) {
1138 Details::Init(m_ctr, m_map, n, H(), P());
1140 Details::EmplaceWrappedRange<K, V>(*m_map, first, last);
1145 template <
typename InIt> UnorderedMapView(InIt first, InIt last,
size_t n,
const H& h) {
1146 Details::Init(m_ctr, m_map, n, h, P());
1148 Details::EmplaceWrappedRange<K, V>(*m_map, first, last);
1153 template <
typename InIt> UnorderedMapView(InIt first, InIt last,
size_t n,
const H& h,
const P& p) {
1154 Details::Init(m_ctr, m_map, n, h, p);
1156 Details::EmplaceWrappedRange<K, V>(*m_map, first, last);
1161 UnorderedMapView(::std::initializer_list< ::std::pair<const K, V>> il) {
1162 Details::Init(m_ctr, m_map);
1164 Details::EmplaceWrappedRange<K, V>(*m_map, il.begin(), il.end());
1169 UnorderedMapView(::std::initializer_list< ::std::pair<const K, V>> il,
size_t n) {
1170 Details::Init(m_ctr, m_map, n, H(), P());
1172 Details::EmplaceWrappedRange<K, V>(*m_map, il.begin(), il.end());
1177 UnorderedMapView(::std::initializer_list< ::std::pair<const K, V>> il,
size_t n,
const H& h) {
1178 Details::Init(m_ctr, m_map, n, h, P());
1180 Details::EmplaceWrappedRange<K, V>(*m_map, il.begin(), il.end());
1185 UnorderedMapView(::std::initializer_list< ::std::pair<const K, V>> il,
size_t n,
const H& h,
const P& p) {
1186 Details::Init(m_ctr, m_map, n, h, p);
1188 Details::EmplaceWrappedRange<K, V>(*m_map, il.begin(), il.end());
1194 virtual Details::WFC::IIterator<Details::WFC::IKeyValuePair<K, V>^>^ First() {
1195 Details::ValidateCounter(m_ctr, m_good_ctr);
1197 return ref new MyIterator(m_ctr, m_map);
1200 virtual V Lookup(K key) {
1201 Details::ValidateCounter(m_ctr, m_good_ctr);
1203 auto i = m_map->find(Details::MakeWrap(key));
1205 Details::ValidateBounds(
i != m_map->end());
1207 return Details::Unwrap(
i->second);
1210 virtual property unsigned int Size {
1211 virtual unsigned int get() {
1212 Details::ValidateCounter(m_ctr, m_good_ctr);
1214 return static_cast<unsigned int>(m_map->size());
1218 virtual bool HasKey(K key) {
1219 Details::ValidateCounter(m_ctr, m_good_ctr);
1221 return m_map->find(Details::MakeWrap(key)) != m_map->end();
1224 virtual void Split(Details::WFC::IMapView<K, V>^ * firstPartition, Details::WFC::IMapView<K, V>^ * secondPartition) {
1225 *firstPartition =
nullptr;
1226 *secondPartition =
nullptr;
1228 Details::ValidateCounter(m_ctr, m_good_ctr);
1232 UnorderedMapView(const ::std::shared_ptr<unsigned int>& ctr, const ::std::shared_ptr<WrappedMap>& m)
1233 : m_ctr(ctr), m_map(m), m_good_ctr(*ctr) { }
1235 ::std::shared_ptr<unsigned int> m_ctr;
1236 ::std::shared_ptr<WrappedMap> m_map;
1237 unsigned int m_good_ctr;
1240 template <
typename K,
typename V,
typename C>
ref class Map<K, V, C, false, false> {
1241 static_assert(Details::AlwaysFalse<K>::value,
"Platform::Collections::Map<K, V, C> requires K and V to be valid Windows Runtime types.");
1244 template <
typename K,
typename V,
typename C>
ref class Map<K, V, C, false, true> {
1245 static_assert(Details::AlwaysFalse<K>::value,
"Platform::Collections::Map<K, V, C> requires K to be a valid Windows Runtime type.");
1248 template <
typename K,
typename V,
typename C>
ref class Map<K, V, C, true, false> {
1249 static_assert(Details::AlwaysFalse<K>::value,
"Platform::Collections::Map<K, V, C> requires V to be a valid Windows Runtime type.");
1252 template <
typename K,
typename V,
typename C,
bool,
bool>
ref class Map
sealed :
public _COLLECTION_ATTRIBUTES Details::WFC::IObservableMap<K, V> {
1254 typedef typename Details::WrapMap<K, V, C>::type WrappedMap;
1255 typedef Details::IteratorForAnyMapView<K, V, WrappedMap> MyIterator;
1256 typedef MapView<K, V, C> MyView;
1257 typedef Details::WFC::MapChangedEventHandler<K, V> WFC_Handler;
1260 explicit Map(
const C& comp = C()) {
1261 Details::Init(m_ctr, m_map, comp);
1266 explicit Map(const ::std::map<K, V, C>&
m) {
1267 Details::Init(m_ctr, m_map, m.key_comp());
1269 Details::EmplaceWrappedRange<K, V>(*m_map, m.begin(), m.end());
1274 explicit Map(::std::map<K, V, C>&& m) {
1275 Details::InitMoveMap<K, V>(m_ctr, m_map,
::std::move(m));
1280 template <
typename InIt> Map(InIt first, InIt last,
const C& comp = C()) {
1281 Details::Init(m_ctr, m_map, comp);
1283 Details::EmplaceWrappedRange<K, V>(*m_map, first, last);
1288 Map(::std::initializer_list< ::std::pair<const K, V>> il,
const C& comp = C()) {
1289 Details::Init(m_ctr, m_map, comp);
1291 Details::EmplaceWrappedRange<K, V>(*m_map, il.begin(), il.end());
1297 virtual Details::WFC::IIterator<Details::WFC::IKeyValuePair<K, V>^>^ First() {
1298 return ref new MyIterator(m_ctr, m_map);
1301 virtual V Lookup(K key) {
1302 auto i = m_map->find(Details::MakeWrap(key));
1304 Details::ValidateBounds(
i != m_map->end());
1306 return Details::Unwrap(
i->second);
1309 virtual property unsigned int Size {
1310 virtual unsigned int get() {
1311 return static_cast<unsigned int>(m_map->size());
1315 virtual bool HasKey(K key) {
1316 return m_map->find(Details::MakeWrap(key)) != m_map->end();
1319 virtual Details::WFC::IMapView<K, V>^ GetView() {
1320 return ref new MyView(m_ctr, m_map);
1323 virtual bool Insert(K key, V value) {
1325 Details::IncrementCounter(m_ctr);
1327 Details::ValidateSize(m_map->size() + 1);
1329 auto p = m_map->emplace(Details::MakeWrap(key), Details::MakeWrap(value));
1332 NotifyInserted(key);
1334 p.first->second = value;
1342 virtual void Remove(K key) {
1344 Details::IncrementCounter(m_ctr);
1346 Details::ValidateBounds(m_map->erase(Details::MakeWrap(key)) == 1);
1352 virtual void Clear() {
1354 Details::IncrementCounter(m_ctr);
1362 virtual event WFC_Handler^ MapChanged {
1363 virtual Details::Token add(WFC_Handler^ e) {
1365 return m_wfc_event += e;
1368 virtual void remove(Details::Token t) {
1374 void NotifyReset() {
1376 m_wfc_event(
this,
ref new Details::MapChangedEventArgsReset<K>);
1380 void NotifyInserted(K key) {
1382 m_wfc_event(
this,
ref new Details::MapChangedEventArgs<K>(Details::WFC::CollectionChange::ItemInserted, key));
1386 void NotifyRemoved(K key) {
1388 m_wfc_event(
this,
ref new Details::MapChangedEventArgs<K>(Details::WFC::CollectionChange::ItemRemoved, key));
1392 void NotifyChanged(K key) {
1394 m_wfc_event(
this,
ref new Details::MapChangedEventArgs<K>(Details::WFC::CollectionChange::ItemChanged, key));
1398 ::std::shared_ptr<unsigned int> m_ctr;
1399 ::std::shared_ptr<WrappedMap> m_map;
1402 event WFC_Handler^ m_wfc_event;
1405 template <
typename K,
typename V,
typename H,
typename P>
ref class UnorderedMap<K, V, H, P, false, false> {
1406 static_assert(Details::AlwaysFalse<K>::value,
"Platform::Collections::UnorderedMap<K, V, H, P> requires K and V to be valid Windows Runtime types.");
1409 template <
typename K,
typename V,
typename H,
typename P>
ref class UnorderedMap<K, V, H, P, false, true> {
1410 static_assert(Details::AlwaysFalse<K>::value,
"Platform::Collections::UnorderedMap<K, V, H, P> requires K to be a valid Windows Runtime type.");
1413 template <
typename K,
typename V,
typename H,
typename P>
ref class UnorderedMap<K, V, H, P, true, false> {
1414 static_assert(Details::AlwaysFalse<K>::value,
"Platform::Collections::UnorderedMap<K, V, H, P> requires V to be a valid Windows Runtime type.");
1417 template <
typename K,
typename V,
typename H,
typename P,
bool,
bool>
ref class UnorderedMap
sealed :
public _COLLECTION_ATTRIBUTES Details::WFC::IObservableMap<K, V> {
1419 typedef typename Details::WrapUnorderedMap<K, V, H, P>::type WrappedMap;
1420 typedef Details::IteratorForAnyMapView<K, V, WrappedMap> MyIterator;
1421 typedef UnorderedMapView<K, V, H, P> MyView;
1422 typedef Details::WFC::MapChangedEventHandler<K, V> WFC_Handler;
1426 Details::Init(m_ctr, m_map);
1431 explicit UnorderedMap(
size_t n) {
1432 Details::Init(m_ctr, m_map, n, H(), P());
1437 UnorderedMap(
size_t n,
const H& h) {
1438 Details::Init(m_ctr, m_map, n, h, P());
1443 UnorderedMap(
size_t n,
const H& h,
const P& p) {
1444 Details::Init(m_ctr, m_map, n, h, p);
1449 explicit UnorderedMap(const ::std::unordered_map<K, V, H, P>& m) {
1450 Details::Init(m_ctr, m_map, m.bucket_count(), m.hash_function(), m.key_eq());
1452 Details::EmplaceWrappedRange<K, V>(*m_map, m.begin(), m.end());
1457 explicit UnorderedMap(::std::unordered_map<K, V, H, P>&& m) {
1458 Details::InitMoveMap<K, V>(m_ctr, m_map,
::std::move(m));
1463 template <
typename InIt> UnorderedMap(InIt first, InIt last) {
1464 Details::Init(m_ctr, m_map);
1466 Details::EmplaceWrappedRange<K, V>(*m_map, first, last);
1471 template <
typename InIt> UnorderedMap(InIt first, InIt last,
size_t n) {
1472 Details::Init(m_ctr, m_map, n, H(), P());
1474 Details::EmplaceWrappedRange<K, V>(*m_map, first, last);
1479 template <
typename InIt> UnorderedMap(InIt first, InIt last,
size_t n,
const H& h) {
1480 Details::Init(m_ctr, m_map, n, h, P());
1482 Details::EmplaceWrappedRange<K, V>(*m_map, first, last);
1487 template <
typename InIt> UnorderedMap(InIt first, InIt last,
size_t n,
const H& h,
const P& p) {
1488 Details::Init(m_ctr, m_map, n, h, p);
1490 Details::EmplaceWrappedRange<K, V>(*m_map, first, last);
1495 UnorderedMap(::std::initializer_list< ::std::pair<const K, V>> il) {
1496 Details::Init(m_ctr, m_map);
1498 Details::EmplaceWrappedRange<K, V>(*m_map, il.begin(), il.end());
1503 UnorderedMap(::std::initializer_list< ::std::pair<const K, V>> il,
size_t n) {
1504 Details::Init(m_ctr, m_map, n, H(), P());
1506 Details::EmplaceWrappedRange<K, V>(*m_map, il.begin(), il.end());
1511 UnorderedMap(::std::initializer_list< ::std::pair<const K, V>> il,
size_t n,
const H& h) {
1512 Details::Init(m_ctr, m_map, n, h, P());
1514 Details::EmplaceWrappedRange<K, V>(*m_map, il.begin(), il.end());
1519 UnorderedMap(::std::initializer_list< ::std::pair<const K, V>> il,
size_t n,
const H& h,
const P& p) {
1520 Details::Init(m_ctr, m_map, n, h, p);
1522 Details::EmplaceWrappedRange<K, V>(*m_map, il.begin(), il.end());
1528 virtual Details::WFC::IIterator<Details::WFC::IKeyValuePair<K, V>^>^ First() {
1529 return ref new MyIterator(m_ctr, m_map);
1532 virtual V Lookup(K key) {
1533 auto i = m_map->find(Details::MakeWrap(key));
1535 Details::ValidateBounds(
i != m_map->end());
1537 return Details::Unwrap(
i->second);
1540 virtual property unsigned int Size {
1541 virtual unsigned int get() {
1542 return static_cast<unsigned int>(m_map->size());
1546 virtual bool HasKey(K key) {
1547 return m_map->find(Details::MakeWrap(key)) != m_map->end();
1550 virtual Details::WFC::IMapView<K, V>^ GetView() {
1551 return ref new MyView(m_ctr, m_map);
1554 virtual bool Insert(K key, V value) {
1556 Details::IncrementCounter(m_ctr);
1558 Details::ValidateSize(m_map->size() + 1);
1560 auto p = m_map->emplace(Details::MakeWrap(key), Details::MakeWrap(value));
1563 NotifyInserted(key);
1565 p.first->second = value;
1573 virtual void Remove(K key) {
1575 Details::IncrementCounter(m_ctr);
1577 Details::ValidateBounds(m_map->erase(Details::MakeWrap(key)) == 1);
1583 virtual void Clear() {
1585 Details::IncrementCounter(m_ctr);
1593 virtual event WFC_Handler^ MapChanged {
1594 virtual Details::Token add(WFC_Handler^ e) {
1596 return m_wfc_event += e;
1599 virtual void remove(Details::Token t) {
1605 void NotifyReset() {
1607 m_wfc_event(
this,
ref new Details::MapChangedEventArgsReset<K>);
1611 void NotifyInserted(K key) {
1613 m_wfc_event(
this,
ref new Details::MapChangedEventArgs<K>(Details::WFC::CollectionChange::ItemInserted, key));
1617 void NotifyRemoved(K key) {
1619 m_wfc_event(
this,
ref new Details::MapChangedEventArgs<K>(Details::WFC::CollectionChange::ItemRemoved, key));
1623 void NotifyChanged(K key) {
1625 m_wfc_event(
this,
ref new Details::MapChangedEventArgs<K>(Details::WFC::CollectionChange::ItemChanged, key));
1629 ::std::shared_ptr<unsigned int> m_ctr;
1630 ::std::shared_ptr<WrappedMap> m_map;
1633 event WFC_Handler^ m_wfc_event;
1637 template <
typename X>
class InputIterator;
1638 template <
typename T>
class VectorIterator;
1639 template <
typename T>
class VectorViewIterator;
1640 template <
typename T>
class BackInsertIterator;
1644 template <
typename X> struct ::std::_Is_checked_helper< ::Platform::Collections::InputIterator<X>>
1647 template <
typename T> struct ::std::_Is_checked_helper< ::Platform::Collections::VectorIterator<T>>
1650 template <
typename T> struct ::std::_Is_checked_helper< ::Platform::Collections::VectorViewIterator<T>>
1653 template <
typename T> struct ::std::_Is_checked_helper< ::Platform::Collections::BackInsertIterator<T>>
1657 namespace Collections {
1658 template <
typename X>
class InputIterator {
1660 typedef ::std::input_iterator_tag iterator_category;
1661 typedef X value_type;
1663 typedef const X * pointer;
1664 typedef const X & reference;
1668 explicit InputIterator(Details::WFC::IIterator<X>^ iter) {
1669 if (iter->HasCurrent) {
1671 m_val = iter->Current;
1675 bool operator==(
const InputIterator& other)
const {
1676 return !!m_iter == !!other.m_iter;
1679 bool operator!=(
const InputIterator& other)
const {
1680 return !(*
this == other);
1687 pointer operator->()
const {
1691 InputIterator& operator++() {
1692 if (m_iter->MoveNext()) {
1693 m_val = m_iter->Current;
1701 InputIterator operator++(
int) {
1702 InputIterator old(*
this);
1708 Details::WFC::IIterator<X>^ m_iter;
1713 template <
typename T>
class VectorProxy {
1715 VectorProxy(WFC::IVector<T>^ v,
ptrdiff_t n)
1716 : m_v(v), m_i(static_cast<unsigned int>(n)) { }
1718 VectorProxy& operator=(
const VectorProxy& other) {
1719 m_v->SetAt(m_i, other.m_v->GetAt(other.m_i));
1723 VectorProxy& operator=(T t) {
1728 operator T()
const {
1729 return m_v->GetAt(m_i);
1732 T operator->()
const {
1733 return m_v->GetAt(m_i);
1736 void swap(
const VectorProxy& other)
const {
1737 T t1(m_v->GetAt(m_i));
1738 T t2(other.m_v->GetAt(other.m_i));
1740 m_v->SetAt(m_i, t2);
1741 other.m_v->SetAt(other.m_i, t1);
1744 void swap(T& t)
const {
1746 t = m_v->GetAt(m_i);
1747 m_v->SetAt(m_i, temp);
1751 WFC::IVector<T>^ m_v;
1755 template <
typename T>
inline void swap(
const VectorProxy<T>& l,
const VectorProxy<T>& r) {
1759 template <
typename T>
inline void swap(
const VectorProxy<T>& p, T& t) {
1763 template <
typename T>
inline void swap(T& t,
const VectorProxy<T>& p) {
1767 template <
typename T>
inline bool operator==(
const VectorProxy<T>& l,
const VectorProxy<T>& r) {
1768 return static_cast<T
>(l) == static_cast<T>(r);
1771 template <
typename T>
inline bool operator==(
const VectorProxy<T>& l,
const T& t) {
1772 return static_cast<T
>(l) == t;
1775 template <
typename T>
inline bool operator==(
const T& t,
const VectorProxy<T>& r) {
1776 return t ==
static_cast<T
>(r);
1779 template <
typename T>
inline bool operator!=(
const VectorProxy<T>& l,
const VectorProxy<T>& r) {
1780 return static_cast<T
>(l) != static_cast<T>(r);
1783 template <
typename T>
inline bool operator!=(
const VectorProxy<T>& l,
const T& t) {
1784 return static_cast<T
>(l) != t;
1787 template <
typename T>
inline bool operator!=(
const T& t,
const VectorProxy<T>& r) {
1788 return t !=
static_cast<T
>(r);
1791 template <
typename T>
inline bool operator<(const VectorProxy<T>& l,
const VectorProxy<T>& r) {
1792 return static_cast<T
>(l) < static_cast<T>(r);
1795 template <
typename T>
inline bool operator<(const VectorProxy<T>& l,
const T& t) {
1796 return static_cast<T
>(l) < t;
1799 template <
typename T>
inline bool operator<(const T& t, const VectorProxy<T>& r) {
1800 return t < static_cast<T>(r);
1803 template <
typename T>
inline bool operator<=(const VectorProxy<T>& l,
const VectorProxy<T>& r) {
1804 return static_cast<T
>(l) <= static_cast<T>(r);
1807 template <
typename T>
inline bool operator<=(const VectorProxy<T>& l,
const T& t) {
1808 return static_cast<T
>(l) <= t;
1811 template <
typename T>
inline bool operator<=(const T& t, const VectorProxy<T>& r) {
1812 return t <= static_cast<T>(r);
1815 template <
typename T>
inline bool operator>(
const VectorProxy<T>& l,
const VectorProxy<T>& r) {
1816 return static_cast<T
>(l) > static_cast<T>(r);
1819 template <
typename T>
inline bool operator>(
const VectorProxy<T>& l,
const T& t) {
1820 return static_cast<T
>(l) > t;
1823 template <
typename T>
inline bool operator>(
const T& t,
const VectorProxy<T>& r) {
1824 return t >
static_cast<T
>(r);
1827 template <
typename T>
inline bool operator>=(
const VectorProxy<T>& l,
const VectorProxy<T>& r) {
1828 return static_cast<T
>(l) >= static_cast<T>(r);
1831 template <
typename T>
inline bool operator>=(
const VectorProxy<T>& l,
const T& t) {
1832 return static_cast<T
>(l) >= t;
1835 template <
typename T>
inline bool operator>=(
const T& t,
const VectorProxy<T>& r) {
1836 return t >=
static_cast<T
>(r);
1839 template <
typename T>
class ArrowProxy {
1841 explicit ArrowProxy(T t)
1844 const T * operator->()
const {
1853 template <
typename T>
class VectorIterator {
1855 typedef ::std::random_access_iterator_tag iterator_category;
1856 typedef T value_type;
1858 typedef Details::VectorProxy<T> * pointer;
1859 typedef Details::VectorProxy<T> reference;
1862 : m_v(
nullptr), m_i(0) { }
1864 explicit VectorIterator(Details::WFC::IVector<T>^ v)
1865 : m_v(v), m_i(0) { }
1868 return reference(m_v, m_i);
1871 Details::ArrowProxy<T> operator->()
const {
1872 return Details::ArrowProxy<T>(m_v->GetAt(static_cast<unsigned int>(m_i)));
1875 reference operator[](difference_type n)
const {
1876 return reference(m_v, m_i + n);
1879 VectorIterator& operator++() {
1884 VectorIterator& operator--() {
1889 VectorIterator operator++(
int) {
1890 VectorIterator old(*
this);
1895 VectorIterator operator--(
int) {
1896 VectorIterator old(*
this);
1901 VectorIterator& operator+=(difference_type n) {
1906 VectorIterator& operator-=(difference_type n) {
1911 VectorIterator
operator+(difference_type n)
const {
1912 VectorIterator ret(*
this);
1917 VectorIterator
operator-(difference_type n)
const {
1918 VectorIterator ret(*
this);
1923 difference_type
operator-(
const VectorIterator& other)
const {
1924 return m_i - other.m_i;
1927 bool operator==(
const VectorIterator& other)
const {
1928 return m_i == other.m_i;
1931 bool operator!=(
const VectorIterator& other)
const {
1932 return m_i != other.m_i;
1935 bool operator<(
const VectorIterator& other)
const {
1936 return m_i < other.m_i;
1939 bool operator>(
const VectorIterator& other)
const {
1940 return m_i > other.m_i;
1943 bool operator<=(
const VectorIterator& other)
const {
1944 return m_i <= other.m_i;
1947 bool operator>=(
const VectorIterator& other)
const {
1948 return m_i >= other.m_i;
1952 Details::WFC::IVector<T>^ m_v;
1953 difference_type m_i;
1956 template <
typename T>
inline VectorIterator<T>
operator+(
ptrdiff_t n,
const VectorIterator<T>&
i) {
1960 template <
typename T>
class VectorViewIterator {
1962 typedef ::std::random_access_iterator_tag iterator_category;
1963 typedef T value_type;
1965 typedef T * pointer;
1966 typedef T reference;
1968 VectorViewIterator()
1969 : m_v(
nullptr), m_i(0) { }
1971 explicit VectorViewIterator(Details::WFC::IVectorView<T>^ v)
1972 : m_v(v), m_i(0) { }
1975 return m_v->GetAt(static_cast<unsigned int>(m_i));
1978 Details::ArrowProxy<T> operator->()
const {
1979 return Details::ArrowProxy<T>(m_v->GetAt(static_cast<unsigned int>(m_i)));
1982 reference operator[](difference_type n)
const {
1983 return m_v->GetAt(static_cast<unsigned int>(m_i + n));
1986 VectorViewIterator& operator++() {
1991 VectorViewIterator& operator--() {
1996 VectorViewIterator operator++(
int) {
1997 VectorViewIterator old(*
this);
2002 VectorViewIterator operator--(
int) {
2003 VectorViewIterator old(*
this);
2008 VectorViewIterator& operator+=(difference_type n) {
2013 VectorViewIterator& operator-=(difference_type n) {
2018 VectorViewIterator
operator+(difference_type n)
const {
2019 VectorViewIterator ret(*
this);
2024 VectorViewIterator
operator-(difference_type n)
const {
2025 VectorViewIterator ret(*
this);
2030 difference_type
operator-(
const VectorViewIterator& other)
const {
2031 return m_i - other.m_i;
2034 bool operator==(
const VectorViewIterator& other)
const {
2035 return m_i == other.m_i;
2038 bool operator!=(
const VectorViewIterator& other)
const {
2039 return m_i != other.m_i;
2042 bool operator<(
const VectorViewIterator& other)
const {
2043 return m_i < other.m_i;
2046 bool operator>(
const VectorViewIterator& other)
const {
2047 return m_i > other.m_i;
2050 bool operator<=(
const VectorViewIterator& other)
const {
2051 return m_i <= other.m_i;
2054 bool operator>=(
const VectorViewIterator& other)
const {
2055 return m_i >= other.m_i;
2059 Details::WFC::IVectorView<T>^ m_v;
2060 difference_type m_i;
2063 template <
typename T>
inline VectorViewIterator<T>
operator+(
ptrdiff_t n,
const VectorViewIterator<T>& i) {
2067 template <
typename T>
class BackInsertIterator
2068 :
public ::std::iterator< ::std::output_iterator_tag, void, void, void, void> {
2070 explicit BackInsertIterator(Details::WFC::IVector<T>^ v) : m_v(v) { }
2072 BackInsertIterator& operator=(
const T& t) {
2081 BackInsertIterator& operator++() {
2085 BackInsertIterator operator++(
int) {
2090 Details::WFC::IVector<T>^ m_v;
2094 template <
typename T,
typename I> inline ::std::vector<T> ToVector(I^ v) {
2095 unsigned int size = v->Size;
2097 ::std::vector<T> ret(size);
2099 for (
unsigned int actual = 0; actual <
size; ) {
2100 Array<T>^ arr =
ref new Array<T>(size - actual);
2102 unsigned int n = v->GetMany(actual, arr);
2105 throw ref new FailureException;
2120 namespace Foundation {
2121 namespace Collections {
2122 template <
typename X> inline ::Platform::Collections::InputIterator<X>
begin(IIterable<X>^
i) {
2123 return ::Platform::Collections::InputIterator<X>(i->First());
2126 template <
typename X> inline ::Platform::Collections::InputIterator<X>
end(IIterable<X>^) {
2127 return ::Platform::Collections::InputIterator<X>();
2130 template <
typename T> inline ::Platform::Collections::VectorIterator<T>
begin(IVector<T>^ v) {
2131 return ::Platform::Collections::VectorIterator<T>(v);
2134 template <
typename T> inline ::Platform::Collections::VectorIterator<T>
end(IVector<T>^ v) {
2135 return ::Platform::Collections::VectorIterator<T>(v) + v->Size;
2138 template <
typename T> inline ::Platform::Collections::VectorViewIterator<T>
begin(IVectorView<T>^ v) {
2139 return ::Platform::Collections::VectorViewIterator<T>(v);
2142 template <
typename T> inline ::Platform::Collections::VectorViewIterator<T>
end(IVectorView<T>^ v) {
2143 return ::Platform::Collections::VectorViewIterator<T>(v) + v->Size;
2146 template <
typename T> inline ::std::vector<T> to_vector(IVector<T>^ v) {
2147 return ::Platform::Collections::Details::ToVector<T>(v);
2150 template <
typename T> inline ::std::vector<T> to_vector(IVectorView<T>^ v) {
2151 return ::Platform::Collections::Details::ToVector<T>(v);
2154 template <
typename T> inline ::Platform::Collections::BackInsertIterator<T>
back_inserter(IVector<T>^ v) {
2155 return ::Platform::Collections::BackInsertIterator<T>(v);
2158 template <
typename T> inline ::Platform::Collections::BackInsertIterator<T>
back_inserter(IObservableVector<T>^ v) {
2159 return ::Platform::Collections::BackInsertIterator<T>(v);
2166 namespace Collections {
2167 template <
typename T,
typename E>
inline BackInsertIterator<T>
back_inserter(Vector<T, E>^ v) {
2168 return BackInsertIterator<T>(v);
2173 template <> struct ::std::hash< ::Platform::String^>
2174 : public ::std::unary_function< ::Platform::String^, size_t> {
2176 size_t operator()(::Platform::String^ s)
const {
2181 #undef _COLLECTION_ATTRIBUTES
2182 #undef _COLLECTION_TRANSLATE
2183 #undef _COLLECTION_WUXI
2185 #pragma warning(pop)
2188 #endif // RC_INVOKED
2190 #endif // _COLLECTION_H_
_OutIt copy_n(_InIt _First, _Diff _Count, _OutIt _Dest)
Definition: xutility:2454
reference_wrapper< _Ty > ref(_Ty &_Val) _NOEXCEPT
Definition: type_traits:1617
constexpr auto size(const _Container &_Cont) -> decltype(_Cont.size())
Definition: xutility:1478
_FwdIt remove(_FwdIt _First, _FwdIt _Last, const _Ty &_Val)
Definition: algorithm:1463
back_insert_iterator< _Container > back_inserter(_Container &_Cont)
Definition: iterator:69
constexpr _Ty & get(array< _Ty, _Size > &_Arr) _NOEXCEPT
Definition: array:493
std::enable_if< details::_Is_extent_or_index< _Tuple_type< _Rank > >::value, _Tuple_type< _Rank > >::type operator*(const _Tuple_type< _Rank > &_Lhs, typename _Tuple_type< _Rank >::value_type _Rhs) __GPU
Definition: amp.h:890
__m128d m
Definition: dvec.h:69
int ptrdiff_t
Definition: vcruntime.h:199
integral_constant< bool, false > false_type
Definition: xtr1common:41
_STD_BEGIN size_t _Hash_seq(const unsigned char *_First, size_t _Count)
Definition: xstddef:335
int i[4]
Definition: dvec.h:68
std::enable_if< details::_Is_extent_or_index< _Tuple_type< _Rank > >::value, _Tuple_type< _Rank > >::type operator-(const _Tuple_type< _Rank > &_Lhs, const _Tuple_type< _Rank > &_Rhs) __GPU
Definition: amp.h:845
std::enable_if< details::_Is_extent_or_index< _Tuple_type< _Rank > >::value, _Tuple_type< _Rank > >::type operator+(const _Tuple_type< _Rank > &_Lhs, const _Tuple_type< _Rank > &_Rhs) __GPU
Definition: amp.h:836
Definition: vccorlib.h:117
_InIt find_if(_InIt _First, _InIt _Last, _Pr _Pred)
Definition: algorithm:94
void swap(array< _Ty, _Size > &_Left, array< _Ty, _Size > &_Right) _NOEXCEPT_OP(_NOEXCEPT_OP(_Left.swap(_Right)))
Definition: array:433
unsigned short wchar_t
Definition: sourceannotations.h:25
bool operator<=(const unorm &_Lhs, const unorm &_Rhs) __GPU
Definition: amp_short_vectors.h:480
integral_constant< bool, true > true_type
Definition: xtr1common:40
constexpr remove_reference< _Ty >::type && move(_Ty &&_Arg) _NOEXCEPT
Definition: type_traits:1290
#define _COLLECTION_TRANSLATE
Definition: collection.h:35
bool operator>=(const unorm &_Lhs, const unorm &_Rhs) __GPU
Definition: amp_short_vectors.h:470
#define _COLLECTION_ATTRIBUTES
Definition: collection.h:33
bool operator>(const unorm &_Lhs, const unorm &_Rhs) __GPU
Definition: amp_short_vectors.h:450