Namespace System Namespace Collections Namespace Generic Class List Inherits IList items As *T size As Long count As Long currentIndexForEnumerator As Long Sub Realloc( allocateSize As Long ) items = realloc( items, allocateSize * SizeOf(T) ) End Sub Public Sub List() items = GC_malloc( 1 ) ' 列挙子の位置を初期化 Reset() End Sub /*! @brief 予め要素数を指定してListを初期化 @author NoWest @date 2008/07/13 @param リストの要素数 */ Sub List( capacity As Long ) This.List() If capacity > 0 Then This.size = capacity Realloc(capacity) End If End Sub /*! @brief 既存の配列Listを初期化 @author NoWest @date 2008/07/13 @param インデックス */ Sub List( array As *T, length As Long ) This.List( length ) memmove( This.items, array, length * SizeOf(T) ) This.count = length End Sub Sub ~List() End Sub /*! @brief インデクサ @author Daisuke Yamamoto @date 2007/08/22 @param インデックス */ Override Sub Operator[] ( index As Long, item As T ) items[index]=item End Sub Override Function Operator[] ( index As Long ) As T Return items[index] End Function /*! @brief ポインタ型へのキャスト @author Daisuke Yamamoto @date 2007/08/22 @param インデックス */ Function Operator() As *T Return items End Function '---------------------------------------------------------------- ' パブリック プロパティ '---------------------------------------------------------------- /*! @brief Listに格納されている要素の数を取得する @author Daisuke Yamamoto @date 2007/08/22 */ Override Function Count() As Long Return This.count End Function /*! @brief Listが読み込み専用かどうかを取得する @author NoWest @date 2008/07/12 */ Override Function IsReadOnly() As Boolean Return False End Function '---------------------------------------------------------------- ' パブリック メソッド '---------------------------------------------------------------- /*! @brief Listの末端に要素を追加する @author Daisuke Yamamoto @date 2007/08/22 @param 追加するオブジェクト */ Override Sub Add( item As T ) If This.size < (This.count + 1) Then This.size++ Realloc( This.size ) End If This.items[ This.count ] = item This.count++ End Sub ' Function AsReadOnly() As ReadOnlyCollection /*! @brief Listからすべての要素を削除する @author Daisuke Yamamoto @date 2007/08/22 */ Override Sub Clear() This.count = 0 End Sub /* Override Function Contains ( item As T ) As Boolean TODO End Function*/ /*! @brief List内から、最初に出現する値のインデックスを取得する @author Daisuke Yamamoto @date 2007/08/22 @return インデックス(見つからなかったときは-1) */ Override Function IndexOf( item As T ) As Long Dim i As Long For i = 0 To ELM( This.count ) If items[i].Equals(item) Then Return i End If Next Return -1 End Function /*! @brief List内の指定したインデックスの位置に要素を挿入する @author Daisuke Yamamoto @date 2007/08/22 */ Override Sub Insert( index As Long, item As T ) If This.size < (This.count + 1) Then This.size++ Realloc( This.size ) End If memmove( items + (index+1)*SizeOf(T), items + index*SizeOf(T), (This.count - index)*SizeOf(T) ) items[index] = item This.count++ End Sub /*! @brief List内で最初に出現する値を削除する @author Daisuke Yamamoto @date 2007/09/28 @return 値が削除されたときはTrue、されなかったときはFlaseが返る */ Override Function Remove( item As T ) As Boolean Dim index = IndexOf( item ) If index = -1 Then Return False End If RemoveAt( index ) Return True End Function /*! @brief List内の指定したインデックスの要素を削除する @author Daisuke Yamamoto @date 2007/10/03 */ Override Sub RemoveAt( index As Long ) memmove( items + index*SizeOf(T), items + (index+1)*SizeOf(T), (This.count - (index+1))*SizeOf(T) ) This.count-- End Sub /*! @brief Listの要素を文字列で返す @author OverTaker @date 2008/6/26 @return 文字列 */ Override Function ToString() As String Dim string As String Dim i As Long For i = 0 To ELM( This.count ) string += This[i].ToString() + Ex"\r\n" Next Return string + This[i].ToString() End Function /*! @brief 実際の要素数が現在の容量の 90% 未満の場合は、容量をその数に設定します @author NoWest @date 2008/07/20 */ Sub TrimExcess () Dim pmemobj = _System_pGC->GetMemoryObjectPtr( items ) If ( This.size ) * 0.9 > This.count Then This.size = This.count Realloc( This.size ) End If End Sub /*! @brief IEnumeratorインターフェイスを取得する @author Daisuke Yamamoto @date 2007/11/19 @return IEnumeratorインターフェイスが返る */ Override Function GetEnumerator() As IEnumerator Return This End Function /*! @brief イテレータのカレントインデックスを増加させる @author Daisuke Yamamoto @date 2007/11/19 @return 上限に達していなければTrueが、達していればFalseが返る */ Override Function MoveNext() As Boolean If currentIndexForEnumerator + 1 >= size Then ' 上限に達した Return False End If currentIndexForEnumerator ++ Return True End Function /*! @brief イテレータをリセットする @author Daisuke Yamamoto @date 2007/11/19 */ Override Sub Reset() currentIndexForEnumerator = -1 End Sub /*! @brief イテレータのカレントオブジェクトを取得する @author Daisuke Yamamoto @date 2007/11/19 @return カレントオブジェクトが返る */ Override Function Current() As T If currentIndexForEnumerator = -1 Then ' MoveNextメソッドがReset後、一度も呼び出されなかった Return Nothing End If Return items[currentIndexForEnumerator] End Function End Class End Namespace End Namespace End Namespace