1 #Region "Microsoft.VisualBasic::e395fbd6d1760768c657d6ec12270df7, Microsoft.VisualBasic.Core\ComponentModel\Ranges\RangeModel\IntRange.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 IntRange
35     
36     '         Properties: Length, Max, Min
37     
38     '         Constructor: (+3 OverloadsSub New
39     '         FunctionGetEnumerator, IEnumerable_GetEnumerator, (+3 OverloadsIsInside, (+2 OverloadsIsOverlapping, ScaleMapping
40     '                   ToString
41     
42     
43     ' /********************************************************************************/
44
45 #End Region
46
47 ' AForge Library
48 '
49 ' Copyright © Andrew Kirillov, 2006
50 ' andrew.kirillov@gmail.com
51 '
52
53 Imports Microsoft.VisualBasic.Language
54
55 Namespace ComponentModel.Ranges.Model
56
57     ''' <summary>
58     ''' Represents an <see cref="Integer"/> range with minimum and maximum values
59     ''' </summary>
60     Public Class IntRange : Inherits BaseClass
61         Implements IRanges(Of Integer)
62         Implements IEnumerable(Of Integer)
63
64         ''' <summary>
65         ''' Minimum value
66         ''' </summary>
67         Public Property Min() As Integer Implements IRanges(Of Integer).Min
68
69         ''' <summary>
70         ''' Maximum value
71         ''' </summary>
72         Public Property Max() As Integer Implements IRanges(Of Integer).Max
73
74         ''' <summary>
75         ''' Length of the range (deffirence between maximum and minimum values)
76         ''' </summary>
77         Public ReadOnly Property Length() As Integer
78             Get
79                 Return Max - Min
80             End Get
81         End Property
82
83         ''' <summary>
84         ''' Initializes a new instance of the <see cref="IntRange"/> class
85         ''' </summary>
86         '''
87         ''' <param name="min">Minimum value of the range</param>
88         ''' <param name="max">Maximum value of the range</param>
89         Public Sub New(min%, max%)
90             Me.Min = min
91             Me.Max = max
92         End Sub
93
94         Sub New(source As IEnumerable(Of Integer))
95             With source.ToArray
96                 Min = .Min
97                 Max = .Max
98             End With
99         End Sub
100
101         Sub New()
102         End Sub
103
104         ''' <summary>
105         ''' 
106         ''' </summary>
107         ''' <returns></returns>
108         ''' <remarks>
109         ''' <see cref="DoubleRange.ToString()"/>
110         ''' </remarks>
111         Public Overrides Function ToString() As String
112             Return $"[min={Min}, max={Max}]"
113         End Function
114
115         ''' <summary>
116         ''' Check if the specified value ``<paramref name="x"/>`` is inside this range
117         ''' </summary>
118         ''' <param name="x">Value to check</param>
119         ''' <returns><b>True</b> if the specified value is inside this range or
120         ''' <b>false</b> otherwise.</returns>
121         Public Function IsInside(x As IntegerAs Boolean Implements IRanges(Of Integer).IsInside
122             Return ((x >= Min) AndAlso (x <= Max))
123         End Function
124
125         ''' <summary>
126         ''' Check if the specified range is inside this range
127         ''' </summary>
128         '''
129         ''' <param name="range">Range to check</param>
130         '''
131         ''' <returns><b>True</b> if the specified range is inside this range or
132         ''' <b>false</b> otherwise.</returns>
133         '''
134         Public Function IsInside(range As IntRange) As Boolean
135             Return ((IsInside(range.Min)) AndAlso (IsInside(range.Max)))
136         End Function
137
138         ''' <summary>
139         ''' Check if the specified range overlaps with this range
140         ''' </summary>
141         '''
142         ''' <param name="range">Range to check for overlapping</param>
143         '''
144         ''' <returns><b>True</b> if the specified range overlaps with this range or
145         ''' <b>false</b> otherwise.</returns>
146         '''
147         Public Function IsOverlapping(range As IntRange) As Boolean
148             Return ((IsInside(range.Min)) OrElse (IsInside(range.Max)))
149         End Function
150
151         Public Function IsInside(range As IRanges(Of Integer)) As Boolean Implements IRanges(Of Integer).IsInside
152             Return ((IsInside(range.Min)) AndAlso (IsInside(range.Max)))
153         End Function
154
155         Public Function IsOverlapping(range As IRanges(Of Integer)) As Boolean Implements IRanges(Of Integer).IsOverlapping
156             Return ((IsInside(range.Min)) OrElse (IsInside(range.Max)))
157         End Function
158
159         ''' <summary>
160         ''' Transform a numeric value in this <see cref="IntRange"/> into 
161         ''' target numeric range: ``<paramref name="valueRange"/>``.
162         ''' (将当前的范围内的一个实数映射到另外的一个范围内的实数区间之中)
163         ''' </summary>
164         ''' <param name="x#"></param>
165         ''' <param name="valueRange"></param>
166         ''' <returns></returns>
167         Public Function ScaleMapping(x%, valueRange As IntRange) As Double
168             Dim percent# = (x - Min) / Length
169             Dim value# = percent * valueRange.Length + valueRange.Min
170             Return value
171         End Function
172
173         ''' <summary>
174         ''' 枚举出这个数值范围内的所有整数值,步长为1
175         ''' </summary>
176         ''' <returns></returns>
177         Public Iterator Function GetEnumerator() As IEnumerator(Of IntegerImplements IEnumerable(Of Integer).GetEnumerator
178             For i As Integer = Min To Max
179                 Yield i
180             Next
181         End Function
182
183         Private Iterator Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
184             Yield GetEnumerator()
185         End Function
186
187         Public Shared Widening Operator CType(exp$) As IntRange
188             Dim r As New IntRange
189             Call exp.Parser(r.Min, r.Max)
190             Return r
191         End Operator
192
193         ' 2017-10-6
194         ' 因为下面的这个隐式转换操作符会和Vector的Item属性产生冲突,所以在这里将这个操作符移除掉
195         'Public Shared Widening Operator CType(values%()) As IntRange
196         '    With values
197         '        Return New IntRange(.Min, .Max)
198         '    End With
199         'End Operator
200     End Class
201 End Namespace