示例#1
0
 public SuperBinaryBranch(SuperBinaryNode <T> leftNode, SuperBinaryNode <T> rightNode, ILogger log) : base(log)
 {
     _leftNode  = leftNode;
     _rightNode = rightNode;
     _log       = log;
 }
示例#2
0
 public SuperBinaryBranch(SuperBinaryNode <T> leftNode, long index, ILogger log) : this(leftNode, new SuperBinaryLeaf <T>(index), log)
 {
 }
示例#3
0
 public SuperBinaryBranch(long index, SuperBinaryNode <T> rightNode, ILogger log) : this(new SuperBinaryLeaf <T>(index), rightNode, log)
 {
 }
示例#4
0
 private bool IsNodeExistsQuickCheck(long index, SuperBinaryNode <T> node)
 {
     return(node?.LowIndex >= index && node.HighIndex < index);
 }
示例#5
0
        protected SuperBinaryNode <T> GetOrCreateAndSwitchNode(long index, Func <long, SuperBinaryNode <T>, bool> nodeQuickCheckFunc, Func <long, SuperBinaryNode <T> > nodeFactory, ref SuperBinaryNode <T> targetNodeRef, out SuperBinaryNode <T> old)
        {
            _log.LogVerbose($"Get or create SuperBinaryRoot<{typeof(T).Name}> for index '{index}'");
            SuperBinaryNode <T> node;

            do
            {
                old = Volatile.Read(ref targetNodeRef);
                if (nodeQuickCheckFunc(index, old))
                {
                    _log.LogVerbose($"SuperBinaryRoot<{typeof(T).Name}> is OK for index '{index}': '{old}'");
                    return(old);
                }

                node = nodeFactory(index);
            } while (Interlocked.CompareExchange(ref targetNodeRef, node, old) != old);

            _log.LogVerbose($"SuperBinaryRoot<{typeof(T).Name}> changed: new='{node}', old='{old}'");
            return(node);
        }
示例#6
0
 public static long GetMeridian <T>(this SuperBinaryNode <T> leftNode, SuperBinaryNode <T> rightNode) where T : class
 => SuperSonicDataBlockPool <T> .DataBlockSize * ((leftNode.LowIndex + rightNode.HighIndex) / (2 * SuperSonicDataBlockPool <T> .DataBlockSize) + 1);