1 #Region "Microsoft.VisualBasic::885936b6fbb4d57df56eda9751cb7f64, Microsoft.VisualBasic.Core\ApplicationServices\Tools\Network\Protocol\Streams\VarArray.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 VarArray
35     
36     '         Constructor: (+2 OverloadsSub New
37     '         Function: Serialize
38     
39     
40     ' /********************************************************************************/
41
42 #End Region
43
44 Imports Microsoft.VisualBasic.ComponentModel.DataStructures
45 Imports Microsoft.VisualBasic.Language
46 Imports Microsoft.VisualBasic.Linq
47
48 Namespace Net.Protocols.Streams.Array
49
50     ''' <summary>
51     ''' The bytes length of the element in thee source sequence is not fixed.
52     ''' (序列里面的元素的长度是不固定的)
53     ''' </summary>
54     Public Class VarArray(Of T) : Inherits ArrayAbstract(Of T)
55
56         Sub New(TSerialize As Func(Of T, Byte()), load As Func(Of Byte(), T))
57             Call MyBase.New(TSerialize, load)
58         End Sub
59
60         Sub New(raw As Byte(),
61                 serilize As Func(Of T, Byte()),
62                 load As Func(Of Byte(), T))
63             Call Me.New(serilize, load)
64
65             Dim lb As Byte() = New Byte(INT64 - 1) {}
66             Dim buf As Byte()
67             Dim i As New Pointer
68             Dim list As New List(Of T)
69             Dim l As Long
70             Dim x As T
71
72             Do While raw.Length > i
73
74                 Call System.Array.ConstrainedCopy(raw, i << INT64, lb, Scan0, INT64)
75
76                 l = BitConverter.ToInt64(lb, Scan0)
77                 buf = New Byte(l - 1) {}
78
79                 Call System.Array.ConstrainedCopy(raw, i << buf.Length, buf, Scan0, buf.Length)
80
81                 x = load(buf)
82                 list += x
83             Loop
84
85             Values = list.ToArray
86         End Sub
87
88         ''' <summary>
89         ''' Long + T + Long + T
90         ''' 其中Long是一个8字节长度的数组,用来指示T的长度
91         ''' </summary>
92         ''' <returns></returns>
93         Public Overrides Function Serialize() As Byte()
94             Dim list As New List(Of Byte)
95             Dim LQuery = (From ind As SeqValue(Of T)
96                           In Values.SeqIterator.AsParallel
97                           Select ind.i,
98                               byts = __serialization(ind.value)
99                           Order By i Ascending)
100
101             For Each x In LQuery
102                 Dim byts As Byte() = x.byts
103                 Dim l As Long = byts.Length
104                 Dim lb As Byte() = BitConverter.GetBytes(l)
105
106                 Call list.AddRange(lb)
107                 Call list.AddRange(byts)
108             Next
109
110             Return list.ToArray
111         End Function
112     End Class
113 End Namespace