Ignore:
Timestamp:
Mar 12, 2008, 12:52:54 AM (17 years ago)
Author:
NoWest
Message:

MemoryStreamの実装は一通り完了。TestCaseの方を作成します。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Include/Classes/System/IO/MemoryStream.ab

    r445 r472  
    77
    88Public
    9     /*
    10     0に初期化される拡張可能な容量を使用して初期化
     9    /*!
     10    @brief  MemoryStreamクラスの新しいインスタンスを初期化します。
     11    @author NoWest
     12    @date   2008/3/12
    1113    */
    1214    Sub MemoryStream()
    1315        This.writable = True
    14         This.Resizable = True
    15         This.visible = False
    16         This.handle = HeapCreate(0,0,0)
    17         This.p = HeapAlloc(This.handle,HEAP_ZERO_MEMORY,0)
    18         This.StreamLength = 0
    19         This.CurrentPosition = 0
    20     End Sub
     16        This.resizable = True
     17        This.visible = False
     18        This.create()
     19        This.pointer = This.allocate(0)
     20        This.streamLength = 0
     21        This.currentPosition = 0
     22    End Sub
     23
     24    /*!
     25    @brief  MemoryStreamクラスの新しいインスタンスを初期容量を指定して初期化します。
     26    @author NoWest
     27    @date   2008/3/12
     28    */
    2129    Sub MemoryStream(capacity As Long)
    2230        This.writable = True
    23         This.Resizable = True
    24         This.visible = False
    25         This.handle = HeapCreate(0,0,0)
    26         This.p = HeapAlloc(This.handle,HEAP_ZERO_MEMORY,capacity)
    27         This.StreamLength = capacity
    28         This.CurrentPosition = 0
    29     End Sub
     31        This.resizable = True
     32        This.visible = False
     33        This.create()
     34        This.pointer = This.allocate(capacity)
     35        This.streamLength = capacity
     36        This.currentPosition = 0
     37    End Sub
     38
     39    /*!
     40    @brief  MemoryStreamクラスの新しいインスタンスを指定したバッファに基づいて初期化します。容量を変更することはできません。
     41    @author NoWest
     42    @date   2008/3/12
     43    */
    3044    Sub MemoryStream(buffer As *Byte, length As Long)
    3145        This.writable = True
    32         This.Resizable = False
    33         This.visible = False
    34         This.handle = HeapCreate(0,0,0)
    35         This.p = HeapAlloc(This.handle,HEAP_ZERO_MEMORY,length)
    36         MoveMemory(This.p,buffer,length)
    37         This.StreamLength = length
    38         This.CurrentPosition = 0
    39     End Sub
     46        This.resizable = False
     47        This.visible = False
     48        This.create()
     49        This.pointer = This.allocate(length)
     50        MoveMemory(This.pointer,buffer,length)
     51        This.streamLength = length
     52        This.currentPosition = 0
     53    End Sub
     54
     55    /*!
     56    @brief  MemoryStreamクラスの新しいインスタンスを指定したバッファに基づいて初期化します。容量を変更することはできません。また、書き込みをサポートするかどうかも指定できます。
     57    @author NoWest
     58    @date   2008/3/12
     59    */
    4060    Sub MemoryStream(buffer As *Byte, length As Long, writable As Boolean)
    4161        This.writable = writable
    42         This.Resizable = False
    43         This.visible = False
    44         This.handle = HeapCreate(0,0,0)
    45         This.p = HeapAlloc(This.handle,HEAP_ZERO_MEMORY,length)
    46         MoveMemory(This.p,buffer,length)
    47         This.StreamLength = length
    48         This.CurrentPosition = 0
    49     End Sub
     62        This.resizable = False
     63        This.visible = False
     64        This.create()
     65        This.pointer = This.allocate(length)
     66        MoveMemory(This.pointer,buffer,length)
     67        This.streamLength = length
     68        This.currentPosition = 0
     69    End Sub
     70
     71    /*!
     72    @brief  MemoryStreamクラスの新しいインスタンスを指定したバッファの指定された領域に基づいて初期化します。容量を変更することはできません。
     73    @author NoWest
     74    @date   2008/3/12
     75    */
    5076    Sub MemoryStream(buffer As *Byte, index As Long, count As Long)
    5177        This.writable = True
    52         This.Resizable = False
    53         This.visible = False
    54         This.handle = HeapCreate(0,0,0)
    55         This.p = HeapAlloc(This.handle,HEAP_ZERO_MEMORY,count)
    56         MoveMemory(This.p,VarPtr(buffer[index]),count)
    57         This.StreamLength = count
    58         This.CurrentPosition = 0
    59     End Sub
     78        This.resizable = False
     79        This.visible = False
     80        This.create()
     81        This.pointer = This.allocate(count)
     82        MoveMemory(This.pointer,VarPtr(buffer[index]),count)
     83        This.streamLength = count
     84        This.currentPosition = 0
     85    End Sub
     86
     87    /*!
     88    @brief  MemoryStreamクラスの新しいインスタンスを指定したバッファの指定された領域に基づいて初期化します。容量を変更することはできません。また、書き込みをサポートするかどうかを指定できます。
     89    @author NoWest
     90    @date   2008/3/12
     91    */
    6092    Sub MemoryStream(buffer As *Byte, index As Long, count As Long, writable As Boolean)
    6193        This.writable = writable
    62         This.Resizable = False
    63         This.visible = False
    64         This.handle = HeapCreate(0,0,0)
    65         This.p = HeapAlloc(This.handle,HEAP_ZERO_MEMORY,count)
    66         MoveMemory(This.p,VarPtr(buffer[index]),count)
    67         This.StreamLength = count
    68         This.CurrentPosition = 0
    69     End Sub
     94        This.resizable = False
     95        This.visible = False
     96        This.create()
     97        This.pointer = This.allocate(count)
     98        MoveMemory(This.pointer,VarPtr(buffer[index]),count)
     99        This.streamLength = count
     100        This.currentPosition = 0
     101    End Sub
     102
     103    /*!
     104    @brief  MemoryStreamクラスの新しいインスタンスを指定したバッファの指定された領域に基づいて初期化します。容量を変更することはできません。また、書き込みをサポートするかどうかを指定できます。GetBufferメソッドをサポートするかどうかを指定できます。
     105    @author NoWest
     106    @date   2008/3/12
     107    */
    70108    Sub MemoryStream(buffer As *Byte, index As Long, count As Long, writable As Boolean, visible As Boolean)
    71109        This.writable = writable
    72         This.Resizable = False
     110        This.resizable = False
    73111        This.visible = visible
    74         This.handle = HeapCreate(0,0,0)
    75         This.p = HeapAlloc(This.handle,HEAP_ZERO_MEMORY,count)
    76         MoveMemory(This.p,VarPtr(buffer[index]),count)
    77         This.StreamLength = count
    78         This.CurrentPosition = 0
    79     End Sub
     112        This.create()
     113        This.pointer = This.allocate(count)
     114        MoveMemory(This.pointer,VarPtr(buffer[index]),count)
     115        This.streamLength = count
     116        This.currentPosition = 0
     117    End Sub
     118
     119    /*!
     120    @brief  MemoryStreamクラスのデストラクタです。
     121    @author NoWest
     122    @date   2008/3/12
     123    */
    80124    Sub ~MemoryStream()
    81125        This.Close()
     
    83127
    84128Public
     129    /*!
     130    @brief  ストリームが読み取りをサポートしているかどうかを示す値を取得します。
     131    @author NoWest
     132    @date   2008/3/12
     133    */
    85134    Override Function CanRead() As Boolean
    86         If This.p Then
     135        If This.pointer Then
    87136            Return True
    88137        Else
     
    91140    End Function
    92141
     142    /*!
     143    @brief  ストリームがシークをサポートしているかどうかを示す値を取得します。
     144    @author NoWest
     145    @date   2008/3/12
     146    */
    93147    Override Function CanSeek() As Boolean
    94         If This.p Then
     148        If This.pointer Then
    95149            Return True
    96150        Else
     
    99153    End Function
    100154
     155    /*!
     156    @brief  ストリームが書き込みをサポートしているかどうかを示す値を取得します。
     157    @author NoWest
     158    @date   2008/3/12
     159    */
    101160    Override Function CanWrite() As Boolean
    102         If This.p Then
     161        If This.pointer Then
    103162            Return This.writable
    104163        Else
     
    107166    End Function
    108167
    109     /*
    110     メモリの容量であってストリームの長さではない
    111     メモリはヒープからブロック単位で確保されるので
    112     指定したストリーム長より大きくなることがある
    113     また、配列として扱う場合の配列長となる
     168    /*!
     169    @brief  ストリームに割り当てるメモリ容量をバイト単位で設定します。
     170    @author NoWest
     171    @date   2008/3/12
     172    */
     173    Virtual Sub Capacity(value As Long)
     174        If This.pointer = 0 Then Throw New ObjectDisposedException("MemoryStream: This stream has closed.")
     175        If value < 0 Then Throw New ArgumentOutOfRangeException("MemoryStream.Capacity: A capacity is set to negative value.", New System.Int64(value),"Capacity")
     176        If value < This.streamLength Then Throw New ArgumentOutOfRangeException("MemoryStream.Capacity: A capacity is less than the current length of the stream.",New System.Int64(value),"Capacity")
     177        This.pointer = This.reallocate(This.pointer,value)
     178    End Sub
     179
     180    /*!
     181    @brief  ストリームに割り当てられたメモリ容量をバイト単位で取得します。
     182    @author NoWest
     183    @date   2008/3/12
    114184    */
    115185    Virtual Function Capacity() As Long
    116         If This.p = 0 Then Debug'Throw New ObjectDisposedException
    117         Return HeapSize(This.handle,0,This.p)
    118     End Function
    119 
    120     Virtual Sub Capacity(value As Long)
    121         If This.p = 0 Then Debug'Throw New ObjectDisposedException
    122         If value < 0 Then Debug'Throw New ArgumentOutOfRangeException
    123         If value < This.StreamLength Then Debug'Throw New ArgumentOutOfRangeException
    124         This.p = HeapReAlloc(This.handle,HEAP_ZERO_MEMORY,This.p,value)
    125     End Sub
    126 
    127     /*
    128     こちらは容量とは別のストリーム長
    129     実際のデータの長さはこちら
     186        If This.pointer = 0 Then Throw New ObjectDisposedException("MemoryStream: This stream has closed.")
     187        Return This.size(This.pointer)
     188    End Function
     189
     190    /*!
     191    @brief  ストリームの長さをバイト単位で取得します。Capacityプロパティの値より小さい場合があります。
     192    @author NoWest
     193    @date   2008/3/12
    130194    */
    131195    Override Function Length() As Int64
    132         If This.p = 0 Then Debug'Throw New ObjectDisposedException
    133         Return This.StreamLength
    134     End Function
    135 
    136     /*
    137     ストリームの現在位置を取得または設定
     196        If This.pointer = 0 Then Throw New ObjectDisposedException("MemoryStream: This stream has closed.")
     197        Return This.streamLength
     198    End Function
     199
     200    /*!
     201    @brief  ストリームの現在位置を設定します。
     202    @author NoWest
     203    @date   2008/3/12
    138204    */
    139205    Override Sub Position(value As Int64)
    140         If This.p = 0 Then Debug'Throw New ObjectDisposedException
    141         If value < 0 Then Debug'Throw New ArgumentOutOfRangeException
    142         If value > Int32.MaxValue() Then Debug'Throw New ArgumentOutOfRangeException
    143         This.CurrentPosition = value As Long
    144     End Sub
    145 
     206        If This.pointer = 0 Then Throw New ObjectDisposedException("MemoryStream: This stream has closed.")
     207        If value < 0 Then Throw New ArgumentOutOfRangeException("MemoryStream.Position: The position is set to a negative value.", New System.Int64(value), "Position")
     208        If value > Int32.MaxValue() Then Throw New ArgumentOutOfRangeException("MemoryStream.Position: The position is a value greater than MaxValue.", New System.Int64(value), "Position")
     209        This.currentPosition = value As Long
     210    End Sub
     211
     212    /*!
     213    @brief  ストリームの現在位置を取得します。
     214    @author NoWest
     215    @date   2008/3/12
     216    */
    146217    Override Function Position() As Int64
    147         If This.p = 0 Then Debug'Throw New ObjectDisposedException
    148         Return This.CurrentPosition As Int64
     218        If This.pointer = 0 Then Throw New ObjectDisposedException("MemoryStream: This stream has closed.")
     219        Return This.currentPosition As Int64
    149220    End Function
    150221
     
    157228    End Function*/
    158229
     230    /*!
     231    @brief  ストリームから指定されたバイト数を読み取り、bufferに書き込みます。
     232    @author NoWest
     233    @date   2008/3/12
     234    */
    159235    Override Function Read(buffer As *Byte, offset As Long, count As Long) As Long
    160         If This.p = 0 Then Debug'Throw New ObjectDisposedException
    161         If buffer = 0 Then Debug 'Throw New ArgumentNullException
    162         If offset < 0 Then Debug'Throw New ArgumentOutOfRangeException
    163         If count < 0 Then Debug'Throw New ArgumentOutOfRangeException
    164         If (This.StreamLength - (This.CurrentPosition + count)) < 0 Then
    165             count + = (This.StreamLength - (This.CurrentPosition + count))
     236        If This.pointer = 0 Then Throw New ObjectDisposedException("MemoryStream: This stream has closed.")
     237        If buffer = 0 Then Throw New ArgumentNullException("FileStream.Read: An argument is a null value.", "buffer")
     238        If offset < 0 Then Throw New ArgumentOutOfRangeException("MemoryStream.Read: An argument is a negative value.", New System.Int64(offset), "offset")
     239        If count < 0 Then Throw New ArgumentOutOfRangeException("MemoryStream.Read: An argument is a negative value.", New System.Int64(count), "count")
     240        If (This.streamLength - (This.currentPosition + count)) < 0 Then
     241            count + = (This.streamLength - (This.currentPosition + count))
    166242        ElseIf count < 1 Then
    167243            Return 0
    168244        End If
    169         MoveMemory(VarPtr(buffer[offset]),VarPtr(This.p[This.CurrentPosition]),count)
    170         This.CurrentPosition + = count
     245        MoveMemory(VarPtr(buffer[offset]),VarPtr(This.pointer[This.currentPosition]),count)
     246        This.currentPosition + = count
    171247        Return count
    172248    End Function
    173249
     250    /*!
     251    @brief  ストリームから指定された1バイト読み取ります。
     252    @author NoWest
     253    @date   2008/3/12
     254    */
    174255    Override Function ReadByte() As Long
    175256        Dim b As Byte
     
    182263    End Function
    183264
     265    /*!
     266    @brief  ストリーム内の位置を指定した値に設定します。
     267    @author NoWest
     268    @date   2008/3/12
     269    */
    184270    Override Function Seek(offset As Int64, origin As SeekOrigin) As Int64
    185         If This.p = 0 Then Debug'Throw New ObjectDisposedException
    186         If offset > Int32.MaxValue() Then Debug'Throw New ArgumentOutOfRangeException
     271        If This.pointer = 0 Then Throw New ObjectDisposedException("MemoryStream: This stream has closed.")
     272        If offset > Int32.MaxValue() Then Throw New ArgumentOutOfRangeException("MemoryStream.Seek: The offset is a value greater than MaxValue.", New System.Int64(offset), "offset")
    187273        Select Case origin
    188274            Case SeekOrigin.Begin
    189                 If offset < 0 Then Debug 'Throw New IOException
    190                 This.CurrentPosition = offset As Long
     275                If offset < 0 Then Throw New IOException("MemoryStream.Seek: Seeking is attempted before the beginning of the stream.")
     276                This.currentPosition = offset As Long
    191277            Case SeekOrigin.Current
    192278                Beep(440,10)
    193                 If (This.CurrentPosition + offset) < 0 Then Debug 'Throw New IOException
    194                 This.CurrentPosition += offset As Long
     279                If (This.currentPosition + offset) < 0 Then Throw New IOException("MemoryStream.Seek: Seeking is attempted before the beginning of the stream.")
     280                This.currentPosition += offset As Long
    195281            Case SeekOrigin.End
    196                 If (This.StreamLength + offset) < 0 Then Debug 'Throw New IOException
    197                 This.CurrentPosition = (This.StreamLength + offset) As Long
     282                If (This.streamLength + offset) < 0 Then Throw New IOException("MemoryStream.Seek: Seeking is attempted before the beginning of the stream.")
     283                This.currentPosition = (This.streamLength + offset) As Long
    198284            Case Else
    199                 Debug 'Throw New ArgumentException
     285                Throw New ArgumentException("MemoryStream.Seek: An argument is an invalid SeekOrigin","origin")
    200286        End Select
    201         Return This.CurrentPosition As Int64
    202     End Function
    203 
     287        Return This.currentPosition As Int64
     288    End Function
     289
     290    /*!
     291    @brief  ストリームの長さを設定します。メモリ容量を超えては設定できません。
     292    @author NoWest
     293    @date   2008/3/12
     294    */
    204295    Override Sub SetLength(value As Int64)
    205         If This.p = 0 Then Debug'Throw New ObjectDisposedException
    206         If This.writable = False Then Debug 'Throw New NotSupportedException
    207         If This.Resizable = False Then Debug 'Throw New NotSupportedException
    208         If value < 0 Then Debug'Throw New ArgumentOutOfRangeException
    209         If value > Int32.MaxValue() Then Debug'Throw New ArgumentOutOfRangeException
    210         This.p = HeapReAlloc(This.handle,HEAP_ZERO_MEMORY,This.p,value As Long)
    211         This.StreamLength = value As Long
    212     End Sub
    213 
     296        If This.pointer = 0 Then Throw New ObjectDisposedException("MemoryStream: This stream has closed.")
     297        If This.writable = False Then Throw New NotSupportedException("MemoryStream: The current stream is not writable")
     298        If This.resizable = False Then Throw New NotSupportedException("MemoryStream: The current stream is not resizable")
     299        If value > This.Capacity() Then Throw New NotSupportedException("MemoryStream.SetLength: This stream length is larger than the current capacity.")
     300        If value < 0 Then Throw New ArgumentOutOfRangeException("MemoryStream.Read: An argument is a negative value.", New System.Int64(value), "value")
     301        If value > Int32.MaxValue() Then Throw New ArgumentOutOfRangeException("MemoryStream.SetLength: The length is a value greater than MaxValue.", New System.Int64(value), "value")
     302        This.pointer = This.reallocate(This.pointer,value As Long)
     303        This.streamLength = value As Long
     304    End Sub
     305
     306    /*!
     307    @brief  ストリームにbufferの内容を指定したバイト数書き込みます。
     308    @author NoWest
     309    @date   2008/3/12
     310    */
    214311    Override Sub Write(buffer As *Byte, offset As Long, count As Long)
    215         If This.p = 0 Then Debug'Throw New ObjectDisposedException
    216         If This.writable = False Then Debug'Throw New NotSupportedException
    217         If buffer = 0 Then Debug 'Throw New ArgumentNullException
    218         If offset < 0 Then Debug'Throw New ArgumentOutOfRangeException
    219         If count < 0 Then Debug'Throw New ArgumentOutOfRangeException
    220         If count > (This.StreamLength - This.CurrentPosition) Then
    221             If This.Resizable = False Then
    222                 Debug 'Throw New NotSupportedException
    223             Else
    224                 If count > (This.Capacity() - This.CurrentPosition) Then
    225                     This.p = HeapReAlloc(This.handle,HEAP_ZERO_MEMORY,This.p,This.CurrentPosition+count)
    226                 End If
    227                 This.StreamLength = This.CurrentPosition+count
     312        If This.pointer = 0 Then Throw New ObjectDisposedException("MemoryStream: This stream has closed.")
     313        If This.writable = False Then Throw New NotSupportedException("MemoryStream: The current stream is not writable")
     314        If buffer = 0 Then Throw New ArgumentNullException("MemoryStream.Write: An argument is a null value.", "buffer")
     315        If offset < 0 Then Throw New ArgumentOutOfRangeException("MemoryStream.Write: An argument is a negative value.", New System.Int64(offset), "offset")
     316        If count < 0 Then Throw New ArgumentOutOfRangeException("MemoryStream.Write: An argument is a negative value.", New System.Int64(count), "count")
     317        If count > (This.streamLength - This.currentPosition) Then
     318            If This.resizable = False Then Throw New NotSupportedException("MemoryStream: The current stream is not resizable")
     319            If (This.Capacity() - This.currentPosition) < count Then
     320                This.pointer = This.reallocate(This.pointer,This.currentPosition+count)
    228321            End If
    229         End If
    230         MoveMemory(VarPtr(This.p[This.CurrentPosition]),VarPtr(buffer[offset]),count)
    231         This.CurrentPosition + = count
    232     End Sub
    233 
     322            This.streamLength = This.currentPosition+count
     323        End If
     324        MoveMemory(VarPtr(This.pointer[This.currentPosition]),VarPtr(buffer[offset]),count)
     325        This.currentPosition + = count
     326    End Sub
     327
     328    /*!
     329    @brief  ストリームに1バイト書き込みます。
     330    @author NoWest
     331    @date   2008/3/12
     332    */
    234333    Override Sub WriteByte(b As Byte)
    235334        Write(VarPtr(b), 0, 1)
    236335    End Sub
    237336
    238 /*  Virtual Function ToArray() As List<Byte>
     337/*  Virtual Function ToArray() As Array<Byte>
    239338        TODO:
    240339    End Function*/
    241340
     341    /*!
     342    @brief  ストリームの内容全体をまるごと別のストリームに書き込みます。
     343    @author NoWest
     344    @date   2008/3/12
     345    */
    242346    Virtual Sub WriteTo(stream As Stream)
    243         If This.p = 0 Then Debug'Throw New ObjectDisposedException
    244         If ActiveBasic.IsNothing(stream) Then Debug 'Throw New ArgumentNullException("path")
    245         stream.Write(This.p,0,This.Capacity())
     347        If This.pointer = 0 Then Throw New ObjectDisposedException("MemoryStream: This stream has closed.")
     348        If ActiveBasic.IsNothing(stream) Then Throw New ArgumentNullException("MemoryStream.WriteTo: An argument is a null value.", "stream")
     349        stream.Write(This.pointer,0,This.Capacity())
    246350    End Sub
    247351
    248352Protected
     353
     354    /*!
     355    @brief  Streamクラスから継承
     356    @author NoWest
     357    @date   2008/3/12
     358    */
    249359    Override Sub Dispose(disposing As Boolean)
    250         HeapFree(This.handle,0,InterlockedExchangePointer(ByVal VarPtr(This.p) As VoidPtr,NULL) As VoidPtr)
     360        This.destroy()
     361    End Sub
     362
     363Private
     364    /* Heap memory address */
     365    pointer As *Byte
     366    /* MemoryStream status */
     367    writable As Boolean
     368    resizable As Boolean
     369    visible As Boolean
     370    streamLength As Long
     371    currentPosition As Long
     372
     373    /*
     374    バッファ管理用のPrivate関数類
     375    一応初期設定ではGC_mallocでメモリを確保しています。
     376    */
     377    handle As HANDLE
     378    Sub create()
     379#ifdef NOT_USE_GC
     380        This.handle = HeapCreate(0,0,0)
     381#endif
     382    End Sub
     383
     384    Sub destroy()
     385#ifdef NOT_USE_GC
     386        HeapFree(This.handle,0,InterlockedExchangePointer(ByVal VarPtr(This.pointer) As VoidPtr,NULL) As VoidPtr)
    251387        HeapDestroy(InterlockedExchangePointer(ByVal VarPtr(This.handle) As VoidPtr,NULL) As HANDLE)
    252     End Sub
    253 
    254     /* status */
    255     writable As Boolean
    256     Resizable As Boolean
    257     visible As Boolean
    258 
    259     StreamLength As Long
    260     CurrentPosition As Long
    261 
    262 Private
    263     handle As HANDLE
    264     p As *Byte
     388#endif
     389    End Sub
     390
     391    Function allocate(length As SIZE_T) As VoidPtr
     392#ifdef NOT_USE_GC
     393        Return HeapAlloc(This.handle,HEAP_ZERO_MEMORY,length)
     394#else
     395        Return GC_malloc_atomic(length)
     396#endif
     397    End Function
     398
     399    Function reallocate(p As VoidPtr, length As SIZE_T) As VoidPtr
     400#ifdef NOT_USE_GC
     401        Return HeapReAlloc(This.handle,HEAP_ZERO_MEMORY,p,This.currentPosition+count)
     402#else
     403        Return _System_pGC->__realloc(p,length)
     404#endif
     405    End Function
     406
     407    Function size(p As VoidPtr) As Long
     408#ifdef NOT_USE_GC
     409        Return HeapSize(This.handle,0,p)
     410#else
     411        Dim pmemobj = _System_pGC->GetMemoryObjectPtr(p)
     412        Return pmemobj->size
     413#endif
     414    End Function
    265415End Class
    266416
Note: See TracChangeset for help on using the changeset viewer.