1 #Region "Microsoft.VisualBasic::0b8175766291acd77bf7f61cb5a409cc, Microsoft.VisualBasic.Core\ComponentModel\Algorithm\BinaryTree\TreeNode.vb"
2
3     ' Author:
4     
5     '       asuka (amethyst.asuka@gcmodeller.org)
6     '       xie (genetics@smrucc.org)
7     '       xieguigang (xie.guigang@live.com)
8     
9     ' Copyright (c) 2018 GPL3 Licensed
10     
11     
12     ' GNU GENERAL PUBLIC LICENSE (GPL3)
13     
14     
15     ' This program is free software: you can redistribute it and/or modify
16     ' it under the terms of the GNU General Public License as published by
17     ' the Free Software Foundation, either version 3 of the License, or
18     ' (at your option) any later version.
19     
20     ' This program is distributed in the hope that it will be useful,
21     ' but WITHOUT ANY WARRANTY; without even the implied warranty of
22     ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23     ' GNU General Public License for more details.
24     
25     ' You should have received a copy of the GNU General Public License
26     ' along with this program. If not, see <http://www.gnu.org/licenses/>.
27
28
29
30     ' /********************************************************************************/
31
32     ' Summaries:
33
34     '     Class BinaryTree
35     
36     '         Properties: Key, Left, QualifiedName, Right, Value
37     
38     '         Constructor: (+1 OverloadsSub New
39     
40     '         FunctionToString, viewQualifiedName
41     
42     '         SubSetValue
43     
44     
45     ' /********************************************************************************/
46
47 #End Region
48
49 Imports System.Runtime.CompilerServices
50 Imports Microsoft.VisualBasic.Language
51 Imports Microsoft.VisualBasic.Language.Default
52
53 Namespace ComponentModel.Algorithm.BinaryTree
54
55     ''' <summary>
56     ''' The binary tree node.
57     ''' </summary>
58     ''' <typeparam name="K"></typeparam>
59     ''' <typeparam name="V"></typeparam>
60     Public Class BinaryTree(Of K, V) : Implements Value(Of V).IValueOf
61
62         ''' <summary>
63         ''' 键名是唯一的,赋值之后就不可以改变了
64         ''' </summary>
65         ''' <returns></returns>
66         Public ReadOnly Property Key As K
67         ''' <summary>
68         ''' 与当前的这个键名相对应的键值可以根据需求发生改变,即可以被任意赋值
69         ''' </summary>
70         ''' <returns></returns>
71         Public Property Value As V Implements Value(Of V).IValueOf.Value
72         Public Property Left As BinaryTree(Of K, V)
73         Public Property Right As BinaryTree(Of K, V)
74
75         ''' <summary>
76         ''' Additional values that using for the binary tree algorithm.
77         ''' </summary>
78         ReadOnly additionals As New Dictionary(Of StringObject)
79
80         ''' <summary>
81         ''' Full name of current node
82         ''' </summary>
83         ''' <returns></returns>
84         Public ReadOnly Property QualifiedName As String
85             <MethodImpl(MethodImplOptions.AggressiveInlining)>
86             Get
87                 Return viewQualifiedName(Me)
88             End Get
89         End Property
90
91         Default Public ReadOnly Property Item(key As StringAs Object
92             <MethodImpl(MethodImplOptions.AggressiveInlining)>
93             Get
94                 Return additionals.TryGetValue(key)
95             End Get
96         End Property
97
98         ReadOnly defaultView As New DefaultValue(Of Func(Of K, String))(Function(key) Scripting.ToString(key))
99
100         ''' <summary>
101         ''' 
102         ''' </summary>
103         ''' <param name="key"></param>
104         ''' <param name="value"></param>
105         ''' <param name="parent"></param>
106         ''' <param name="toString">Default debug view is <see cref="Scripting.ToString(Object, String)"/></param>
107         Sub New(key As K, value As V,
108                 Optional parent As BinaryTree(Of K, V) = Nothing,
109                 Optional toString As Func(Of K, String) = Nothing)
110
111             Me.Key = key
112             Me.Value = value
113
114             Call SetValue("name", (toString Or defaultView)(key))
115             Call SetValue("parent", parent)
116             Call SetValue("values"New List(Of V))
117
118             DirectCast(Me!values, List(Of V)).Add(value)
119         End Sub
120
121         ''' <summary>
122         ''' Set <see cref="additionals"/> value by using a key value tuple.
123         ''' </summary>
124         ''' <param name="key$"></param>
125         ''' <param name="value"></param>
126         <MethodImpl(MethodImplOptions.AggressiveInlining)>
127         Public Sub SetValue(key$, value As Object)
128             additionals(key) = value
129         End Sub
130
131         Private Shared Function viewQualifiedName(node As BinaryTree(Of K, V)) As String
132             Dim additionals = node.additionals
133             Dim parent = TryCast(additionals!parent, BinaryTree(Of K, V))
134             Dim name$ = additionals!name
135
136             If parent Is Nothing Then
137                 Return "/"
138             Else
139                 Return parent.QualifiedName & "/" & name
140             End If
141         End Function
142
143         ''' <summary>
144         ''' Display debug view as: ``[key, value]``
145         ''' </summary>
146         ''' <returns></returns>
147         Public Overrides Function ToString() As String
148             Return $"[{additionals!name}, {Value}]"
149         End Function
150     End Class
151 End Namespace