#pragma once using namespace System; using namespace System::Collections::Generic; delegate int GetCount(); generic delegate T GetValue(int index); generic delegate void AddValue(T value); template ref class IEnumeratorImpl; template ref class ListImplBase : IReadOnlyList { protected: GetCount^ getCount; GetValue^ getValue; virtual System::Collections::IEnumerator^ ObjGetEnum() = System::Collections::IEnumerable::GetEnumerator{ return GetEnumerator(); } public: ListImplBase(GetCount^ gc, GetValue^ gv) : getCount(gc), getValue(gv) { } ~ListImplBase() {} !ListImplBase() { getCount = nullptr; getValue = nullptr; } virtual property int Count { int get() { return getCount(); } } virtual property T default[Int32] { T get(Int32 index) { return getValue(index); } } virtual System::Collections::Generic::IEnumerator^ GetEnumerator() { return gcnew ListEnumerator(this); } }; template ref class AppendOnlyList : public ListImplBase, public Vanara::PInvoke::VssApi::IAppendOnlyList { protected: AddValue^ addValue; public: AppendOnlyList(GetCount^ gc, GetValue^ gv, AddValue^ add) : ListImplBase(gc, gv), addValue(add) {} ~AppendOnlyList() {} !AppendOnlyList() { addValue = nullptr; } virtual void Add(T item) { addValue(item); } }; template ref class ListEnumerator : public IEnumerator { protected: ListImplBase^ list; int i; public: ListEnumerator(ListImplBase^ l) : list(l), i(0) { } ~ListEnumerator() {} !ListEnumerator() { list = nullptr; } virtual property T Current { T get() { return list->default[i]; } } virtual bool MoveNext() { return i++ <= list->Count; } virtual void Reset() { i = 0; } private: property Object^ ObjectCurrent { virtual Object^ get() sealed = System::Collections::IEnumerator::Current::get{ return Current; } }; };