ReadOnlyAddressableBytes.vala 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. namespace Invercargill {
  2. public enum Endianness {
  3. Native,
  4. BigEndian,
  5. LittleEndian,
  6. }
  7. [GenericAccessors]
  8. public interface ReadOnlyAddressableBytes : ReadOnlyAddressable<uint8>, Equatable<Enumerable<uint8>>, BinaryData, Hashable {
  9. public virtual int64? get_int64(int index, Endianness endianness = Endianness.Native) throws IndexError {
  10. var data = get_slice(index, sizeof(int64));
  11. int64 value = 0;
  12. int64 val = 0;
  13. Memory.copy(&value, data, sizeof(int64));
  14. switch (endianness) {
  15. case Endianness.Native:
  16. val = value;
  17. break;
  18. case Endianness.BigEndian:
  19. val = value.to_big_endian();
  20. break;
  21. case Endianness.LittleEndian:
  22. val = value.to_little_endian();
  23. break;
  24. }
  25. return val;
  26. }
  27. public virtual uint64? get_uint64(int index, Endianness endianness = Endianness.Native) throws IndexError {
  28. var data = get_slice(index, sizeof(uint64));
  29. uint64 value = 0;
  30. uint64 val = 0;
  31. Memory.copy(&value, data, sizeof(uint64));
  32. switch (endianness) {
  33. case Endianness.Native:
  34. val = value;
  35. break;
  36. case Endianness.BigEndian:
  37. val = value.to_big_endian();
  38. break;
  39. case Endianness.LittleEndian:
  40. val = value.to_little_endian();
  41. break;
  42. }
  43. return val;
  44. }
  45. public virtual int32? get_int32(int index, Endianness endianness = Endianness.Native) throws IndexError {
  46. var data = get_slice(index, sizeof(int32));
  47. int32 value = 0;
  48. int32 val = 0;
  49. Memory.copy(&value, data, sizeof(int32));
  50. switch (endianness) {
  51. case Endianness.Native:
  52. val = value;
  53. break;
  54. case Endianness.BigEndian:
  55. val = value.to_big_endian();
  56. break;
  57. case Endianness.LittleEndian:
  58. val = value.to_little_endian();
  59. break;
  60. }
  61. return val;
  62. }
  63. public virtual uint32? get_uint32(int index, Endianness endianness = Endianness.Native) throws IndexError {
  64. var data = get_slice(index, sizeof(uint32));
  65. uint32 value = 0;
  66. uint32 val = 0;
  67. Memory.copy(&value, data, sizeof(uint32));
  68. switch (endianness) {
  69. case Endianness.Native:
  70. val = value;
  71. break;
  72. case Endianness.BigEndian:
  73. val = value.to_big_endian();
  74. break;
  75. case Endianness.LittleEndian:
  76. val = value.to_little_endian();
  77. break;
  78. }
  79. return val;
  80. }
  81. public virtual int16? get_int16(int index, Endianness endianness = Endianness.Native) throws IndexError {
  82. var data = get_slice(index, sizeof(int16));
  83. int16 value = 0;
  84. int16 val = 0;
  85. Memory.copy(&value, data, sizeof(int16));
  86. switch (endianness) {
  87. case Endianness.Native:
  88. val = value;
  89. break;
  90. case Endianness.BigEndian:
  91. val = value.to_big_endian();
  92. break;
  93. case Endianness.LittleEndian:
  94. val = value.to_little_endian();
  95. break;
  96. }
  97. return val;
  98. }
  99. public virtual uint16? get_uint16(int index, Endianness endianness = Endianness.Native) throws IndexError {
  100. var data = get_slice(index, sizeof(uint16));
  101. uint16 value = 0;
  102. uint16 val = 0;
  103. Memory.copy(&value, data, sizeof(uint16));
  104. switch (endianness) {
  105. case Endianness.Native:
  106. val = value;
  107. break;
  108. case Endianness.BigEndian:
  109. val = value.to_big_endian();
  110. break;
  111. case Endianness.LittleEndian:
  112. val = value.to_little_endian();
  113. break;
  114. }
  115. return val;
  116. }
  117. public virtual int8? get_int8(int index) throws IndexError {
  118. var data = get_slice(index, sizeof(int8));
  119. int8 value = 0;
  120. Memory.copy(&value, data, sizeof(int8));
  121. return value;
  122. }
  123. public virtual uint8? get_uint8(int index) throws IndexError {
  124. var data = get_slice(index, sizeof(uint8));
  125. uint8 value = 0;
  126. Memory.copy(&value, data, sizeof(uint8));
  127. return value;
  128. }
  129. private uint8[] get_slice(uint index, ulong size) throws IndexError {
  130. var slice = new uint8[size];
  131. for(int i = 0; i < size; i++) {
  132. slice[i] = this[i + index];
  133. }
  134. return slice;
  135. }
  136. }
  137. }