TypedArrayElementType.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. using Jint.Runtime;
  2. namespace Jint.Native.TypedArray
  3. {
  4. internal enum TypedArrayElementType : byte
  5. {
  6. // we have signed first to make comparison vaster to check if signed or unsigned type
  7. Int8,
  8. Int16,
  9. Int32,
  10. BigInt64,
  11. Float16,
  12. Float32,
  13. Float64,
  14. Uint8,
  15. Uint8C,
  16. Uint16,
  17. Uint32,
  18. BigUint64
  19. }
  20. internal static class TypedArrayExtensions
  21. {
  22. internal static byte GetElementSize(this TypedArrayElementType type)
  23. {
  24. return type switch
  25. {
  26. TypedArrayElementType.Int8 => 1,
  27. TypedArrayElementType.Uint8 => 1,
  28. TypedArrayElementType.Uint8C => 1,
  29. TypedArrayElementType.Int16 => 2,
  30. TypedArrayElementType.Uint16 => 2,
  31. TypedArrayElementType.Int32 => 4,
  32. TypedArrayElementType.Uint32 => 4,
  33. TypedArrayElementType.BigInt64 => 8,
  34. TypedArrayElementType.BigUint64 => 8,
  35. TypedArrayElementType.Float16 => 2,
  36. TypedArrayElementType.Float32 => 4,
  37. TypedArrayElementType.Float64 => 8,
  38. _ => 0
  39. };
  40. }
  41. internal static string GetTypedArrayName(this TypedArrayElementType type)
  42. {
  43. return type switch
  44. {
  45. TypedArrayElementType.Int8 => "Int8Array",
  46. TypedArrayElementType.Uint8 => "Uint8Array",
  47. TypedArrayElementType.Uint8C => "Uint8ClampedArray",
  48. TypedArrayElementType.Int16 => "Int16Array",
  49. TypedArrayElementType.Uint16 => "Uint16Array",
  50. TypedArrayElementType.Int32 => "Int32Array",
  51. TypedArrayElementType.Uint32 => "Uint32Array",
  52. TypedArrayElementType.BigInt64 => "BigInt64Array",
  53. TypedArrayElementType.BigUint64 => "BigUint64Array",
  54. TypedArrayElementType.Float16 => "Float16Array",
  55. TypedArrayElementType.Float32 => "Float32Array",
  56. TypedArrayElementType.Float64 => "Float64Array",
  57. _ => ""
  58. };
  59. }
  60. internal static IConstructor GetConstructor(this TypedArrayElementType type, Intrinsics intrinsics)
  61. {
  62. return type switch
  63. {
  64. TypedArrayElementType.Int8 => intrinsics.Int8Array,
  65. TypedArrayElementType.Uint8 => intrinsics.Uint8Array,
  66. TypedArrayElementType.Uint8C => intrinsics.Uint8ClampedArray,
  67. TypedArrayElementType.Int16 => intrinsics.Int16Array,
  68. TypedArrayElementType.Uint16 => intrinsics.Uint16Array,
  69. TypedArrayElementType.Int32 => intrinsics.Int32Array,
  70. TypedArrayElementType.Uint32 => intrinsics.Uint32Array,
  71. TypedArrayElementType.BigInt64 => intrinsics.BigInt64Array,
  72. TypedArrayElementType.BigUint64 => intrinsics.BigUint64Array,
  73. TypedArrayElementType.Float16 => intrinsics.Float16Array,
  74. TypedArrayElementType.Float32 => intrinsics.Float32Array,
  75. TypedArrayElementType.Float64 => intrinsics.Float64Array,
  76. _ => null!
  77. };
  78. }
  79. internal static bool IsUnsignedElementType(this TypedArrayElementType type)
  80. {
  81. return type > TypedArrayElementType.Float64;
  82. }
  83. internal static bool FitsInt32(this TypedArrayElementType type)
  84. {
  85. return type <= TypedArrayElementType.Int32;
  86. }
  87. internal static bool IsBigIntElementType(this TypedArrayElementType type)
  88. {
  89. return type is TypedArrayElementType.BigUint64 or TypedArrayElementType.BigInt64;
  90. }
  91. }
  92. }