public SuperBinaryBranch(SuperBinaryNode <T> leftNode, SuperBinaryNode <T> rightNode, ILogger log) : base(log) { _leftNode = leftNode; _rightNode = rightNode; _log = log; }
public SuperBinaryBranch(SuperBinaryNode <T> leftNode, long index, ILogger log) : this(leftNode, new SuperBinaryLeaf <T>(index), log) { }
public SuperBinaryBranch(long index, SuperBinaryNode <T> rightNode, ILogger log) : this(new SuperBinaryLeaf <T>(index), rightNode, log) { }
private bool IsNodeExistsQuickCheck(long index, SuperBinaryNode <T> node) { return(node?.LowIndex >= index && node.HighIndex < index); }
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); }
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);