@@ -124,110 +124,39 @@ void ConvertInt(ref char* dst, char* end, int value, int argWidth, int integerWi
124124 }
125125}
126126
127- public unsafe interface IArgList
127+ /// <summary>
128+ /// Garbage free string formatter
129+ /// </summary>
130+ public static unsafe class StringFormatter
128131{
129- int Count { get ; }
130-
131- void Format ( ref char * dst , char * end , int argIndex , FormatSpec formatSpec ) ;
132- }
132+ private class NoArg { }
133133
134- public unsafe struct ArgList0 : IArgList
135- {
136- public int Count { get { return 0 ; } }
137- public void Format ( ref char * dst , char * end , int argIndex , FormatSpec formatSpec )
134+ public static int Write ( ref char [ ] dst , int destIdx , string format )
138135 {
136+ return Write < NoArg , NoArg , NoArg , NoArg , NoArg , NoArg > ( ref dst , destIdx , format , null , null , null , null , null , null ) ;
139137 }
140- }
141- public unsafe struct ArgList1 < T0 > : IArgList
142- {
143- public int Count { get { return 1 ; } }
144- T0 t0 ;
145- public ArgList1 ( T0 a0 )
138+ public static int Write < T0 > ( ref char [ ] dst , int destIdx , string format , T0 arg0 )
146139 {
147- t0 = a0 ;
140+ return Write < T0 , NoArg , NoArg , NoArg , NoArg , NoArg > ( ref dst , destIdx , format , arg0 , null , null , null , null , null ) ;
148141 }
149- public void Format ( ref char * dst , char * end , int argIndex , FormatSpec formatSpec )
142+ public static int Write < T0 , T1 > ( ref char [ ] dst , int destIdx , string format , T0 arg0 , T1 arg1 )
150143 {
151- switch ( argIndex )
152- {
153- case 0 : ( Converter . instance as IConverter < T0 > ) . Convert ( ref dst , end , t0 , formatSpec ) ; break ;
154- }
144+ return Write < T0 , T1 , NoArg , NoArg , NoArg , NoArg > ( ref dst , destIdx , format , arg0 , arg1 , null , null , null , null ) ;
155145 }
156- }
157- public unsafe struct ArgList2 < T0 , T1 > : IArgList
158- {
159- public int Count { get { return 2 ; } }
160- T0 t0 ;
161- T1 t1 ;
162- public ArgList2 ( T0 a0 , T1 a1 )
146+ public static int Write < T0 , T1 , T2 > ( ref char [ ] dst , int destIdx , string format , T0 arg0 , T1 arg1 , T2 arg2 )
163147 {
164- t0 = a0 ;
165- t1 = a1 ;
148+ return Write < T0 , T1 , T2 , NoArg , NoArg , NoArg > ( ref dst , destIdx , format , arg0 , arg1 , arg2 , null , null , null ) ;
166149 }
167- public void Format ( ref char * dst , char * end , int argIndex , FormatSpec formatSpec )
150+ public static int Write < T0 , T1 , T2 , T3 > ( ref char [ ] dst , int destIdx , string format , T0 arg0 , T1 arg1 , T2 arg2 , T3 arg3 )
168151 {
169- switch ( argIndex )
170- {
171- case 0 : ( Converter . instance as IConverter < T0 > ) . Convert ( ref dst , end , t0 , formatSpec ) ; break ;
172- case 1 : ( Converter . instance as IConverter < T1 > ) . Convert ( ref dst , end , t1 , formatSpec ) ; break ;
173- }
152+ return Write < T0 , T1 , T2 , T3 , NoArg , NoArg > ( ref dst , destIdx , format , arg0 , arg1 , arg2 , arg3 , null , null ) ;
174153 }
175- }
176- public unsafe struct ArgList3 < T0 , T1 , T2 > : IArgList
177- {
178- public int Count { get { return 3 ; } }
179- T0 t0 ;
180- T1 t1 ;
181- T2 t2 ;
182- public ArgList3 ( T0 a0 , T1 a1 , T2 a2 )
154+ public static int Write < T0 , T1 , T2 , T3 , T4 > ( ref char [ ] dst , int destIdx , string format , T0 arg0 , T1 arg1 , T2 arg2 , T3 arg3 , T4 arg4 )
183155 {
184- t0 = a0 ;
185- t1 = a1 ;
186- t2 = a2 ;
156+ return Write < T0 , T1 , T2 , T3 , T4 , NoArg > ( ref dst , destIdx , format , arg0 , arg1 , arg2 , arg3 , arg4 , null ) ;
187157 }
188- public void Format ( ref char * dst , char * end , int argIndex , FormatSpec formatSpec )
189- {
190- switch ( argIndex )
191- {
192- case 0 : ( Converter . instance as IConverter < T0 > ) . Convert ( ref dst , end , t0 , formatSpec ) ; break ;
193- case 1 : ( Converter . instance as IConverter < T1 > ) . Convert ( ref dst , end , t1 , formatSpec ) ; break ;
194- case 2 : ( Converter . instance as IConverter < T2 > ) . Convert ( ref dst , end , t2 , formatSpec ) ; break ;
195- }
196- }
197- }
198158
199- public unsafe struct ArgList4 < T0 , T1 , T2 , T3 > : IArgList
200- {
201- public int Count { get { return 4 ; } }
202- T0 t0 ;
203- T1 t1 ;
204- T2 t2 ;
205- T3 t3 ;
206- public ArgList4 ( T0 a0 , T1 a1 , T2 a2 , T3 a3 )
207- {
208- t0 = a0 ;
209- t1 = a1 ;
210- t2 = a2 ;
211- t3 = a3 ;
212- }
213- public void Format ( ref char * dst , char * end , int argIndex , FormatSpec formatSpec )
214- {
215- switch ( argIndex )
216- {
217- case 0 : ( Converter . instance as IConverter < T0 > ) . Convert ( ref dst , end , t0 , formatSpec ) ; break ;
218- case 1 : ( Converter . instance as IConverter < T1 > ) . Convert ( ref dst , end , t1 , formatSpec ) ; break ;
219- case 2 : ( Converter . instance as IConverter < T2 > ) . Convert ( ref dst , end , t2 , formatSpec ) ; break ;
220- case 3 : ( Converter . instance as IConverter < T3 > ) . Convert ( ref dst , end , t3 , formatSpec ) ; break ;
221- }
222- }
223- }
224-
225- /// <summary>
226- /// Garbage free string formatter
227- /// </summary>
228- public static unsafe class StringFormatter
229- {
230- public static int __Write < T > ( ref char [ ] dst , int destIdx , string format , T argList ) where T : IArgList
159+ public static int Write < T0 , T1 , T2 , T3 , T4 , T5 > ( ref char [ ] dst , int destIdx , string format , T0 arg0 , T1 arg1 , T2 arg2 , T3 arg3 , T4 arg4 , T5 arg5 )
231160 {
232161 int written = 0 ;
233162 fixed ( char * p = format , d = & dst [ 0 ] )
@@ -299,10 +228,17 @@ public static int __Write<T>(ref char[] dst, int destIdx, string format, T argLi
299228 else
300229 src++ ;
301230
302- if ( argNum < 0 || argNum >= argList . Count )
303- throw new IndexOutOfRangeException( argNum . ToString ( ) ) ;
304-
305- argList. Format ( ref dest , end , argNum , s ) ;
231+ switch ( argNum )
232+ {
233+ case 0 : ( ( IConverter < T0 > ) Converter . instance ) . Convert ( ref dest , end , arg0 , s ) ; break ;
234+ case 1 : ( ( IConverter < T1 > ) Converter . instance ) . Convert ( ref dest , end , arg1 , s ) ; break ;
235+ case 2 : ( ( IConverter < T2 > ) Converter . instance ) . Convert ( ref dest , end , arg2 , s ) ; break ;
236+ case 3 : ( ( IConverter < T3 > ) Converter . instance ) . Convert ( ref dest , end , arg3 , s ) ; break ;
237+ case 4 : ( ( IConverter < T4 > ) Converter . instance ) . Convert ( ref dest , end , arg4 , s ) ; break ;
238+ case 5 : ( ( IConverter < T5 > ) Converter . instance ) . Convert ( ref dest , end , arg5 , s ) ; break ;
239+ default :
240+ throw new IndexOutOfRangeException( argNum . ToString ( ) ) ;
241+ }
306242 }
307243 else
308244 {
0 commit comments