コード例 #1
0
 public void Clear()
 {
     _head = null;
     for (int n = 0; n < _metas.Length; n++)
     {
         _metas[n].Target = null;
     }
 }
コード例 #2
0
 public T this[int index]
 {
     get
     {
         RLLEntry <T> e = this.Find(index);
         if (e == null)
         {
             return(default(T));
         }
         else
         {
             return(e.Value);
         }
     }
 }
コード例 #3
0
        private RLLEntry <T> Find(int index)
        {
            RLLMeta <T>  meta = this.FindMeta(index);
            RLLEntry <T> e    = meta.Target;

            while (e != null)
            {
                if (e.Range.Extents < index)
                {
                    continue;
                }
                if (e.Range.Offset > index)
                {
                    break;
                }
                Debug.Assert(e.Range.Contains(index) == true);
                return(e);
            }
            return(null);
        }
コード例 #4
0
        public void Remove(int index)
        {
            RLLEntry <T> e = this.Find(index);

            if (e == null)
            {
                return;
            }

            if (e.Previous != null)
            {
                e.Previous.Next = e.Next;
            }
            else
            {
                _head = e.Next;
            }
            if (e.Next != null)
            {
                e.Next.Previous = e.Previous;
            }

            int metaIndex = (index / _metas.Length);
            int metaRange = e.Range.Size / _metas[0].Range.Size;

            for (int n = metaIndex - metaRange; n < metaIndex + metaRange; n++)
            {
                if (_metas[n].Target == e)
                {
                    if ((e.Next != null) &&
                        (_metas[n].Range.Contains(e.Next.Range.Offset) == true))
                    {
                        _metas[n].Target = e.Next;
                    }
                    else
                    {
                        _metas[n].Target = null;
                    }
                }
            }
        }
コード例 #5
0
        public void Add(Range range, T value)
        {
            RLLEntry <T> e = new RLLEntry <T>(range, value);

            if (_head != null)
            {
                if (_head.Range.Offset > range.Offset)
                {
                    e.Next         = _head;
                    _head.Previous = e;
                    _head          = e;
                }
            }
            else
            {
                _head = e;
            }

            int metaIndex = (range.Offset / _metas.Length);
            int metaRange = Math.Max(1, e.Range.Size / _metas[0].Range.Size);

            for (int n = metaIndex; n < metaIndex + metaRange; n++)
            {
                RLLMeta <T> meta = _metas[n];
                if (meta.Range.Extents < range.Offset)
                {
                    continue;
                }
                if (meta.Range.Offset > range.Extents)
                {
                    break;
                }
                if (meta.Target != null)
                {
                    if (meta.Target.Range.Offset > range.Offset)
                    {
                        meta.Target = e;
                    }
                }
                else
                {
                    meta.Target = e;
                }
            }

            if (_head != e)
            {
                RLLEntry <T> ee = _head;
                while (ee != null)
                {
                    if (ee.Range.Offset > range.Offset)
                    {
                        e.Next      = ee;
                        e.Previous  = ee.Previous;
                        ee.Previous = e;
                        if (e.Previous != null)
                        {
                            e.Previous.Next = e;
                        }
                        break;
                    }
                    if (ee.Next == null)
                    {
                        e.Previous = ee;
                        ee.Next    = e;
                        break;
                    }
                    ee = ee.Next;
                }
            }
        }
コード例 #6
0
        public bool Contains(int index)
        {
            RLLEntry <T> e = this.Find(index);

            return(e != null);
        }