public static TLink CreateStack <TLink>(this ILinks <TLink> links, TLink stackMarker) { var stackPoint = links.CreatePoint(); var stack = links.Update(stackPoint, stackMarker, stackPoint); return(stack); }
public static TLink UpdateOrCreateOrGet <TLink>(this ILinks <TLink> links, TLink source, TLink target, TLink newSource, TLink newTarget) { var equalityComparer = EqualityComparer <TLink> .Default; var link = links.SearchOrDefault(source, target); if (equalityComparer.Equals(link, default)) { return(links.CreateAndUpdate(newSource, newTarget)); } if (equalityComparer.Equals(newSource, source) && equalityComparer.Equals(newTarget, target)) { return(link); } return(links.Update(link, newSource, newTarget)); }
public static TLink Update <TLink>(this ILinks <TLink> links, params TLink[] restrictions) { if (restrictions.Length == 2) { return(links.MergeAndDelete(restrictions[0], restrictions[1])); } if (restrictions.Length == 4) { return(links.UpdateOrCreateOrGet(restrictions[0], restrictions[1], restrictions[2], restrictions[3])); } else { return(links.Update(new LinkAddress <TLink>(restrictions[0]), restrictions)); } }
private static void TestNonexistentReferences(this ILinks <ulong> memoryAdapter) { var link = memoryAdapter.Create(); memoryAdapter.Update(link, ulong.MaxValue, ulong.MaxValue); var resultLink = _constants.Null; memoryAdapter.Each(foundLink => { resultLink = foundLink[_constants.IndexPart]; return(_constants.Break); }, _constants.Any, ulong.MaxValue, ulong.MaxValue); Assert.True(resultLink == link); Assert.True(memoryAdapter.Count(ulong.MaxValue) == 0); memoryAdapter.Delete(link); }
public static TLink Update <TLink>(this ILinks <TLink> links, TLink link, TLink newSource, TLink newTarget) => links.Update(new LinkAddress <TLink>(link), new Link <TLink>(link, newSource, newTarget));
public static TLink CreateAndUpdate <TLink>(this ILinks <TLink> links, TLink source, TLink target) => links.Update(links.Create(), source, target);
public static TLink CreatePoint <TLink>(this ILinks <TLink> links) { var link = links.Create(); return(links.Update(link, link, link)); }
public static void TestCRUDOperations<T>(this ILinks<T> links) { var constants = links.Constants; var equalityComparer = EqualityComparer<T>.Default; var zero = default(T); var one = Arithmetic.Increment(zero); // Create Link Assert.True(equalityComparer.Equals(links.Count(), zero)); var setter = new Setter<T>(constants.Null); links.Each(constants.Any, constants.Any, setter.SetAndReturnTrue); Assert.True(equalityComparer.Equals(setter.Result, constants.Null)); var linkAddress = links.Create(); var link = new Link<T>(links.GetLink(linkAddress)); Assert.True(link.Count == 3); Assert.True(equalityComparer.Equals(link.Index, linkAddress)); Assert.True(equalityComparer.Equals(link.Source, constants.Null)); Assert.True(equalityComparer.Equals(link.Target, constants.Null)); Assert.True(equalityComparer.Equals(links.Count(), one)); // Get first link setter = new Setter<T>(constants.Null); links.Each(constants.Any, constants.Any, setter.SetAndReturnFalse); Assert.True(equalityComparer.Equals(setter.Result, linkAddress)); // Update link to reference itself links.Update(linkAddress, linkAddress, linkAddress); link = new Link<T>(links.GetLink(linkAddress)); Assert.True(equalityComparer.Equals(link.Source, linkAddress)); Assert.True(equalityComparer.Equals(link.Target, linkAddress)); // Update link to reference null (prepare for delete) var updated = links.Update(linkAddress, constants.Null, constants.Null); Assert.True(equalityComparer.Equals(updated, linkAddress)); link = new Link<T>(links.GetLink(linkAddress)); Assert.True(equalityComparer.Equals(link.Source, constants.Null)); Assert.True(equalityComparer.Equals(link.Target, constants.Null)); // Delete link links.Delete(linkAddress); Assert.True(equalityComparer.Equals(links.Count(), zero)); setter = new Setter<T>(constants.Null); links.Each(constants.Any, constants.Any, setter.SetAndReturnTrue); Assert.True(equalityComparer.Equals(setter.Result, constants.Null)); }
public static void TestRawNumbersCRUDOperations<T>(this ILinks<T> links) { // Constants var constants = links.Constants; var equalityComparer = EqualityComparer<T>.Default; var zero = default(T); var one = Arithmetic.Increment(zero); var two = Arithmetic.Increment(one); var h106E = new Hybrid<T>(106L, isExternal: true); var h107E = new Hybrid<T>(-char.ConvertFromUtf32(107)[0]); var h108E = new Hybrid<T>(-108L); Assert.Equal(106L, h106E.AbsoluteValue); Assert.Equal(107L, h107E.AbsoluteValue); Assert.Equal(108L, h108E.AbsoluteValue); // Create Link (External -> External) var linkAddress1 = links.Create(); links.Update(linkAddress1, h106E, h108E); var link1 = new Link<T>(links.GetLink(linkAddress1)); Assert.True(equalityComparer.Equals(link1.Source, h106E)); Assert.True(equalityComparer.Equals(link1.Target, h108E)); // Create Link (Internal -> External) var linkAddress2 = links.Create(); links.Update(linkAddress2, linkAddress1, h108E); var link2 = new Link<T>(links.GetLink(linkAddress2)); Assert.True(equalityComparer.Equals(link2.Source, linkAddress1)); Assert.True(equalityComparer.Equals(link2.Target, h108E)); // Create Link (Internal -> Internal) var linkAddress3 = links.Create(); links.Update(linkAddress3, linkAddress1, linkAddress2); var link3 = new Link<T>(links.GetLink(linkAddress3)); Assert.True(equalityComparer.Equals(link3.Source, linkAddress1)); Assert.True(equalityComparer.Equals(link3.Target, linkAddress2)); // Search for created link var setter1 = new Setter<T>(constants.Null); links.Each(h106E, h108E, setter1.SetAndReturnFalse); Assert.True(equalityComparer.Equals(setter1.Result, linkAddress1)); // Search for nonexistent link var setter2 = new Setter<T>(constants.Null); links.Each(h106E, h107E, setter2.SetAndReturnFalse); Assert.True(equalityComparer.Equals(setter2.Result, constants.Null)); // Update link to reference null (prepare for delete) var updated = links.Update(linkAddress3, constants.Null, constants.Null); Assert.True(equalityComparer.Equals(updated, linkAddress3)); link3 = new Link<T>(links.GetLink(linkAddress3)); Assert.True(equalityComparer.Equals(link3.Source, constants.Null)); Assert.True(equalityComparer.Equals(link3.Target, constants.Null)); // Delete link links.Delete(linkAddress3); Assert.True(equalityComparer.Equals(links.Count(), two)); var setter3 = new Setter<T>(constants.Null); links.Each(constants.Any, constants.Any, setter3.SetAndReturnTrue); Assert.True(equalityComparer.Equals(setter3.Result, linkAddress2)); }