source: trunk/ab5.0/ablib/src/Classes/System/Collections/Generic/List.ab@ 519

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

ジェネリッククラスの型パラメータに値型が指定された場合、そのクラスがテンプレート展開されるように修正。ついに、下記のようなソースコードがビルド可能に!!!

#console

Dim b As System.Collections.Generic.List<Double>
b.Add( 10 )
b.Add( 20 )
Dim p = b As *Double	' ←ここがミソ!
Dim x = p[0]
Dim y = p[1]

Print x, y

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