diff --git a/PInvoke/Shared/InteropServices/SafeNativeListBase.cs b/PInvoke/Shared/InteropServices/SafeNativeListBase.cs new file mode 100644 index 00000000..abca1d34 --- /dev/null +++ b/PInvoke/Shared/InteropServices/SafeNativeListBase.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using Vanara.PInvoke; + +namespace Vanara.InteropServices +{ + /// An abstract base class for a safe, unmanaged list of structures allocated by a memory scheme. + /// The type of the list elements. + /// The type of memory allocation to use. + public abstract class SafeNativeListBase : SafeMemoryHandle, IReadOnlyList where TElem : struct where TMem : IMemoryMethods, new() + { + /// Initializes a new instance of the class. + /// The handle. + /// The size of memory allocated to the handle, in bytes. + /// if set to true if this class is responsible for freeing the memory on disposal. + protected SafeNativeListBase(IntPtr ptr, SizeT size, bool ownsHandle) : base(ptr, size, ownsHandle) { } + + /// Initializes a new instance of the class. + /// The number of bytes to allocate for this new array. + public SafeNativeListBase(SizeT byteCount) : base(byteCount) { } + + /// Gets the number of elements contained in the . + public virtual int Count => IsInvalid ? 0 : Items.Count(); + + /// Enumerates the elements. + /// An enumeration of values from the pointer. + protected abstract IEnumerable Items { get; } + + /// Gets or sets the value at the specified index. + /// The value. + /// The index. + /// + /// index or index + public virtual TElem this[int index] => Items.ElementAt(index); + + /// Determines whether this instance contains the object. + /// The object to locate in the . + /// + /// true if is found in the ; otherwise, false. + /// + public virtual bool Contains(TElem item) => Items.Contains(item); + + /// Returns an enumerator that iterates through the collection. + /// A that can be used to iterate through the collection. + public virtual IEnumerator GetEnumerator() => Items.GetEnumerator(); + + /// Returns an enumerator that iterates through a collection. + /// An object that can be used to iterate through the collection. + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + } +} \ No newline at end of file