Files
libremetaverse/LibreMetaverse.LslTools/ObjectList.cs
Cinder Roxley 6ee065573e Easy returns
2024-07-01 12:17:07 -05:00

119 lines
3.5 KiB
C#

/*
* Copyright (c) 2019-2024, Sjofn LLC
* All rights reserved.
*
* - Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* - Neither the name of the openmetaverse.co nor the names
* of its contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
using System.Collections;
namespace LibreMetaverse
{
public class ObjectList
{
private ObjectList.Link head;
private ObjectList.Link last;
private void Add0(ObjectList.Link a)
{
if (this.head == null)
this.head = this.last = a;
else
this.last = this.last.next = a;
}
private object Get0(ObjectList.Link a, int x)
{
if (a == null || x < 0)
return (object)null;
return x == 0 ? a.it : this.Get0(a.next, x - 1);
}
public void Add(object o)
{
this.Add0(new ObjectList.Link(o, (ObjectList.Link)null));
++this.Count;
}
public void Push(object o)
{
this.head = new ObjectList.Link(o, this.head);
++this.Count;
}
public object Pop()
{
object it = this.head.it;
this.head = this.head.next;
--this.Count;
return it;
}
public object Top => this.head.it;
public int Count { get; private set; }
public object this[int ix] => this.Get0(this.head, ix);
public IEnumerator GetEnumerator()
{
return (IEnumerator)new ObjectList.OListEnumerator(this);
}
private class Link
{
internal object it;
internal ObjectList.Link next;
internal Link(object o, ObjectList.Link x)
{
this.it = o;
this.next = x;
}
}
public class OListEnumerator : IEnumerator
{
private ObjectList list;
private ObjectList.Link cur;
public OListEnumerator(ObjectList o)
{
this.list = o;
}
public object Current => this.cur.it;
public bool MoveNext()
{
this.cur = this.cur != null ? this.cur.next : this.list.head;
return this.cur != null;
}
public void Reset()
{
this.cur = (ObjectList.Link)null;
}
}
}
}