2
2
// The .NET Foundation licenses this file to you under the MIT license.
3
3
// See the LICENSE file in the project root for more information.
4
4
5
- using System ;
6
- using System . Collections . Immutable ;
7
- using System . Diagnostics . CodeAnalysis ;
8
5
using Microsoft . CodeAnalysis . PooledObjects ;
9
6
using Roslyn . Utilities ;
10
7
11
8
namespace Microsoft . CodeAnalysis
12
9
{
13
10
internal static class ArrayBuilderExtensions
14
11
{
15
- public static bool Any < T > ( this ArrayBuilder < T > builder , Func < T , bool > predicate )
16
- {
17
- foreach ( var item in builder )
18
- {
19
- if ( predicate ( item ) )
20
- {
21
- return true ;
22
- }
23
- }
24
- return false ;
25
- }
26
-
27
- public static bool Any < T , A > ( this ArrayBuilder < T > builder , Func < T , A , bool > predicate , A arg )
28
- {
29
- foreach ( var item in builder )
30
- {
31
- if ( predicate ( item , arg ) )
32
- {
33
- return true ;
34
- }
35
- }
36
- return false ;
37
- }
38
-
39
- public static bool All < T > ( this ArrayBuilder < T > builder , Func < T , bool > predicate )
40
- {
41
- foreach ( var item in builder )
42
- {
43
- if ( ! predicate ( item ) )
44
- {
45
- return false ;
46
- }
47
- }
48
- return true ;
49
- }
50
-
51
- public static bool All < T , A > ( this ArrayBuilder < T > builder , Func < T , A , bool > predicate , A arg )
52
- {
53
- foreach ( var item in builder )
54
- {
55
- if ( ! predicate ( item , arg ) )
56
- {
57
- return false ;
58
- }
59
- }
60
- return true ;
61
- }
62
-
63
- /// <summary>
64
- /// Maps an array builder to immutable array.
65
- /// </summary>
66
- /// <typeparam name="TItem"></typeparam>
67
- /// <typeparam name="TResult"></typeparam>
68
- /// <param name="items">The array to map</param>
69
- /// <param name="map">The mapping delegate</param>
70
- /// <returns>If the items's length is 0, this will return an empty immutable array</returns>
71
- public static ImmutableArray < TResult > SelectAsArray < TItem , TResult > ( this ArrayBuilder < TItem > items , Func < TItem , TResult > map )
72
- {
73
- switch ( items . Count )
74
- {
75
- case 0 :
76
- return ImmutableArray < TResult > . Empty ;
77
-
78
- case 1 :
79
- return ImmutableArray . Create ( map ( items [ 0 ] ) ) ;
80
-
81
- case 2 :
82
- return ImmutableArray . Create ( map ( items [ 0 ] ) , map ( items [ 1 ] ) ) ;
83
-
84
- case 3 :
85
- return ImmutableArray . Create ( map ( items [ 0 ] ) , map ( items [ 1 ] ) , map ( items [ 2 ] ) ) ;
86
-
87
- case 4 :
88
- return ImmutableArray . Create ( map ( items [ 0 ] ) , map ( items [ 1 ] ) , map ( items [ 2 ] ) , map ( items [ 3 ] ) ) ;
89
-
90
- default :
91
- var builder = ArrayBuilder < TResult > . GetInstance ( items . Count ) ;
92
- foreach ( var item in items )
93
- {
94
- builder . Add ( map ( item ) ) ;
95
- }
96
-
97
- return builder . ToImmutableAndFree ( ) ;
98
- }
99
- }
100
-
101
- /// <summary>
102
- /// Maps an array builder to immutable array.
103
- /// </summary>
104
- /// <typeparam name="TItem"></typeparam>
105
- /// <typeparam name="TArg"></typeparam>
106
- /// <typeparam name="TResult"></typeparam>
107
- /// <param name="items">The sequence to map</param>
108
- /// <param name="map">The mapping delegate</param>
109
- /// <param name="arg">The extra input used by mapping delegate</param>
110
- /// <returns>If the items's length is 0, this will return an empty immutable array.</returns>
111
- public static ImmutableArray < TResult > SelectAsArray < TItem , TArg , TResult > ( this ArrayBuilder < TItem > items , Func < TItem , TArg , TResult > map , TArg arg )
112
- {
113
- switch ( items . Count )
114
- {
115
- case 0 :
116
- return ImmutableArray < TResult > . Empty ;
117
-
118
- case 1 :
119
- return ImmutableArray . Create ( map ( items [ 0 ] , arg ) ) ;
120
-
121
- case 2 :
122
- return ImmutableArray . Create ( map ( items [ 0 ] , arg ) , map ( items [ 1 ] , arg ) ) ;
123
-
124
- case 3 :
125
- return ImmutableArray . Create ( map ( items [ 0 ] , arg ) , map ( items [ 1 ] , arg ) , map ( items [ 2 ] , arg ) ) ;
126
-
127
- case 4 :
128
- return ImmutableArray . Create ( map ( items [ 0 ] , arg ) , map ( items [ 1 ] , arg ) , map ( items [ 2 ] , arg ) , map ( items [ 3 ] , arg ) ) ;
129
-
130
- default :
131
- var builder = ArrayBuilder < TResult > . GetInstance ( items . Count ) ;
132
- foreach ( var item in items )
133
- {
134
- builder . Add ( map ( item , arg ) ) ;
135
- }
136
-
137
- return builder . ToImmutableAndFree ( ) ;
138
- }
139
- }
140
-
141
- /// <summary>
142
- /// Maps an array builder to immutable array.
143
- /// </summary>
144
- /// <typeparam name="TItem"></typeparam>
145
- /// <typeparam name="TArg"></typeparam>
146
- /// <typeparam name="TResult"></typeparam>
147
- /// <param name="items">The sequence to map</param>
148
- /// <param name="map">The mapping delegate</param>
149
- /// <param name="arg">The extra input used by mapping delegate</param>
150
- /// <returns>If the items's length is 0, this will return an empty immutable array.</returns>
151
- public static ImmutableArray < TResult > SelectAsArrayWithIndex < TItem , TArg , TResult > ( this ArrayBuilder < TItem > items , Func < TItem , int , TArg , TResult > map , TArg arg )
152
- {
153
- switch ( items . Count )
154
- {
155
- case 0 :
156
- return ImmutableArray < TResult > . Empty ;
157
-
158
- case 1 :
159
- return ImmutableArray . Create ( map ( items [ 0 ] , 0 , arg ) ) ;
160
-
161
- case 2 :
162
- return ImmutableArray . Create ( map ( items [ 0 ] , 0 , arg ) , map ( items [ 1 ] , 1 , arg ) ) ;
163
-
164
- case 3 :
165
- return ImmutableArray . Create ( map ( items [ 0 ] , 0 , arg ) , map ( items [ 1 ] , 1 , arg ) , map ( items [ 2 ] , 2 , arg ) ) ;
166
-
167
- case 4 :
168
- return ImmutableArray . Create ( map ( items [ 0 ] , 0 , arg ) , map ( items [ 1 ] , 1 , arg ) , map ( items [ 2 ] , 2 , arg ) , map ( items [ 3 ] , 3 , arg ) ) ;
169
-
170
- default :
171
- var builder = ArrayBuilder < TResult > . GetInstance ( items . Count ) ;
172
- foreach ( var item in items )
173
- {
174
- builder . Add ( map ( item , builder . Count , arg ) ) ;
175
- }
176
-
177
- return builder . ToImmutableAndFree ( ) ;
178
- }
179
- }
180
-
181
- public static void AddOptional < T > ( this ArrayBuilder < T > builder , T ? item )
182
- where T : class
183
- {
184
- if ( item != null )
185
- {
186
- builder . Add ( item ) ;
187
- }
188
- }
189
-
190
- // The following extension methods allow an ArrayBuilder to be used as a stack.
191
- // Note that the order of an IEnumerable from a List is from bottom to top of stack. An IEnumerable
192
- // from the framework Stack is from top to bottom.
193
- public static void Push < T > ( this ArrayBuilder < T > builder , T e )
194
- {
195
- builder . Add ( e ) ;
196
- }
197
-
198
- public static T Pop < T > ( this ArrayBuilder < T > builder )
199
- {
200
- var e = builder . Peek ( ) ;
201
- builder . RemoveAt ( builder . Count - 1 ) ;
202
- return e ;
203
- }
204
-
205
- public static bool TryPop < T > ( this ArrayBuilder < T > builder , [ MaybeNullWhen ( false ) ] out T result )
206
- {
207
- if ( builder . Count > 0 )
208
- {
209
- result = builder . Pop ( ) ;
210
- return true ;
211
- }
212
-
213
- result = default ;
214
- return false ;
215
- }
216
-
217
- public static T Peek < T > ( this ArrayBuilder < T > builder )
218
- {
219
- return builder [ builder . Count - 1 ] ;
220
- }
221
-
222
- public static ImmutableArray < T > ToImmutableOrEmptyAndFree < T > ( this ArrayBuilder < T > ? builder )
223
- {
224
- return builder ? . ToImmutableAndFree ( ) ?? ImmutableArray < T > . Empty ;
225
- }
226
-
227
- public static void AddIfNotNull < T > ( this ArrayBuilder < T > builder , T ? value )
228
- where T : struct
229
- {
230
- if ( value != null )
231
- {
232
- builder . Add ( value . Value ) ;
233
- }
234
- }
235
-
236
- public static void AddIfNotNull < T > ( this ArrayBuilder < T > builder , T ? value )
237
- where T : class
238
- {
239
- if ( value != null )
240
- {
241
- builder . Add ( value ) ;
242
- }
243
- }
244
-
245
- public static void FreeAll < T > ( this ArrayBuilder < T > builder , Func < T , ArrayBuilder < T > ? > getNested )
246
- {
247
- foreach ( var item in builder )
248
- {
249
- getNested ( item ) ? . FreeAll ( getNested ) ;
250
- }
251
- builder . Free ( ) ;
252
- }
253
-
254
- #if COMPILERCORE
255
-
256
12
/// <summary>
257
13
/// Realizes the OneOrMany and disposes the builder in one operation.
258
14
/// </summary>
@@ -270,24 +26,9 @@ public static OneOrMany<T> ToOneOrManyAndFree<T>(this ArrayBuilder<T> builder)
270
26
}
271
27
}
272
28
273
- #endif
274
-
275
- public static void RemoveWhere < TItem , TArg > ( this ArrayBuilder < TItem > builder , Func < TItem , int , TArg , bool > filter , TArg arg )
29
+ public static void AddRange < T > ( this ArrayBuilder < T > builder , OneOrMany < T > items )
276
30
{
277
- var writeIndex = 0 ;
278
- for ( var i = 0 ; i < builder . Count ; i ++ )
279
- {
280
- var item = builder [ i ] ;
281
- if ( ! filter ( item , i , arg ) )
282
- {
283
- if ( writeIndex != i )
284
- builder [ writeIndex ] = item ;
285
-
286
- writeIndex ++ ;
287
- }
288
- }
289
-
290
- builder . Count = writeIndex ;
31
+ items . AddRangeTo ( builder ) ;
291
32
}
292
33
}
293
34
}
0 commit comments