Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
ComplexClassSerializerGenerator.cs
Go to the documentation of this file.
1 // ------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version: 11.0.0.0
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 // ------------------------------------------------------------------------------
10 namespace SiliconStudio.AssemblyProcessor
11 {
12  using System.Linq;
13  using System.Reflection;
14  using System.Collections.Generic;
15  using Mono.Cecil;
16  using System;
17 
18  /// <summary>
19  /// Class to produce the template output
20  /// </summary>
21 
22  #line 1 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
23  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "11.0.0.0")]
24  internal partial class ComplexClassSerializerGenerator : ComplexClassSerializerGeneratorBase
25  {
26 #line hidden
27  /// <summary>
28  /// Create the template output
29  /// </summary>
30  public virtual string TransformText()
31  {
32  this.Write("\r\n");
33 
34  #line 7 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
35 
36  var className = SerializerTypeName(type, true, true);
37  var parentType = hasParentSerializer ? ResolveGenericsVisitor.Process(type, type.BaseType) : null;
38 
39 
40  #line default
41  #line hidden
42  this.Write("\r\nnamespace SiliconStudio.DataSerializers\r\n{\r\n\t");
43 
44  #line 14 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
45  if (type.HasGenericParameters) {
46 
47  #line default
48  #line hidden
49  this.Write("public ");
50 
51  #line 14 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
52 }
53 
54  #line default
55  #line hidden
56  this.Write("sealed class ");
57 
58  #line 14 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
59  this.Write(this.ToStringHelper.ToStringWithCulture(className));
60 
61  #line default
62  #line hidden
63  this.Write(" : ");
64 
65  #line 14 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
66  this.Write(this.ToStringHelper.ToStringWithCulture(type.IsClass && !type.IsValueType && !type.IsAbstract && HasEmptyConstructor(type) ? "Class" : string.Empty));
67 
68  #line default
69  #line hidden
70  this.Write("DataSerializer<");
71 
72  #line 14 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
73  this.Write(this.ToStringHelper.ToStringWithCulture(type.ConvertCSharp()));
74 
75  #line default
76  #line hidden
77  this.Write(">, IDataSerializerInitializer");
78 
79  #line 14 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
80  this.Write(this.ToStringHelper.ToStringWithCulture(GenerateGenericConstraints(type)));
81 
82  #line default
83  #line hidden
84  this.Write("\r\n\t{\r\n");
85 
86  #line 16 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
87 if (hasParentSerializer) {
88 
89  #line default
90  #line hidden
91  this.Write("\t\tprivate DataSerializer<");
92 
93  #line 17 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
94  this.Write(this.ToStringHelper.ToStringWithCulture(parentType.ConvertCSharp()));
95 
96  #line default
97  #line hidden
98  this.Write("> parentSerializer;\r\n");
99 
100  #line 18 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
101 }
102 var serializableItems = GetSerializableItems(type, true).ToArray();
103 
104 
105  #line default
106  #line hidden
107 
108  #line 21 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
109 foreach (var serializableItem in serializableItems) {
110 
111  #line default
112  #line hidden
113  this.Write("\t\tprivate DataSerializer<");
114 
115  #line 22 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
116  this.Write(this.ToStringHelper.ToStringWithCulture(serializableItem.Type.ConvertCSharp()));
117 
118  #line default
119  #line hidden
120  this.Write("> ");
121 
122  #line 22 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
123  this.Write(this.ToStringHelper.ToStringWithCulture(serializableItem.MemberInfo.Name));
124 
125  #line default
126  #line hidden
127  this.Write("Serializer;\r\n");
128 
129  #line 23 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
130 }
131 
132  #line default
133  #line hidden
134  this.Write("\r\n\t\tpublic void Initialize(SerializerSelector serializerSelector)\r\n\t\t{\r\n");
135 
136  #line 27 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
137 if (hasParentSerializer) {
138 
139  #line default
140  #line hidden
141  this.Write("\t\t\t// Get parent serializer\r\n\t\t\tparentSerializer = serializerSelector.GetSerializ" +
142  "er<");
143 
144  #line 29 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
145  this.Write(this.ToStringHelper.ToStringWithCulture(parentType.ConvertCSharp()));
146 
147  #line default
148  #line hidden
149  this.Write(">();\r\n\t\t\tif (parentSerializer == null)\r\n\t\t\t\tthrow new InvalidOperationException(s" +
150  "tring.Format(\"Could not find parent serializer for type {0}\", @\"");
151 
152  #line 31 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
153  this.Write(this.ToStringHelper.ToStringWithCulture(parentType.ConvertCSharp()));
154 
155  #line default
156  #line hidden
157  this.Write("\"));\r\n");
158 
159  #line 32 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
160 }
161 
162  #line default
163  #line hidden
164  this.Write("\t\t\t// Cache member serializers\r\n");
165 
166  #line 34 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
167 foreach (var serializableItem in serializableItems) {
168 
169  #line default
170  #line hidden
171  this.Write("\t\t\t");
172 
173  #line 35 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
174  this.Write(this.ToStringHelper.ToStringWithCulture(serializableItem.MemberInfo.Name));
175 
176  #line default
177  #line hidden
178  this.Write("Serializer = MemberSerializer<");
179 
180  #line 35 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
181  this.Write(this.ToStringHelper.ToStringWithCulture(serializableItem.Type.ConvertCSharp()));
182 
183  #line default
184  #line hidden
185  this.Write(">.Create(serializerSelector);\r\n");
186 
187  #line 36 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
188 }
189 
190  #line default
191  #line hidden
192  this.Write("\t\t}\r\n\r\n\t\tpublic override void Serialize(ref ");
193 
194  #line 39 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
195  this.Write(this.ToStringHelper.ToStringWithCulture(type.ConvertCSharp()));
196 
197  #line default
198  #line hidden
199  this.Write(" obj, ArchiveMode mode, SerializationStream stream)\r\n\t\t{\r\n");
200 
201  #line 41 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
202 if (hasParentSerializer) {
203 
204  #line default
205  #line hidden
206  this.Write("\t\t\t// Serialize parent (for now we don\'t copy reference back because it shouldn\'t" +
207  " change)\r\n\t\t\t");
208 
209  #line 43 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
210  this.Write(this.ToStringHelper.ToStringWithCulture(parentType.ConvertCSharp()));
211 
212  #line default
213  #line hidden
214  this.Write(" parentObj = obj;\r\n\t\t\tparentSerializer.Serialize(ref parentObj, mode, stream);\r\n\t" +
215  "\t\tobj = (");
216 
217  #line 45 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
218  this.Write(this.ToStringHelper.ToStringWithCulture(type.ConvertCSharp()));
219 
220  #line default
221  #line hidden
222  this.Write(")parentObj;\r\n\r\n");
223 
224  #line 47 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
225 }
226 foreach (var serializableItem in serializableItems) {
227  var memberType = serializableItem.Type;
228  var memberTypeName = serializableItem.Type.ConvertCSharp();
229  var memberName = serializableItem.MemberInfo.Name;
230  var memberVariableName = CreateMemberVariableName(serializableItem.MemberInfo);
231  var memberAccessName = (serializableItem.MemberInfo is PropertyDefinition) ? memberVariableName : "obj." + memberName;
232 
233  if (serializableItem.HasFixedAttribute)
234  {
235 
236  #line default
237  #line hidden
238  this.Write("\t\tthrow new NotImplementedException(\"FixedBuffer attribute is not supported.\");\r\n" +
239  "");
240 
241  #line 58 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
242  }
243  else
244  {
245  if (serializableItem.MemberInfo is PropertyDefinition)
246  {
247 
248  #line default
249  #line hidden
250  this.Write(" ");
251 
252  #line 63 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
253  this.Write(this.ToStringHelper.ToStringWithCulture(memberTypeName));
254 
255  #line default
256  #line hidden
257  this.Write(" ");
258 
259  #line 63 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
260  this.Write(this.ToStringHelper.ToStringWithCulture(memberVariableName));
261 
262  #line default
263  #line hidden
264  this.Write(" = obj.");
265 
266  #line 63 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
267  this.Write(this.ToStringHelper.ToStringWithCulture(memberName));
268 
269  #line default
270  #line hidden
271  this.Write(";\r\n");
272 
273  #line 64 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
274 }
275 
276  #line default
277  #line hidden
278  this.Write(" ");
279 
280  #line 65 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
281  this.Write(this.ToStringHelper.ToStringWithCulture(serializableItem.MemberInfo.Name));
282 
283  #line default
284  #line hidden
285  this.Write("Serializer.Serialize(ref ");
286 
287  #line 65 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
288  this.Write(this.ToStringHelper.ToStringWithCulture(memberAccessName));
289 
290  #line default
291  #line hidden
292  this.Write(", mode, stream);\r\n");
293 
294  #line 66 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
295 if (serializableItem.MemberInfo is PropertyDefinition && serializableItem.AssignBack)
296  {
297 
298  #line default
299  #line hidden
300  this.Write(" obj.");
301 
302  #line 68 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
303  this.Write(this.ToStringHelper.ToStringWithCulture(memberName));
304 
305  #line default
306  #line hidden
307  this.Write(" = ");
308 
309  #line 68 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
310  this.Write(this.ToStringHelper.ToStringWithCulture(memberVariableName));
311 
312  #line default
313  #line hidden
314  this.Write(";\r\n");
315 
316  #line 69 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
317 }
318  }
319 }
320 
321  #line default
322  #line hidden
323  this.Write("\t\t}\r\n\r\n\t\tinternal static void ForceGenericInstantiation()\r\n\t\t{\r\n");
324 
325  #line 76 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
326 
327 foreach (var memberSerializerType in EnumerateSerializerTypes(serializableItems.Select(x => x.Type))){
328 
329  #line default
330  #line hidden
331  this.Write("\t\t\ttypeof(");
332 
333  #line 78 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
334  this.Write(this.ToStringHelper.ToStringWithCulture(memberSerializerType.ConvertCSharp()));
335 
336  #line default
337  #line hidden
338  this.Write(").ToString();\r\n");
339 
340  #line 79 "C:\DEV\paradox\sources\common\core\SiliconStudio.AssemblyProcessor.Common\ComplexClassSerializerGenerator.tt"
341 }
342 
343  #line default
344  #line hidden
345  this.Write("\t\t}\r\n\t}\r\n}");
346  return this.GenerationEnvironment.ToString();
347  }
348  }
349 
350  #line default
351  #line hidden
352  #region Base class
353  /// <summary>
354  /// Base class for this transformation
355  /// </summary>
356  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "11.0.0.0")]
357  internal class ComplexClassSerializerGeneratorBase
358  {
359  #region Fields
360  private global::System.Text.StringBuilder generationEnvironmentField;
361  private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField;
362  private global::System.Collections.Generic.List<int> indentLengthsField;
363  private string currentIndentField = "";
364  private bool endsWithNewline;
365  private global::System.Collections.Generic.IDictionary<string, object> sessionField;
366  #endregion
367  #region Properties
368  /// <summary>
369  /// The string builder that generation-time code is using to assemble generated output
370  /// </summary>
371  protected System.Text.StringBuilder GenerationEnvironment
372  {
373  get
374  {
375  if ((this.generationEnvironmentField == null))
376  {
377  this.generationEnvironmentField = new global::System.Text.StringBuilder();
378  }
379  return this.generationEnvironmentField;
380  }
381  set
382  {
383  this.generationEnvironmentField = value;
384  }
385  }
386  /// <summary>
387  /// The error collection for the generation process
388  /// </summary>
389  public System.CodeDom.Compiler.CompilerErrorCollection Errors
390  {
391  get
392  {
393  if ((this.errorsField == null))
394  {
395  this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection();
396  }
397  return this.errorsField;
398  }
399  }
400  /// <summary>
401  /// A list of the lengths of each indent that was added with PushIndent
402  /// </summary>
403  private System.Collections.Generic.List<int> indentLengths
404  {
405  get
406  {
407  if ((this.indentLengthsField == null))
408  {
409  this.indentLengthsField = new global::System.Collections.Generic.List<int>();
410  }
411  return this.indentLengthsField;
412  }
413  }
414  /// <summary>
415  /// Gets the current indent we use when adding lines to the output
416  /// </summary>
417  public string CurrentIndent
418  {
419  get
420  {
421  return this.currentIndentField;
422  }
423  }
424  /// <summary>
425  /// Current transformation session
426  /// </summary>
427  public virtual global::System.Collections.Generic.IDictionary<string, object> Session
428  {
429  get
430  {
431  return this.sessionField;
432  }
433  set
434  {
435  this.sessionField = value;
436  }
437  }
438  #endregion
439  #region Transform-time helpers
440  /// <summary>
441  /// Write text directly into the generated output
442  /// </summary>
443  public void Write(string textToAppend)
444  {
445  if (string.IsNullOrEmpty(textToAppend))
446  {
447  return;
448  }
449  // If we're starting off, or if the previous text ended with a newline,
450  // we have to append the current indent first.
451  if (((this.GenerationEnvironment.Length == 0)
452  || this.endsWithNewline))
453  {
454  this.GenerationEnvironment.Append(this.currentIndentField);
455  this.endsWithNewline = false;
456  }
457  // Check if the current text ends with a newline
458  if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture))
459  {
460  this.endsWithNewline = true;
461  }
462  // This is an optimization. If the current indent is "", then we don't have to do any
463  // of the more complex stuff further down.
464  if ((this.currentIndentField.Length == 0))
465  {
466  this.GenerationEnvironment.Append(textToAppend);
467  return;
468  }
469  // Everywhere there is a newline in the text, add an indent after it
470  textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField));
471  // If the text ends with a newline, then we should strip off the indent added at the very end
472  // because the appropriate indent will be added when the next time Write() is called
473  if (this.endsWithNewline)
474  {
475  this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length));
476  }
477  else
478  {
479  this.GenerationEnvironment.Append(textToAppend);
480  }
481  }
482  /// <summary>
483  /// Write text directly into the generated output
484  /// </summary>
485  public void WriteLine(string textToAppend)
486  {
487  this.Write(textToAppend);
488  this.GenerationEnvironment.AppendLine();
489  this.endsWithNewline = true;
490  }
491  /// <summary>
492  /// Write formatted text directly into the generated output
493  /// </summary>
494  public void Write(string format, params object[] args)
495  {
496  this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args));
497  }
498  /// <summary>
499  /// Write formatted text directly into the generated output
500  /// </summary>
501  public void WriteLine(string format, params object[] args)
502  {
503  this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args));
504  }
505  /// <summary>
506  /// Raise an error
507  /// </summary>
508  public void Error(string message)
509  {
510  System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError();
511  error.ErrorText = message;
512  this.Errors.Add(error);
513  }
514  /// <summary>
515  /// Raise a warning
516  /// </summary>
517  public void Warning(string message)
518  {
519  System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError();
520  error.ErrorText = message;
521  error.IsWarning = true;
522  this.Errors.Add(error);
523  }
524  /// <summary>
525  /// Increase the indent
526  /// </summary>
527  public void PushIndent(string indent)
528  {
529  if ((indent == null))
530  {
531  throw new global::System.ArgumentNullException("indent");
532  }
533  this.currentIndentField = (this.currentIndentField + indent);
534  this.indentLengths.Add(indent.Length);
535  }
536  /// <summary>
537  /// Remove the last indent that was added with PushIndent
538  /// </summary>
539  public string PopIndent()
540  {
541  string returnValue = "";
542  if ((this.indentLengths.Count > 0))
543  {
544  int indentLength = this.indentLengths[(this.indentLengths.Count - 1)];
545  this.indentLengths.RemoveAt((this.indentLengths.Count - 1));
546  if ((indentLength > 0))
547  {
548  returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength));
549  this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength));
550  }
551  }
552  return returnValue;
553  }
554  /// <summary>
555  /// Remove any indentation
556  /// </summary>
557  public void ClearIndent()
558  {
559  this.indentLengths.Clear();
560  this.currentIndentField = "";
561  }
562  #endregion
563  #region ToString Helpers
564  /// <summary>
565  /// Utility class to produce culture-oriented representation of an object as a string.
566  /// </summary>
568  {
569  private System.IFormatProvider formatProviderField = global::System.Globalization.CultureInfo.InvariantCulture;
570  /// <summary>
571  /// Gets or sets format provider to be used by ToStringWithCulture method.
572  /// </summary>
573  public System.IFormatProvider FormatProvider
574  {
575  get
576  {
577  return this.formatProviderField ;
578  }
579  set
580  {
581  if ((value != null))
582  {
583  this.formatProviderField = value;
584  }
585  }
586  }
587  /// <summary>
588  /// This is called from the compile/run appdomain to convert objects within an expression block to a string
589  /// </summary>
590  public string ToStringWithCulture(object objectToConvert)
591  {
592  if ((objectToConvert == null))
593  {
594  throw new global::System.ArgumentNullException("objectToConvert");
595  }
596  System.Type t = objectToConvert.GetType();
597  System.Reflection.MethodInfo method = t.GetMethod("ToString", new System.Type[] {
598  typeof(System.IFormatProvider)});
599  if ((method == null))
600  {
601  return objectToConvert.ToString();
602  }
603  else
604  {
605  return ((string)(method.Invoke(objectToConvert, new object[] {
606  this.formatProviderField })));
607  }
608  }
609  }
610  private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper();
611  /// <summary>
612  /// Helper to produce culture-oriented representation of an object as a string
613  /// </summary>
614  public ToStringInstanceHelper ToStringHelper
615  {
616  get
617  {
618  return this.toStringHelperField;
619  }
620  }
621  #endregion
622  }
623  #endregion
624 }
string ToStringWithCulture(object objectToConvert)
This is called from the compile/run appdomain to convert objects within an expression block to a stri...
An error message (level 4).
Utility class to produce culture-oriented representation of an object as a string.
_In_ size_t _In_ size_t _In_ DXGI_FORMAT format
Definition: DirectXTexP.h:175
The template can be applied to an existing PackageSession.
A warning message (level 3).