Files
Bachelor-Arbeit-Adrian-Haefner/Library/PackageCache/com.unity.xr.arfoundation@ef86c118adc4/Runtime/ARFoundation/TrackableCollection.cs
adriadri6972 d3d9c5f833 upload project
2025-07-31 15:21:08 +02:00

201 lines
8.5 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine.XR.ARSubsystems;
namespace UnityEngine.XR.ARFoundation
{
/// <summary>
/// A collection for <see cref="ARTrackable{TSessionRelativeData, TTrackable}"/>s.
/// This collection implements an IEnumerable-like interface which can be used
/// in a <c>foreach</c> statement.
/// </summary>
/// <typeparam name="TTrackable">The concrete <see cref="ARTrackable{TSessionRelativeData, TTrackable}"/>.</typeparam>
public struct TrackableCollection<TTrackable> : IEquatable<TrackableCollection<TTrackable>>
{
/// <summary>
/// Creates an <c>Enumerator</c> for this collection.
/// </summary>
/// <returns>An <c>Enumerator</c>.</returns>
public Enumerator GetEnumerator()
{
return new Enumerator(m_Trackables);
}
/// <summary>
/// Constructs a <see cref="TrackableCollection{TTrackable}"/>.
/// </summary>
/// <param name="trackables">A <c>Dictionary</c> of <c>TTrackable</c>s.</param>
public TrackableCollection(Dictionary<TrackableId, TTrackable> trackables)
{
if (trackables == null)
throw new ArgumentNullException("trackables");
m_Trackables = trackables;
}
/// <summary>
/// Returns the number of trackables in this collection.
/// </summary>
public int count
{
get
{
if (m_Trackables == null)
throw new InvalidOperationException("This collection has not been initialized.");
return m_Trackables.Count;
}
}
/// <summary>
/// Retrieves a <c>TTrackable</c>s by <c>TrackableId</c>.
/// </summary>
/// <param name="trackableId">The trackable id associated with the trackable to retrieve.</param>
/// <value>The <c>TTrackable</c>s if present. Throws <c>KeyNotFoundException</c> if the <paramref name="trackableId"/> is not found.</value>
public TTrackable this[TrackableId trackableId]
{
get
{
if (m_Trackables == null)
throw new InvalidOperationException("This collection has not been initialized.");
try
{
return m_Trackables[trackableId];
}
catch (KeyNotFoundException e)
{
throw new KeyNotFoundException(
string.Format("Trackable with id {0} does not exist in this collection.", trackableId),
e);
}
}
}
/// <summary>
/// Retrieves the hashcode of the <see cref="TrackableCollection{TTrackable}"/>.
/// </summary>
/// <returns>The hashcode of if the <see cref="TrackableCollection{TTrackable}"/> is instantiated and <c>0</c> if it is <c>null</c>.</returns>
public override int GetHashCode()
{
unchecked
{
return m_Trackables == null ? 0 : m_Trackables.GetHashCode();
}
}
/// <summary>
/// Checks the equality of this object against this <see cref="TrackableCollection{TTrackable}"/>.
/// </summary>
/// <param name="obj">The object that this collection should be checked against for equivalency.</param>
/// <returns><c>true</c> if the object is a <see cref="TrackableCollection{TTrackable}"/> and is considered equivalent to this and <c>false</c> otherwise.</returns>
public override bool Equals(object obj)
{
if (!(obj is TrackableCollection<TTrackable>))
return false;
return Equals((TrackableCollection<TTrackable>) obj);
}
/// <summary>
/// Checks the equality of this <see cref="TrackableCollection{TTrackable}"/> against another <see cref="TrackableCollection{TTrackable}"/> of the same <c>TTrackable</c> generic type.
/// </summary>
/// <param name="other">The <see cref="TrackableCollection{TTrackable}"/> that this collection should be checked against for equivalency.</param>
/// <returns><c>true</c> if the two <see cref="TrackableCollection{TTrackable}"/>s are considered equivalent and <c>false</c> otherwise.</returns>
public bool Equals(TrackableCollection<TTrackable> other)
{
return ReferenceEquals(m_Trackables, other.m_Trackables);
}
/// <summary>
/// Overloads the <c>==</c> operator to use the equals method for equality checking.
/// </summary>
/// <param name="lhs">The <see cref="TrackableCollection{TTrackable}"/> on the left hand side of the operator.</param>
/// <param name="rhs">The <see cref="TrackableCollection{TTrackable}"/> on the right hand side of the operator.</param>
/// <returns><c>true</c> if the two <see cref="TrackableCollection{TTrackable}"/>s are considered equivalent and <c>false</c> otherwise.</returns>
/// <seealso cref="TrackableCollection{TTrackable}.Equals(TrackableCollection{TTrackable})"/>
public static bool operator ==(TrackableCollection<TTrackable> lhs, TrackableCollection<TTrackable> rhs)
{
return lhs.Equals(rhs);
}
/// <summary>
/// Overloads the <c>!=</c> operator to use the equals method for equality checking.
/// </summary>
/// <param name="lhs">The <see cref="TrackableCollection{TTrackable}"/> on the left hand side of the operator.</param>
/// <param name="rhs">The <see cref="TrackableCollection{TTrackable}"/> on the right hand side of the operator.</param>
/// <returns><c>true</c> if the two <see cref="TrackableCollection{TTrackable}"/>s are not considered equivalent and <c>false</c> otherwise.</returns>
/// <seealso cref="TrackableCollection{TTrackable}.Equals(TrackableCollection{TTrackable})"/>
public static bool operator !=(TrackableCollection<TTrackable> lhs, TrackableCollection<TTrackable> rhs)
{
return !lhs.Equals(rhs);
}
/// <summary>
/// Attempts to retrieve a trackable by <c>TrackableId</c>.
/// </summary>
/// <param name="trackableId">The trackable id associated with the trackable to retrieve.</param>
/// <param name="trackable">Set to the trackable with <paramref name="trackableId"/>, if present in the collection.</param>
/// <returns><c>true</c> if the trackable with <paramref name="trackableId"/> exists. <c>false</c> otherwise.</returns>
public bool TryGetTrackable(TrackableId trackableId, out TTrackable trackable)
{
if (m_Trackables == null)
throw new InvalidOperationException("This collection has not been initialized.");
return m_Trackables.TryGetValue(trackableId, out trackable);
}
/// <summary>
/// An <c>Enumerator</c> for <c>TTrackable</c>s.
/// </summary>
public struct Enumerator
{
/// <summary>
/// Constructs an <c>Enumerator</c> for use with <c>TTrackable</c>s.
/// </summary>
/// <param name="trackables">A <c>Dictionary</c> of <c>TTrackable</c>s.</param>
public Enumerator(Dictionary<TrackableId, TTrackable> trackables)
{
if (trackables == null)
throw new ArgumentNullException("trackables");
m_Enumerator = trackables.GetEnumerator();
}
/// <summary>
/// Moves to the next trackable in the collection.
/// </summary>
/// <returns><c>true</c> if the next trackable is valid, or <c>false</c> if it is the end of the collection.</returns>
public bool MoveNext()
{
return m_Enumerator.MoveNext();
}
/// <summary>
/// The current value in the collection.
/// </summary>
public TTrackable Current
{
get
{
return m_Enumerator.Current.Value;
}
}
/// <summary>
/// Releases all resources used by this <c>Enumerator</c>.
/// </summary>
public void Dispose()
{
m_Enumerator.Dispose();
}
Dictionary<TrackableId, TTrackable>.Enumerator m_Enumerator;
}
Dictionary<TrackableId, TTrackable> m_Trackables;
}
}