1 #Region "Microsoft.VisualBasic::095eadeb4f32a2a5c55846088f4d4722, Microsoft.VisualBasic.Core\ComponentModel\DataStructures\LoopArray.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 LoopArray
35     
36     '         Properties: Buffer, Current, Length
37     
38     '         Constructor: (+1 OverloadsSub New
39     
40     '         Function: [GET], [Next], GetEnumerator, IEnumerable_GetEnumerator, ToString
41     
42     '         Sub: [Set], Break, Reset
43     
44     '         Operators: +
45     
46     
47     ' /********************************************************************************/
48
49 #End Region
50
51 Imports System.Runtime.CompilerServices
52 Imports Microsoft.VisualBasic.Linq
53 Imports Microsoft.VisualBasic.Serialization.JSON
54
55 Namespace ComponentModel.DataStructures
56
57     ''' <summary>
58     ''' Infinite loop iterates of the target element collection.
59     ''' </summary>
60     ''' <typeparam name="T"></typeparam>
61     Public Class LoopArray(Of T) : Implements IEnumerable(Of T)
62
63         Dim array As T()
64         Dim p%
65
66         Public ReadOnly Property Buffer As T()
67             <MethodImpl(MethodImplOptions.AggressiveInlining)>
68             Get
69                 Return array
70             End Get
71         End Property
72
73         Public ReadOnly Property Length As Integer
74             <MethodImpl(MethodImplOptions.AggressiveInlining)>
75             Get
76                 Return array.Length
77             End Get
78         End Property
79
80         Public ReadOnly Property Current As SeqValue(Of T)
81             Get
82                 Return New SeqValue(Of T)() With {
83                     .i = p,
84                     .value = array(.i)
85                 }
86             End Get
87         End Property
88
89         <MethodImpl(MethodImplOptions.AggressiveInlining)>
90         Sub New(source As IEnumerable(Of T))
91             array = source.ToArray
92         End Sub
93
94         ''' <summary>
95         ''' Gets the next elements in the array, is move to end, then the index will moves to the array begining position.
96         ''' </summary>
97         ''' <returns></returns>
98         Public Function [Next]() As T
99             If p < array.Length - 1 Then
100                 p += 1
101             Else
102                 p = 0
103             End If
104
105             Return array(p)
106         End Function
107
108         <MethodImpl(MethodImplOptions.AggressiveInlining)>
109         Public Sub [Set](i%)
110             p = i%
111         End Sub
112
113         <MethodImpl(MethodImplOptions.AggressiveInlining)>
114         Public Sub Reset()
115             p = 0
116         End Sub
117
118         Public Overrides Function ToString() As String
119             Return array.Take(10).ToArray.GetJson
120         End Function
121
122         ''' <summary>
123         ''' 
124         ''' </summary>
125         ''' <param name="delta%">The pointer move delta</param>
126         ''' <returns></returns>
127         Public Function [GET](delta%) As T
128             p += delta
129
130             If p >= 0 Then
131                 If p <= array.Length - 1 Then
132                     ' 正常的下标范围内,不需要进行任何处理
133                 Else
134                     p = p - array.Length
135                 End If
136             Else
137                 p = array.Length + p
138             End If
139
140             Return array(p)
141         End Function
142
143         Public Shared Narrowing Operator CType(array As LoopArray(Of T)) As T()
144             Return array.Buffer
145         End Operator
146
147         Public Shared Widening Operator CType(array As T()) As LoopArray(Of T)
148             Return New LoopArray(Of T)(array)
149         End Operator
150
151         Public Shared Operator +(array As LoopArray(Of T)) As SeqValue(Of T)
152             Call array.Next()
153             Return array.Current
154         End Operator
155
156         Dim _break As Boolean
157
158         ''' <summary>
159         ''' Exit the Infinite loop iterator <see cref="GetEnumerator()"/>
160         ''' </summary>
161         Public Sub Break()
162             _break = True
163         End Sub
164
165         ''' <summary>
166         ''' Infinite loop iterates of the target element collection.
167         ''' </summary>
168         ''' <returns></returns>
169         Public Iterator Function GetEnumerator() As IEnumerator(Of T) Implements IEnumerable(Of T).GetEnumerator
170             _break = False
171
172             Do While Not _break
173                 Yield [Next]()
174             Loop
175         End Function
176
177         Private Iterator Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
178             Yield GetEnumerator()
179         End Function
180     End Class
181 End Namespace