static Net() { #region Core // Наивная инициализация (Не является корректным объяснением). Net.IsA = Link.CreateOutcomingSelflinker(null); Net.IsNotA = Link.CreateOutcomingSelflinker(Net.IsA); Net.Link = Link.CreateCycleSelflink(Net.IsA); Net.Thing = Link.CreateOutcomingSelflink(Net.IsNotA, Net.Link); Net.IsA.Target = Net.Link; // Исключение, позволяющие завершить систему #endregion Net.Of = Link.CreateOutcomingSelflink(Net.IsA, Net.Link); Net.And = Link.CreateOutcomingSelflink(Net.IsA, Net.Link); Net.Has = Link.CreateOutcomingSelflink(Net.IsA, Net.Link); Net.SumOf = Link.CreateOutcomingSelflink(Net.IsA, Net.Link); Net.ConsistsOf = Link.CreateOutcomingSelflink(Net.IsA, Net.Link); Net.HasName = Link.CreateOutcomingSelflink(Net.IsA, Net.Link); Net.Name = Link.CreateOutcomingSelflink(Net.IsA, Net.Thing); Net.IsA = Link.CreateOutcomingSelflink(Net.IsA, Net.Link); Net.Sum = Link.CreateOutcomingSelflink(Net.IsA, Net.Thing); Net.String = Link.CreateOutcomingSelflink(Net.IsA, Net.Thing); Net.Char = Link.CreateOutcomingSelflink(Net.IsA, Net.Thing); InitNumbers(); SetNames(); }
public static Link FromString(string str) { Link[] charsSequenceList = new Link[str.Length]; for (int i = 0; i < str.Length; i++) { Link number = FromNumber(str[i]); Link character = Link.Create(number, Net.IsA, Net.Char); // Только для отладки charsSequenceList[i] = character; } Link strLink = Link.Create(Net.String, Net.ConsistsOf, FromList(charsSequenceList)); return strLink; }
public static List<Link> ToList(Link link) { List<Link> list = new List<Link>(); Link element = link; while (element.Linker == Net.And) { list.Add(element.Source); element = element.Target; } list.Add(element); return list; }
public static long ToNumber(Link link) { if (link.IsSum()) { long number = 0; List<Link> numberParts = ToList(link.Target); for (int i = 0; i < numberParts.Count; i++) { number += Net.PowerOf2Numbers[numberParts[i]]; } return number; } else { throw new ArgumentOutOfRangeException("link", "Specified link is not a number."); } }
public static string ToString(Link link) { if (link.IsString()) { List<Link> charLinks = ToList(link.Target); char[] chars = new char[charLinks.Count]; for (int i = 0; i < charLinks.Count; i++) { chars[i] = (char)ToNumber(charLinks[i].Source); } return new string(chars); } else { throw new ArgumentOutOfRangeException("link", "Specified link is not a string."); } }
public void Delete() { this.Source = null; this.Linker = null; this.Target = null; while (m_FirstRefererBySource != null) m_FirstRefererBySource.Delete(); while (m_FirstRefererByLinker != null) m_FirstRefererByLinker.Delete(); while (m_FirstRefererByTarget != null) m_FirstRefererByTarget.Delete(); }
// act of link on the link by the link // linker target source // как? что? чем? // что? над чем? чем? // Как избавиться от act? // source source source // linker reason method // target target target // нечем нисвязная несвязь // not linked nolink // nothing not linking nothing // Может это ответ? Откуда мы? Из неоткуда. /// <remarks> /// Так как Null не является допустимым значением, всегда будет выполняться только первый поиск /// по Target`у. /// Есть возможность выполнять поиск в 3 потока, и тот, что выполнит быстрее завершает всю операцию. /// Также одновременно можно сохранять результаты производительность, т.е. кто за сколько закончил, /// чтобы решить имеет ли смысл действительно останавливаться на одном проходе, может быть действительно /// проход по Target`у самый быстрый. /// </remarks> private static Link TryFindExistingLink(Link source, Link linker, Link target) { Func<Link, bool> isEqual = link => { return link.Source == source && link.Linker == linker && link.Target == target; }; return target.ReferersByTarget.FirstOrDefault(isEqual); //return source.ReferersBySource.FirstOrDefault(isEqual); //return linker.ReferersByLinker.FirstOrDefault(isEqual); }
public static Link CreateOutcomingSelflinker(Link target) { Link link = new Link(); link.Source = link; link.Linker = link; link.Target = target; return link; }
public static Link CreateSelflinker(Link source, Link target) { Link link = new Link(); link.Source = source; link.Linker = link; link.Target = target; return link; }
public static Link CreateLinkLinkingItself() { Link link = new Link(); link.Source = link; link.Linker = link; link.Target = link; return link; }
public static Link CreateIncomingSelflink(Link source, Link linker) { Link link = new Link(); link.Source = source; link.Linker = linker; link.Target = link; return link; }
public static Link CreateCycleSelflink(Link linker) { Link link = new Link(); link.Source = link; link.Linker = linker; link.Target = link; return link; }
// Можно было бы попробовать разрешать создавать линки без установки свойств, // но тогда есть возможность подмены линка, при установке свойств. public static Link Create(Link source, Link linker, Link target) { if (source == null) { throw new ArgumentNullException("Источник связи (начало) должен быть указан."); } if (linker == null) { throw new ArgumentNullException("Связчик должен быть указан."); } if (target == null) { throw new ArgumentNullException("Цель связи (конец) должна быть указана."); } Link link = TryFindExistingLink(source, linker, target); if (link == null) { link = new Link() { Source = source, Linker = linker, Target = target, }; } return link; }
public static Link Create(string name) { throw new InvalidOperationException("Текущая реализация функции недопустима."); Link link = new Link(); link.SetName(name); return link; }