예제 #1
0
        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();
        }
예제 #2
0
        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;
        }
예제 #3
0
        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;
        }
예제 #4
0
 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.");
     }
 }
예제 #5
0
        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.");
            }
        }
예제 #6
0
 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();
 }
예제 #7
0
        // 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);
        }
예제 #8
0
 public static Link CreateOutcomingSelflinker(Link target)
 {
     Link link = new Link();
     link.Source = link;
     link.Linker = link;
     link.Target = target;
     return link;
 }
예제 #9
0
 public static Link CreateSelflinker(Link source, Link target)
 {
     Link link = new Link();
     link.Source = source;
     link.Linker = link;
     link.Target = target;
     return link;
 }
예제 #10
0
 public static Link CreateLinkLinkingItself()
 {
     Link link = new Link();
     link.Source = link;
     link.Linker = link;
     link.Target = link;
     return link;
 }
예제 #11
0
 public static Link CreateIncomingSelflink(Link source, Link linker)
 {
     Link link = new Link();
     link.Source = source;
     link.Linker = linker;
     link.Target = link;
     return link;
 }
예제 #12
0
 public static Link CreateCycleSelflink(Link linker)
 {
     Link link = new Link();
     link.Source = link;
     link.Linker = linker;
     link.Target = link;
     return link;
 }
예제 #13
0
        // Можно было бы попробовать разрешать создавать линки без установки свойств,
        // но тогда есть возможность подмены линка, при установке свойств.
        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;
        }
예제 #14
0
        public static Link Create(string name)
        {
            throw new InvalidOperationException("Текущая реализация функции недопустима.");

            Link link = new Link();
            link.SetName(name);
            return link;
        }