/// <summary> /// Adds data to a tree structure /// that grows in an unbalanced way. /// </summary> /// <param name="key">Key under which the value will be stored.</param> /// <param name="value">The value to store.</param> /// <returns>A pointer to the value that was added, to be used for indexing.</returns> public async Task <Result <Pointer> > AddAsync(string key, StoredValue value) { if (_head.IsFull) { // create new head, add pointer to current head in to it. // the level > 0 indicates its role as pointer holder var newHead = await MdAccess.CreateAsync(_head.Level + 1).ConfigureAwait(false); var pointer = new Pointer { MdLocator = _head.MdLocator, ValueType = typeof(Pointer).Name }; await newHead.AddAsync(pointer).ConfigureAwait(false); _head = newHead; await _onHeadAddressChange(newHead.MdLocator).ConfigureAwait(false); } return(await DirectlyAddToLeaf(key, value).ConfigureAwait(false)); }