source: trunk/Include/Classes/System/Collections/Generic/List.ab@ 386

Last change on this file since 386 was 386, checked in by dai, 16 years ago

StrPtr内の判定ミスを修正。
SPrintFクラス内のx64に対するコードを修正。
ArrayListクラスのIListインターフェイス実装を一旦保留。
ListクラスにIEnumeratable、IEnumeratorインターフェイスを実装(まだ実装中…)。

File size: 3.8 KB
Line 
1
2Namespace System
3Namespace Collections
4Namespace Generic
5
6Class List<T>
7 Implements IEnumerable, IEnumerator
8 items As *T
9 size As Long
10
11 currentIndexForEnumerator As Long
12
13 Sub Realloc( allocateSize As Long )
14 items = realloc( items, allocateSize * SizeOf(VoidPtr) )
15 End Sub
16
17Public
18 Sub List()
19 items = GC_malloc( 1 )
20 End Sub
21 Sub ~List()
22 End Sub
23
24 /*!
25 @brief インデクサ
26 @author Daisuke Yamamoto
27 @date 2007/08/22
28 @param インデックス
29 */
30 Function Operator[] ( index As Long ) As T
31 Return items[index]
32 End Function
33
34
35 '----------------------------------------------------------------
36 ' パブリック プロパティ
37 '----------------------------------------------------------------
38
39 /*!
40 @brief Listに格納されている要素の数を取得する
41 @author Daisuke Yamamoto
42 @date 2007/08/22
43 */
44 Function Count() As Long
45 Return size
46 End Function
47
48
49 '----------------------------------------------------------------
50 ' パブリック メソッド
51 '----------------------------------------------------------------
52
53 /*!
54 @brief Listの末端に要素を追加する
55 @author Daisuke Yamamoto
56 @date 2007/08/22
57 @param 追加するオブジェクト
58 */
59 Sub Add( item As T )
60 Realloc( size + 1 )
61
62 items[size] = item
63 size++
64 End Sub
65
66 /*!
67 @brief Listからすべての要素を削除する
68 @author Daisuke Yamamoto
69 @date 2007/08/22
70 */
71 Sub Clear()
72 size = 0
73 End Sub
74
75 /*!
76 @brief List内から、最初に出現する値のインデックスを取得する
77 @author Daisuke Yamamoto
78 @date 2007/08/22
79 @return インデックス(見つからなかったときは-1)
80 */
81 Function IndexOf( item As T ) As Long
82 Dim i As Long
83 For i = 0 To ELM(size)
84 If items[i].Equals(item) Then
85 Return i
86 End If
87 Next
88 Return -1
89 End Function
90
91 /*!
92 @brief List内の指定したインデックスの位置に要素を挿入する
93 @author Daisuke Yamamoto
94 @date 2007/08/22
95 */
96 Sub Insert( index As Long, item As T )
97 Realloc( size + 1 )
98 memmove( items + (index+1)*SizeOf(VoidPtr), items + index*SizeOf(VoidPtr), (size-index)*SizeOf(VoidPtr) )
99 items[index] = item
100 size++
101 End Sub
102
103 /*!
104 @brief List内で最初に出現する値を削除する
105 @author Daisuke Yamamoto
106 @date 2007/09/28
107 @return 値が削除されたときはTrue、されなかったときはFlaseが返る
108 */
109 Function Remove( item As T ) As Boolean
110 Dim index = IndexOf( item )
111 If index = -1 Then
112 Return False
113 End If
114
115 RemoveAt( index )
116 Return True
117 End Function
118
119 /*!
120 @brief List内の指定したインデックスの要素を削除する
121 @author Daisuke Yamamoto
122 @date 2007/10/03
123 @return 値が削除されたときはTrue、されなかったときはFlaseが返る
124 */
125 Sub RemoveAt( index As Long )
126 memmove( items + index*SizeOf(VoidPtr), items + (index+1)*SizeOf(VoidPtr), (size-(index+1))*SizeOf(VoidPtr) )
127 Realloc( size - 1 )
128 size--
129 End Sub
130
131 /*!
132 @brief IEnumeratorインターフェイスを取得する
133 @author Daisuke Yamamoto
134 @date 2007/11/19
135 @return IEnumeratorインターフェイスが返る
136 */
137 Function GetEnumerator() As IEnumerator
138 Return This
139 End Function
140
141 /*!
142 @brief イテレータのカレントインデックスを増加させる
143 @author Daisuke Yamamoto
144 @date 2007/11/19
145 @return 上限に達していなければTrueが、達していればFalseが返る
146 */
147 Function MoveNext() As Boolean
148 If currentIndexForEnumerator >= size Then
149 ' 上限に達した
150 Return False
151 End If
152
153 currentIndexForEnumerator ++
154 Return True
155 End Function
156
157 /*!
158 @brief イテレータをリセットする
159 @author Daisuke Yamamoto
160 @date 2007/11/19
161 */
162 Sub Reset()
163 currentIndexForEnumerator = 0
164 End Sub
165
166 /*!
167 @brief イテレータのカレントオブジェクトを取得する
168 @author Daisuke Yamamoto
169 @date 2007/11/19
170 @return カレントオブジェクトが返る
171 */
172 Function Current() As Object
173 Return items[currentIndexForEnumerator] As Object
174 End Function
175End Class
176
177End Namespace
178End Namespace
179End Namespace
Note: See TracBrowser for help on using the repository browser.