SpecialSubstitution.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. using System.IO;
  2. namespace Ryujinx.HLE.HOS.Diagnostics.Demangler.Ast
  3. {
  4. public class SpecialSubstitution : BaseNode
  5. {
  6. public enum SpecialType
  7. {
  8. Allocator,
  9. BasicString,
  10. String,
  11. IStream,
  12. OStream,
  13. IOStream
  14. }
  15. private SpecialType _specialSubstitutionKey;
  16. public SpecialSubstitution(SpecialType specialSubstitutionKey) : base(NodeType.SpecialSubstitution)
  17. {
  18. _specialSubstitutionKey = specialSubstitutionKey;
  19. }
  20. public void SetExtended()
  21. {
  22. Type = NodeType.ExpandedSpecialSubstitution;
  23. }
  24. public override string GetName()
  25. {
  26. switch (_specialSubstitutionKey)
  27. {
  28. case SpecialType.Allocator:
  29. return "allocator";
  30. case SpecialType.BasicString:
  31. return "basic_string";
  32. case SpecialType.String:
  33. if (Type == NodeType.ExpandedSpecialSubstitution)
  34. {
  35. return "basic_string";
  36. }
  37. return "string";
  38. case SpecialType.IStream:
  39. return "istream";
  40. case SpecialType.OStream:
  41. return "ostream";
  42. case SpecialType.IOStream:
  43. return "iostream";
  44. }
  45. return null;
  46. }
  47. private string GetExtendedName()
  48. {
  49. switch (_specialSubstitutionKey)
  50. {
  51. case SpecialType.Allocator:
  52. return "std::allocator";
  53. case SpecialType.BasicString:
  54. return "std::basic_string";
  55. case SpecialType.String:
  56. return "std::basic_string<char, std::char_traits<char>, std::allocator<char> >";
  57. case SpecialType.IStream:
  58. return "std::basic_istream<char, std::char_traits<char> >";
  59. case SpecialType.OStream:
  60. return "std::basic_ostream<char, std::char_traits<char> >";
  61. case SpecialType.IOStream:
  62. return "std::basic_iostream<char, std::char_traits<char> >";
  63. }
  64. return null;
  65. }
  66. public override void PrintLeft(TextWriter writer)
  67. {
  68. if (Type == NodeType.ExpandedSpecialSubstitution)
  69. {
  70. writer.Write(GetExtendedName());
  71. }
  72. else
  73. {
  74. writer.Write("std::");
  75. writer.Write(GetName());
  76. }
  77. }
  78. }
  79. }