Exemple #1
0
        /// <exception cref="System.IO.IOException"></exception>
        internal override int EstimateSize(AnyObjectId noteOn, ObjectReader or)
        {
            // If most of this fan-out is full, estimate it should still be split.
            if (LeafBucket.MAX_SIZE * 3 / 4 <= cnt)
            {
                return(1 + LeafBucket.MAX_SIZE);
            }
            // Due to the uniform distribution of ObjectIds, having less nodes full
            // indicates a good chance the total number of children below here
            // is less than the MAX_SIZE split point. Get a more accurate count.
            MutableObjectId id = new MutableObjectId();

            id.FromObjectId(noteOn);
            int sz = 0;

            for (int cell = 0; cell < 256; cell++)
            {
                NoteBucket b = table[cell];
                if (b == null)
                {
                    continue;
                }
                id.SetByte(prefixLen >> 1, cell);
                sz += b.EstimateSize(id, or);
                if (LeafBucket.MAX_SIZE < sz)
                {
                    break;
                }
            }
            return(sz);
        }
Exemple #2
0
 public override bool HasNext()
 {
     if (this.itr != null && this.itr.HasNext())
     {
         return(true);
     }
     for (; this.cell < this._enclosing.table.Length; this.cell++)
     {
         NoteBucket b = this._enclosing.table[this.cell];
         if (b == null)
         {
             continue;
         }
         try
         {
             id.SetByte(this._enclosing.prefixLen >> 1, this.cell);
             this.itr = b.Iterator(id, reader);
         }
         catch (IOException err)
         {
             throw new RuntimeException(err);
         }
         if (this.itr.HasNext())
         {
             this.cell++;
             return(true);
         }
     }
     return(false);
 }
Exemple #3
0
 private static bool Equals(NoteBucket a, NoteBucket b)
 {
     if (a == null && b == null)
     {
         return(true);
     }
     return(a != null && b != null && a.GetTreeId().Equals(b.GetTreeId()));
 }
Exemple #4
0
 /// <exception cref="System.IO.IOException"></exception>
 internal static InMemoryNoteBucket LoadIfLazy(NoteBucket b, AnyObjectId prefix, ObjectReader
                                               or)
 {
     if (b == null)
     {
         return(null);
     }
     if (b is InMemoryNoteBucket)
     {
         return((InMemoryNoteBucket)b);
     }
     return(((FanoutBucket.LazyNoteBucket)b).Load(prefix, or));
 }
Exemple #5
0
 /// <exception cref="System.IO.IOException"></exception>
 private void AddIfNotNull(FanoutBucket b, int cell, NoteBucket child)
 {
     if (child == null)
     {
         return;
     }
     if (child is InMemoryNoteBucket)
     {
         b.SetBucket(cell, ((InMemoryNoteBucket)child).WriteTree(inserter));
     }
     else
     {
         b.SetBucket(cell, child.GetTreeId());
     }
 }
Exemple #6
0
        /// <exception cref="System.IO.IOException"></exception>
        private InMemoryNoteBucket MergeFanoutBucket(int treeDepth, FanoutBucket @base, FanoutBucket
                                                     ours, FanoutBucket theirs)
        {
            FanoutBucket result = new FanoutBucket(treeDepth * 2);

            // walking through entries of base, ours, theirs
            for (int i = 0; i < 256; i++)
            {
                NoteBucket b = @base.GetBucket(i);
                NoteBucket o = ours.GetBucket(i);
                NoteBucket t = theirs.GetBucket(i);
                if (Equals(o, t))
                {
                    AddIfNotNull(result, i, o);
                }
                else
                {
                    if (Equals(b, o))
                    {
                        AddIfNotNull(result, i, t);
                    }
                    else
                    {
                        if (Equals(b, t))
                        {
                            AddIfNotNull(result, i, o);
                        }
                        else
                        {
                            objectIdPrefix.SetByte(treeDepth, i);
                            InMemoryNoteBucket mergedBucket = Merge(treeDepth + 1, FanoutBucket.LoadIfLazy(b,
                                                                                                           objectIdPrefix, reader), FanoutBucket.LoadIfLazy(o, objectIdPrefix, reader), FanoutBucket
                                                                    .LoadIfLazy(t, objectIdPrefix, reader));
                            result.SetBucket(i, mergedBucket);
                        }
                    }
                }
            }
            return(result.ContractIfTooSmall(objectIdPrefix, reader));
        }
Exemple #7
0
        /// <exception cref="System.IO.IOException"></exception>
        internal override InMemoryNoteBucket Set(AnyObjectId noteOn, AnyObjectId noteData
                                                 , ObjectReader or)
        {
            int        cell = Cell(noteOn);
            NoteBucket b    = table[cell];

            if (b == null)
            {
                if (noteData == null)
                {
                    return(this);
                }
                LeafBucket n = new LeafBucket(prefixLen + 2);
                table[cell] = n.Set(noteOn, noteData, or);
                cnt++;
                return(this);
            }
            else
            {
                NoteBucket n = b.Set(noteOn, noteData, or);
                if (n == null)
                {
                    table[cell] = null;
                    cnt--;
                    if (cnt == 0)
                    {
                        return(null);
                    }
                    return(ContractIfTooSmall(noteOn, or));
                }
                else
                {
                    if (n != b)
                    {
                        table[cell] = n;
                    }
                }
                return(this);
            }
        }
Exemple #8
0
        /// <exception cref="System.IO.IOException"></exception>
        private TreeFormatter Build(bool insert, ObjectInserter inserter)
        {
            byte[]        nameBuf = new byte[2];
            TreeFormatter fmt     = new TreeFormatter(TreeSize());
            NonNoteEntry  e       = nonNotes;

            for (int cell = 0; cell < 256; cell++)
            {
                NoteBucket b = table[cell];
                if (b == null)
                {
                    continue;
                }
                nameBuf[0] = hexchar[(int)(((uint)cell) >> 4)];
                nameBuf[1] = hexchar[cell & unchecked ((int)(0x0f))];
                while (e != null && e.PathCompare(nameBuf, 0, 2, FileMode.TREE) < 0)
                {
                    e.Format(fmt);
                    e = e.next;
                }
                ObjectId id;
                if (insert)
                {
                    id = b.WriteTree(inserter);
                }
                else
                {
                    id = b.GetTreeId();
                }
                fmt.Append(nameBuf, 0, 2, FileMode.TREE, id);
            }
            for (; e != null; e = e.next)
            {
                e.Format(fmt);
            }
            return(fmt);
        }
Exemple #9
0
		/// <exception cref="System.IO.IOException"></exception>
		private void AddIfNotNull(FanoutBucket b, int cell, NoteBucket child)
		{
			if (child == null)
			{
				return;
			}
			if (child is InMemoryNoteBucket)
			{
				b.SetBucket(cell, ((InMemoryNoteBucket)child).WriteTree(inserter));
			}
			else
			{
				b.SetBucket(cell, child.GetTreeId());
			}
		}
Exemple #10
0
		private static bool Equals(NoteBucket a, NoteBucket b)
		{
			if (a == null && b == null)
			{
				return true;
			}
			return a != null && b != null && a.GetTreeId().Equals(b.GetTreeId());
		}
Exemple #11
0
        /// <exception cref="System.IO.IOException"></exception>
        internal override Note GetNote(AnyObjectId objId, ObjectReader or)
        {
            NoteBucket b = table[Cell(objId)];

            return(b != null?b.GetNote(objId, or) : null);
        }