Mercurial > projects > ddmd
comparison dmd/TemplateDeclaration.d @ 121:347de076ad34
TemplateParameters -> Vector
author | Eldar Insafutdinov <e.insafutdinov@gmail.com> |
---|---|
date | Thu, 02 Sep 2010 22:41:12 +0100 |
parents | e28b18c23469 |
children | 1765f3ef917d |
comparison
equal
deleted
inserted
replaced
120:46ef67271ef3 | 121:347de076ad34 |
---|---|
55 { | 55 { |
56 size_t dim = parameters.dim; | 56 size_t dim = parameters.dim; |
57 TemplateTupleParameter tp = null; | 57 TemplateTupleParameter tp = null; |
58 | 58 |
59 if (dim) | 59 if (dim) |
60 tp = (cast(TemplateParameter)parameters.data[dim - 1]).isTemplateTupleParameter(); | 60 tp = parameters[dim - 1].isTemplateTupleParameter(); |
61 | 61 |
62 return tp; | 62 return tp; |
63 } | 63 } |
64 | 64 |
65 void ObjectToCBuffer(OutBuffer buf, HdrGenState* hgs, Object oarg) | 65 void ObjectToCBuffer(OutBuffer buf, HdrGenState* hgs, Object oarg) |
163 { | 163 { |
164 p = new TemplateParameters(); | 164 p = new TemplateParameters(); |
165 p.setDim(parameters.dim); | 165 p.setDim(parameters.dim); |
166 for (int i = 0; i < p.dim; i++) | 166 for (int i = 0; i < p.dim; i++) |
167 { | 167 { |
168 TemplateParameter tp = cast(TemplateParameter)parameters.data[i]; | 168 auto tp = parameters[i]; |
169 p.data[i] = cast(void*)tp.syntaxCopy(); | 169 p[i] = tp.syntaxCopy(); |
170 } | 170 } |
171 } | 171 } |
172 | 172 |
173 Expression e = null; | 173 Expression e = null; |
174 if (constraint) | 174 if (constraint) |
226 | 226 |
227 if (global.params.doDocComments) | 227 if (global.params.doDocComments) |
228 { | 228 { |
229 origParameters = new TemplateParameters(); | 229 origParameters = new TemplateParameters(); |
230 origParameters.setDim(parameters.dim); | 230 origParameters.setDim(parameters.dim); |
231 for (int i = 0; i < parameters.dim; i++) | 231 foreach (size_t i, TemplateParameter tp; parameters) |
232 { | 232 { |
233 TemplateParameter tp = cast(TemplateParameter)parameters.data[i]; | 233 origParameters[i] = tp.syntaxCopy(); |
234 origParameters.data[i] = cast(void*)tp.syntaxCopy(); | 234 } |
235 } | 235 } |
236 } | 236 |
237 | 237 foreach (tp; parameters) |
238 for (int i = 0; i < parameters.dim; i++) | 238 { |
239 { | |
240 TemplateParameter tp = cast(TemplateParameter)parameters.data[i]; | |
241 tp.declareParameter(paramscope); | 239 tp.declareParameter(paramscope); |
242 } | 240 } |
243 | 241 |
244 for (int i = 0; i < parameters.dim; i++) | 242 foreach (size_t i, TemplateParameter tp; parameters) |
245 { | 243 { |
246 TemplateParameter tp = cast(TemplateParameter)parameters.data[i]; | |
247 | |
248 tp.semantic(paramscope); | 244 tp.semantic(paramscope); |
249 if (i + 1 != parameters.dim && tp.isTemplateTupleParameter()) | 245 if (i + 1 != parameters.dim && tp.isTemplateTupleParameter()) |
250 error("template tuple parameter must be last one"); | 246 error("template tuple parameter must be last one"); |
251 } | 247 } |
252 | 248 |
333 } | 329 } |
334 buf.writestring(kind()); | 330 buf.writestring(kind()); |
335 buf.writeByte(' '); | 331 buf.writeByte(' '); |
336 buf.writestring(ident.toChars()); | 332 buf.writestring(ident.toChars()); |
337 buf.writeByte('('); | 333 buf.writeByte('('); |
338 for (int i = 0; i < parameters.dim; i++) | 334 foreach (size_t i, TemplateParameter tp; parameters) |
339 { | 335 { |
340 TemplateParameter tp = cast(TemplateParameter)parameters.data[i]; | |
341 if (hgs.ddoc) | 336 if (hgs.ddoc) |
342 tp = cast(TemplateParameter)origParameters.data[i]; | 337 tp = origParameters[i]; |
343 if (i) | 338 if (i) |
344 buf.writeByte(','); | 339 buf.writeByte(','); |
345 tp.toCBuffer(buf, hgs); | 340 tp.toCBuffer(buf, hgs); |
346 } | 341 } |
347 buf.writeByte(')'); | 342 buf.writeByte(')'); |
413 HdrGenState hgs; | 408 HdrGenState hgs; |
414 | 409 |
415 /// memset(&hgs, 0, hgs.sizeof); | 410 /// memset(&hgs, 0, hgs.sizeof); |
416 buf.writestring(ident.toChars()); | 411 buf.writestring(ident.toChars()); |
417 buf.writeByte('('); | 412 buf.writeByte('('); |
418 for (int i = 0; i < parameters.dim; i++) | 413 foreach (size_t i, TemplateParameter tp; parameters) |
419 { | 414 { |
420 TemplateParameter tp = cast(TemplateParameter)parameters.data[i]; | |
421 if (i) | 415 if (i) |
422 buf.writeByte(','); | 416 buf.writeByte(','); |
423 tp.toCBuffer(buf, &hgs); | 417 tp.toCBuffer(buf, &hgs); |
424 } | 418 } |
425 buf.writeByte(')'); | 419 buf.writeByte(')'); |
494 // Attempt type deduction | 488 // Attempt type deduction |
495 m = MATCHexact; | 489 m = MATCHexact; |
496 for (int i = 0; i < dedtypes_dim; i++) | 490 for (int i = 0; i < dedtypes_dim; i++) |
497 { | 491 { |
498 MATCH m2; | 492 MATCH m2; |
499 TemplateParameter tp = cast(TemplateParameter)parameters.data[i]; | 493 auto tp = parameters[i]; |
500 Declaration sparam; | 494 Declaration sparam; |
501 | 495 |
502 //printf("\targument [%d]\n", i); | 496 //printf("\targument [%d]\n", i); |
503 version (LOGM) { | 497 version (LOGM) { |
504 //printf("\targument [%d] is %s\n", i, oarg ? oarg.toChars() : "null"); | 498 //printf("\targument [%d] is %s\n", i, oarg ? oarg.toChars() : "null"); |
635 // generated from the parameters to this template declaration | 629 // generated from the parameters to this template declaration |
636 ti.tiargs = new Objects(); | 630 ti.tiargs = new Objects(); |
637 ti.tiargs.setDim(parameters.dim); | 631 ti.tiargs.setDim(parameters.dim); |
638 for (int i = 0; i < ti.tiargs.dim; i++) | 632 for (int i = 0; i < ti.tiargs.dim; i++) |
639 { | 633 { |
640 TemplateParameter tp = cast(TemplateParameter)parameters.data[i]; | 634 auto tp = parameters[i]; |
641 | 635 |
642 auto p = tp.dummyArg(); | 636 auto p = tp.dummyArg(); |
643 if (p) | 637 if (p) |
644 ti.tiargs[i] = p; | 638 ti.tiargs[i] = p; |
645 else | 639 else |
770 memcpy(dedargs.ptr, targsi.ptr, n * (*dedargs.ptr).sizeof); | 764 memcpy(dedargs.ptr, targsi.ptr, n * (*dedargs.ptr).sizeof); |
771 | 765 |
772 for (size_t i = 0; i < n; i++) | 766 for (size_t i = 0; i < n; i++) |
773 { | 767 { |
774 assert(i < parameters.dim); | 768 assert(i < parameters.dim); |
775 auto tp2 = cast(TemplateParameter)parameters.data[i]; | 769 auto tp2 = parameters[i]; |
776 MATCH m; | 770 MATCH m; |
777 Declaration sparam = null; | 771 Declaration sparam = null; |
778 | 772 |
779 m = tp2.matchArg(paramscope, dedargs, i, parameters, dedtypes, &sparam); | 773 m = tp2.matchArg(paramscope, dedargs, i, parameters, dedtypes, &sparam); |
780 //printf("\tdeduceType m = %d\n", m); | 774 //printf("\tdeduceType m = %d\n", m); |
888 // Match 'ethis' to any TemplateThisParameter's | 882 // Match 'ethis' to any TemplateThisParameter's |
889 if (ethis) | 883 if (ethis) |
890 { | 884 { |
891 for (size_t i = 0; i < parameters.dim; i++) | 885 for (size_t i = 0; i < parameters.dim; i++) |
892 { | 886 { |
893 TemplateParameter tp2 = cast(TemplateParameter)parameters.data[i]; | 887 auto tp2 = parameters[i]; |
894 TemplateThisParameter ttp = tp2.isTemplateThisParameter(); | 888 TemplateThisParameter ttp = tp2.isTemplateThisParameter(); |
895 if (ttp) | 889 if (ttp) |
896 { | 890 { |
897 MATCH m; | 891 MATCH m; |
898 | 892 |
1058 | 1052 |
1059 /* Fill in any missing arguments with their defaults. | 1053 /* Fill in any missing arguments with their defaults. |
1060 */ | 1054 */ |
1061 for (size_t i = nargsi; i < dedargs.dim; i++) | 1055 for (size_t i = nargsi; i < dedargs.dim; i++) |
1062 { | 1056 { |
1063 auto tp2 = cast(TemplateParameter)parameters.data[i]; | 1057 auto tp2 = parameters[i]; |
1064 //printf("tp2[%d] = %s\n", i, tp2.ident.toChars()); | 1058 //printf("tp2[%d] = %s\n", i, tp2.ident.toChars()); |
1065 /* For T:T*, the dedargs is the T*, dedtypes is the T | 1059 /* For T:T*, the dedargs is the T*, dedtypes is the T |
1066 * But for function templates, we really need them to match | 1060 * But for function templates, we really need them to match |
1067 */ | 1061 */ |
1068 Object oarg = dedargs[i]; | 1062 Object oarg = dedargs[i]; |