LiteralString.cs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using System;
  2. using System.IO;
  3. using System.Text;
  4. namespace Spv.Generator
  5. {
  6. public class LiteralString : Operand, IEquatable<LiteralString>
  7. {
  8. public OperandType Type => OperandType.String;
  9. private string _value;
  10. public LiteralString(string value)
  11. {
  12. _value = value;
  13. }
  14. public ushort WordCount => (ushort)(_value.Length / 4 + 1);
  15. public void WriteOperand(BinaryWriter writer)
  16. {
  17. writer.Write(_value.AsSpan());
  18. // String must be padded to the word size (which is 4 bytes).
  19. int paddingSize = 4 - (Encoding.ASCII.GetByteCount(_value) % 4);
  20. Span<byte> padding = stackalloc byte[paddingSize];
  21. writer.Write(padding);
  22. }
  23. public override bool Equals(object obj)
  24. {
  25. return obj is LiteralString literalString && Equals(literalString);
  26. }
  27. public bool Equals(LiteralString cmpObj)
  28. {
  29. return Type == cmpObj.Type && _value.Equals(cmpObj._value);
  30. }
  31. public override int GetHashCode()
  32. {
  33. return DeterministicHashCode.Combine(Type, DeterministicHashCode.GetHashCode(_value));
  34. }
  35. public bool Equals(Operand obj)
  36. {
  37. return obj is LiteralString literalString && Equals(literalString);
  38. }
  39. public override string ToString() => _value;
  40. }
  41. }