|
@@ -0,0 +1,182 @@
|
|
|
+
|
|
|
+namespace Invercargill {
|
|
|
+
|
|
|
+ [GenericAccessors]
|
|
|
+ public interface AddressableBytes : Addressable<uint8>, ReadOnlyAddressableBytes {
|
|
|
+
|
|
|
+ public virtual void set_int64(uint index, int64 value, Endianness endianness) throws IndexError {
|
|
|
+ var chunk = new uint8[sizeof(int64)];
|
|
|
+ int64 val;
|
|
|
+ switch (endianness) {
|
|
|
+ case Endianness.Native:
|
|
|
+ val = value;
|
|
|
+ break;
|
|
|
+ case Endianness.BigEndian:
|
|
|
+ val = value.to_big_endian();
|
|
|
+ break;
|
|
|
+ case Endianness.LittleEndian:
|
|
|
+ val = value.to_little_endian();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ Memory.copy(chunk, &val, sizeof(int64));
|
|
|
+ set_data(index, chunk);
|
|
|
+ }
|
|
|
+
|
|
|
+ public virtual void set_all_int64(uint index, Enumerable<int64?> values, Endianness endianness) throws IndexError {
|
|
|
+ foreach(var value in values) {
|
|
|
+ set_int64(index, value, endianness);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public virtual void set_uint64(uint index, uint64 value, Endianness endianness) throws IndexError {
|
|
|
+ var chunk = new uint8[sizeof(uint64)];
|
|
|
+ uint64 val;
|
|
|
+ switch (endianness) {
|
|
|
+ case Endianness.Native:
|
|
|
+ val = value;
|
|
|
+ break;
|
|
|
+ case Endianness.BigEndian:
|
|
|
+ val = value.to_big_endian();
|
|
|
+ break;
|
|
|
+ case Endianness.LittleEndian:
|
|
|
+ val = value.to_little_endian();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ Memory.copy(chunk, &val, sizeof(uint64));
|
|
|
+ set_data(index, chunk);
|
|
|
+ }
|
|
|
+
|
|
|
+ public virtual void set_all_uint64(uint index, Enumerable<uint64?> values, Endianness endianness) throws IndexError {
|
|
|
+ foreach(var value in values) {
|
|
|
+ set_uint64(index, value, endianness);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public virtual void set_int32(uint index, int32 value, Endianness endianness) throws IndexError {
|
|
|
+ var chunk = new uint8[sizeof(int32)];
|
|
|
+ int32 val;
|
|
|
+ switch (endianness) {
|
|
|
+ case Endianness.Native:
|
|
|
+ val = value;
|
|
|
+ break;
|
|
|
+ case Endianness.BigEndian:
|
|
|
+ val = value.to_big_endian();
|
|
|
+ break;
|
|
|
+ case Endianness.LittleEndian:
|
|
|
+ val = value.to_little_endian();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ Memory.copy(chunk, &val, sizeof(int32));
|
|
|
+ set_data(index, chunk);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public virtual void set_all_int32(uint index, Enumerable<int32?> values, Endianness endianness) throws IndexError {
|
|
|
+ foreach(var value in values) {
|
|
|
+ set_int32(index, value, endianness);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public virtual void set_uint32(uint index, uint32 value, Endianness endianness) throws IndexError {
|
|
|
+ var chunk = new uint8[sizeof(uint32)];
|
|
|
+ uint32 val;
|
|
|
+ switch (endianness) {
|
|
|
+ case Endianness.Native:
|
|
|
+ val = value;
|
|
|
+ break;
|
|
|
+ case Endianness.BigEndian:
|
|
|
+ val = value.to_big_endian();
|
|
|
+ break;
|
|
|
+ case Endianness.LittleEndian:
|
|
|
+ val = value.to_little_endian();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ Memory.copy(chunk, &val, sizeof(uint32));
|
|
|
+ set_data(index, chunk);
|
|
|
+ }
|
|
|
+
|
|
|
+ public virtual void set_all_uint32(uint index, Enumerable<uint32?> values, Endianness endianness) throws IndexError {
|
|
|
+ foreach(var value in values) {
|
|
|
+ set_uint32(index, value, endianness);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public virtual void set_int16(uint index, int16 value, Endianness endianness) throws IndexError {
|
|
|
+ var chunk = new uint8[sizeof(int16)];
|
|
|
+ int16 val;
|
|
|
+ switch (endianness) {
|
|
|
+ case Endianness.Native:
|
|
|
+ val = value;
|
|
|
+ break;
|
|
|
+ case Endianness.BigEndian:
|
|
|
+ val = value.to_big_endian();
|
|
|
+ break;
|
|
|
+ case Endianness.LittleEndian:
|
|
|
+ val = value.to_little_endian();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ Memory.copy(chunk, &val, sizeof(int16));
|
|
|
+ set_data(index, chunk);
|
|
|
+ }
|
|
|
+
|
|
|
+ public virtual void set_all_int16(uint index, Enumerable<int16?> values, Endianness endianness) throws IndexError {
|
|
|
+ foreach(var value in values) {
|
|
|
+ set_int16(index, value, endianness);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public virtual void set_uint16(uint index, uint16 value, Endianness endianness) throws IndexError {
|
|
|
+ var chunk = new uint8[sizeof(uint16)];
|
|
|
+ uint16 val;
|
|
|
+ switch (endianness) {
|
|
|
+ case Endianness.Native:
|
|
|
+ val = value;
|
|
|
+ break;
|
|
|
+ case Endianness.BigEndian:
|
|
|
+ val = value.to_big_endian();
|
|
|
+ break;
|
|
|
+ case Endianness.LittleEndian:
|
|
|
+ val = value.to_little_endian();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ Memory.copy(chunk, &val, sizeof(uint16));
|
|
|
+ set_data(index, chunk);
|
|
|
+ }
|
|
|
+
|
|
|
+ public virtual void set_all_uint16(uint index, Enumerable<uint16?> values, Endianness endianness) throws IndexError {
|
|
|
+ foreach(var value in values) {
|
|
|
+ set_uint16(index, value, endianness);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public virtual void set_int8(uint index, int8 value, Endianness endianness) throws IndexError {
|
|
|
+ var chunk = new uint8[sizeof(int8)];
|
|
|
+ Memory.copy(chunk, &value, sizeof(int8));
|
|
|
+ set_data(index, chunk);
|
|
|
+ }
|
|
|
+
|
|
|
+ public virtual void set_all_int8(uint index, Enumerable<int8?> values, Endianness endianness) throws IndexError {
|
|
|
+ foreach(var value in values) {
|
|
|
+ set_int8(index, value, endianness);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public virtual void set_uint8(uint index, uint8 value, Endianness endianness) throws IndexError {
|
|
|
+ var chunk = new uint8[] { value };
|
|
|
+ set_data(index, chunk);
|
|
|
+ }
|
|
|
+
|
|
|
+ public virtual void set_all_uint8(uint index, Enumerable<uint8?> values, Endianness endianness) throws IndexError {
|
|
|
+ foreach(var value in values) {
|
|
|
+ set_uint8(index, value, endianness);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void set_data(uint index, uint8[] data) throws IndexError {
|
|
|
+ for(int i = 0; i < data.length; i++) {
|
|
|
+ this[i + index] = data[i];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|