using System;
using System.Collections;
using System.Linq;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using miew.ReadOnly;
using miew.Enumerable;
using miew.String;
using miew.Tokenization;
using miew.Debugging;
namespace agree
{
public abstract partial class PassiveEdge : ArrayTfs, IParseObj
{
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
///
/// </summary>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public struct ParseObjs : IReadOnlyCollection<IParseObj>
{
readonly int c_args;
readonly IParseObj ce0, ce1, ce2, ce3;
public ParseObjs(IParseObj ce0)
{
this.c_args = 1;
this.ce0 = ce0;
ce1 = ce2 = ce3 = null;
}
public ParseObjs(IParseObj prepend, ParseObjs po)
{
this.c_args = po.Count + 1;
this.ce0 = prepend;
this.ce1 = po.ce0;
this.ce2 = po.ce1;
this.ce3 = po.ce2;
}
public ParseObjs(ParseObjs po, IParseObj append)
{
this = po;
if (c_args == 0) ce0 = append;
else if (c_args == 1) ce1 = append;
else if (c_args == 2) ce2 = append;
else if (c_args == 3) ce3 = append;
this.c_args++;
}
public IParseObj this[int ix]
{
get
{
if (ix >= c_args)
throw new IndexOutOfRangeException();
return ix == 0 ? ce0 : ix == 1 ? ce1 : ix == 2 ? ce2 : ce3;
}
}
/// <summary>
/// 'true' if any (one or more) of the objects in this array are pending, on packing hold, or defunct
/// </summary>
public bool AnyInactive
{
get
{
if (ce0 == null) return false; if (ce0.IsHoldOrRemove()) return true;
if (ce1 == null) return false; if (ce1.IsHoldOrRemove()) return true;
if (ce2 == null) return false; if (ce2.IsHoldOrRemove()) return true;
return ce3 != null && ce3.IsHoldOrRemove();
}
}
public bool AnyDefunct
{
get
{
if (ce0 == null) return false; if (ce0.IsRemove()) return true;
if (ce1 == null) return false; if (ce1.IsRemove()) return true;
if (ce2 == null) return false; if (ce2.IsRemove()) return true;
return ce3 != null && ce3.IsRemove();
}
}
public int Count { get { return c_args; } }
public bool Contains(IParseObj item) { return IndexOf(item) != -1; }
public int IndexOf(IParseObj po) { return po == ce0 ? 0 : po == ce1 ? 1 : po == ce2 ? 2 : po == ce3 ? 3 : -1; }
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
public IEnumerator<IParseObj> GetEnumerator()
{
if (ce0 == null) yield break; yield return ce0;
if (ce1 == null) yield break; yield return ce1;
if (ce2 == null) yield break; yield return ce2;
if (ce3 == null) yield break; yield return ce3;
}
public void CopyTo(IParseObj[] array, int arrayIndex)
{
for (int i = 0; i < c_args; i++)
array[arrayIndex++] = this[i];
}
public IParseObj First { get { return ce0; } }
public IParseObj Last { get { return ce3 ?? ce2 ?? ce1 ?? ce0; } }
public Span Span
{
get { return new Span(ce0.TokenSpan.StartIndex, (ce3 ?? ce2 ?? ce1 ?? ce0).TokenSpan.EndIndex); }
}
};
};
}