AddressableBytes.vala 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. namespace Invercargill {
  2. [GenericAccessors]
  3. public interface AddressableBytes : Addressable<uint8>, ReadOnlyAddressableBytes {
  4. public virtual void set_int64(uint index, int64 value, Endianness endianness) throws IndexError {
  5. var chunk = new uint8[sizeof(int64)];
  6. int64 val;
  7. switch (endianness) {
  8. case Endianness.Native:
  9. val = value;
  10. break;
  11. case Endianness.BigEndian:
  12. val = value.to_big_endian();
  13. break;
  14. case Endianness.LittleEndian:
  15. val = value.to_little_endian();
  16. break;
  17. }
  18. Memory.copy(chunk, &val, sizeof(int64));
  19. set_data(index, chunk);
  20. }
  21. public virtual void set_all_int64(uint index, Enumerable<int64?> values, Endianness endianness) throws IndexError {
  22. foreach(var value in values) {
  23. set_int64(index, value, endianness);
  24. }
  25. }
  26. public virtual void set_uint64(uint index, uint64 value, Endianness endianness) throws IndexError {
  27. var chunk = new uint8[sizeof(uint64)];
  28. uint64 val;
  29. switch (endianness) {
  30. case Endianness.Native:
  31. val = value;
  32. break;
  33. case Endianness.BigEndian:
  34. val = value.to_big_endian();
  35. break;
  36. case Endianness.LittleEndian:
  37. val = value.to_little_endian();
  38. break;
  39. }
  40. Memory.copy(chunk, &val, sizeof(uint64));
  41. set_data(index, chunk);
  42. }
  43. public virtual void set_all_uint64(uint index, Enumerable<uint64?> values, Endianness endianness) throws IndexError {
  44. foreach(var value in values) {
  45. set_uint64(index, value, endianness);
  46. }
  47. }
  48. public virtual void set_int32(uint index, int32 value, Endianness endianness) throws IndexError {
  49. var chunk = new uint8[sizeof(int32)];
  50. int32 val;
  51. switch (endianness) {
  52. case Endianness.Native:
  53. val = value;
  54. break;
  55. case Endianness.BigEndian:
  56. val = value.to_big_endian();
  57. break;
  58. case Endianness.LittleEndian:
  59. val = value.to_little_endian();
  60. break;
  61. }
  62. Memory.copy(chunk, &val, sizeof(int32));
  63. set_data(index, chunk);
  64. }
  65. public virtual void set_all_int32(uint index, Enumerable<int32?> values, Endianness endianness) throws IndexError {
  66. foreach(var value in values) {
  67. set_int32(index, value, endianness);
  68. }
  69. }
  70. public virtual void set_uint32(uint index, uint32 value, Endianness endianness) throws IndexError {
  71. var chunk = new uint8[sizeof(uint32)];
  72. uint32 val;
  73. switch (endianness) {
  74. case Endianness.Native:
  75. val = value;
  76. break;
  77. case Endianness.BigEndian:
  78. val = value.to_big_endian();
  79. break;
  80. case Endianness.LittleEndian:
  81. val = value.to_little_endian();
  82. break;
  83. }
  84. Memory.copy(chunk, &val, sizeof(uint32));
  85. set_data(index, chunk);
  86. }
  87. public virtual void set_all_uint32(uint index, Enumerable<uint32?> values, Endianness endianness) throws IndexError {
  88. foreach(var value in values) {
  89. set_uint32(index, value, endianness);
  90. }
  91. }
  92. public virtual void set_int16(uint index, int16 value, Endianness endianness) throws IndexError {
  93. var chunk = new uint8[sizeof(int16)];
  94. int16 val;
  95. switch (endianness) {
  96. case Endianness.Native:
  97. val = value;
  98. break;
  99. case Endianness.BigEndian:
  100. val = value.to_big_endian();
  101. break;
  102. case Endianness.LittleEndian:
  103. val = value.to_little_endian();
  104. break;
  105. }
  106. Memory.copy(chunk, &val, sizeof(int16));
  107. set_data(index, chunk);
  108. }
  109. public virtual void set_all_int16(uint index, Enumerable<int16?> values, Endianness endianness) throws IndexError {
  110. foreach(var value in values) {
  111. set_int16(index, value, endianness);
  112. }
  113. }
  114. public virtual void set_uint16(uint index, uint16 value, Endianness endianness) throws IndexError {
  115. var chunk = new uint8[sizeof(uint16)];
  116. uint16 val;
  117. switch (endianness) {
  118. case Endianness.Native:
  119. val = value;
  120. break;
  121. case Endianness.BigEndian:
  122. val = value.to_big_endian();
  123. break;
  124. case Endianness.LittleEndian:
  125. val = value.to_little_endian();
  126. break;
  127. }
  128. Memory.copy(chunk, &val, sizeof(uint16));
  129. set_data(index, chunk);
  130. }
  131. public virtual void set_all_uint16(uint index, Enumerable<uint16?> values, Endianness endianness) throws IndexError {
  132. foreach(var value in values) {
  133. set_uint16(index, value, endianness);
  134. }
  135. }
  136. public virtual void set_int8(uint index, int8 value, Endianness endianness) throws IndexError {
  137. var chunk = new uint8[sizeof(int8)];
  138. Memory.copy(chunk, &value, sizeof(int8));
  139. set_data(index, chunk);
  140. }
  141. public virtual void set_all_int8(uint index, Enumerable<int8?> values, Endianness endianness) throws IndexError {
  142. foreach(var value in values) {
  143. set_int8(index, value, endianness);
  144. }
  145. }
  146. public virtual void set_uint8(uint index, uint8 value, Endianness endianness) throws IndexError {
  147. var chunk = new uint8[] { value };
  148. set_data(index, chunk);
  149. }
  150. public virtual void set_all_uint8(uint index, Enumerable<uint8?> values, Endianness endianness) throws IndexError {
  151. foreach(var value in values) {
  152. set_uint8(index, value, endianness);
  153. }
  154. }
  155. private void set_data(uint index, uint8[] data) throws IndexError {
  156. for(int i = 0; i < data.length; i++) {
  157. this[i + index] = data[i];
  158. }
  159. }
  160. }
  161. }