using System; using System.Collections.Generic; using System.Linq; namespace UnityEngine { // Token: 0x02000007 RID: 7 internal class IntervalNode { // Token: 0x06000037 RID: 55 RVA: 0x00003A64 File Offset: 0x00001C64 public IntervalNode(IEnumerable items) { List list = new List(); foreach (IInterval interval in items) { list.Add(interval.intervalStart); list.Add(interval.intervalEnd); } if (list.Count != 0) { list.Sort(); this.m_Center = list[list.Count / 2]; this.m_Children = new List(); List list2 = new List(); List list3 = new List(); foreach (IInterval interval2 in items) { long intervalStart = interval2.intervalStart; if (interval2.intervalEnd.CompareTo(this.m_Center) < 0) { list2.Add(interval2); } else if (intervalStart.CompareTo(this.m_Center) > 0) { list3.Add(interval2); } else { this.m_Children.Add(interval2); } } if (this.m_Children.Count > 0) { this.m_Children = this.m_Children.OrderBy((IInterval c) => c.intervalStart).ToList(); } else { this.m_Children = null; } if (list2.Count > 0) { this.m_LeftNode = new IntervalNode(list2); } if (list3.Count > 0) { this.m_RightNode = new IntervalNode(list3); } } } // Token: 0x06000038 RID: 56 RVA: 0x00003C44 File Offset: 0x00001E44 public void Query(long time, int bitflag, ref List results) where U : class, IInterval { if (this.m_Children != null) { for (int i = 0; i < this.m_Children.Count; i++) { U u = this.m_Children[i] as U; if (u != null) { long intervalStart = u.intervalStart; long intervalEnd = u.intervalEnd; if (intervalStart.CompareTo(time) > 0) { break; } if (time.CompareTo(intervalStart) >= 0 && time.CompareTo(intervalEnd) < 0) { u.intervalBit = bitflag; results.Add(u); } } } } if (time.CompareTo(this.m_Center) < 0 && this.m_LeftNode != null) { this.m_LeftNode.Query(time, bitflag, ref results); } else if (time.CompareTo(this.m_Center) > 0 && this.m_RightNode != null) { this.m_RightNode.Query(time, bitflag, ref results); } } // Token: 0x06000039 RID: 57 RVA: 0x00003D64 File Offset: 0x00001F64 public void Query(long start, long end, int bitflag, ref List results) where U : class, IInterval { long num = start; long num2 = end; if (this.m_Children != null) { for (int i = 0; i < this.m_Children.Count; i++) { U u = this.m_Children[i] as U; if (u != null) { long intervalStart = u.intervalStart; long intervalEnd = u.intervalEnd; if (intervalStart.CompareTo(num2) > 0) { break; } if (num2.CompareTo(intervalStart) >= 0 && intervalEnd.CompareTo(num) >= 0) { u.intervalBit = bitflag; results.Add(u); } } } } if (num.CompareTo(this.m_Center) < 0 && this.m_LeftNode != null) { this.m_LeftNode.Query(start, end, bitflag, ref results); } if (num2.CompareTo(this.m_Center) > 0 && this.m_RightNode != null) { this.m_RightNode.Query(start, end, bitflag, ref results); } } // Token: 0x0400000C RID: 12 private long m_Center; // Token: 0x0400000D RID: 13 private List m_Children; // Token: 0x0400000E RID: 14 private IntervalNode m_LeftNode; // Token: 0x0400000F RID: 15 private IntervalNode m_RightNode; } }