/******************************************************************************
* Copyright (C) Ultraleap, Inc. 2011-2021. *
* *
* Use subject to the terms of the Apache License 2.0 available at *
* http://www.apache.org/licenses/LICENSE-2.0, or another agreement *
* between Ultraleap and you, your company or other organization. *
******************************************************************************/
using Leap.Unity.Query;
namespace Leap.Unity
{
///
/// This easy-to-implement interface represents the ability to index into a collection
/// of elements of type T. IIndexables inherit Query() via an extension method.
///
/// IIndexable is fire-and-forget if your implementer is a reference type (class). If
/// the implementing type is a struct, be mindful of boxing, and consider using
/// IIndexableStruct and pooling instead.
///
public interface IIndexable
{
T this[int idx] { get; }
int Count { get; }
}
public static class IIndexableExtensions
{
public static IndexableEnumerator GetEnumerator(this IIndexable indexable)
{
return new IndexableEnumerator(indexable);
}
public static Query Query(this IIndexable indexable)
{
var arr = ArrayPool.Spawn(indexable.Count);
for (int i = 0; i < indexable.Count; i++)
{
arr[i] = indexable[i];
}
return new Query(arr, indexable.Count);
}
}
public struct IndexableEnumerator
{
IIndexable indexable;
int index;
public IndexableEnumerator(IIndexable indexable)
{
this.indexable = indexable;
index = -1;
}
public IndexableEnumerator GetEnumerator()
{
return this;
}
public bool MoveNext()
{
if (indexable == null) return false;
index++; return index < indexable.Count;
}
public void Reset()
{
index = -1;
}
public Element Current { get { return indexable[index]; } }
}
}