Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3735)

Unified Diff: runtime/lib/typeddata.dart

Issue 14332002: Add endian parameter to the get/set functions in ByteData. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/lib/typeddata.dart
===================================================================
--- runtime/lib/typeddata.dart (revision 21661)
+++ runtime/lib/typeddata.dart (working copy)
@@ -2874,127 +2874,235 @@
if (byteOffset < 0 || byteOffset >= length) {
_throwRangeError(byteOffset, length);
}
- _typeddata._setUint8(_offset + byteOffset,_toUint8( value));
+ _typeddata._setUint8(_offset + byteOffset, _toUint8(value));
}
- int getInt16(int byteOffset) {
+ int getInt16(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
if (byteOffset < 0 || byteOffset >= length) {
_throwRangeError(byteOffset, length);
}
- return _typeddata._getInt16(_offset + byteOffset);
+ var result = _typeddata._getInt16(_offset + byteOffset);
+ if (endian === Endianness.HOST_ENDIAN) {
+ return result;
+ }
+ return _toEndianInt16(result, endian._littleEndian);
}
- void setInt16(int byteOffset, int value) {
+ void setInt16(int byteOffset,
+ int value,
+ [Endianness endian = Endianness.BIG_ENDIAN]) {
if (byteOffset < 0 || byteOffset >= length) {
_throwRangeError(byteOffset, length);
}
- _typeddata._setInt16(_offset + byteOffset, _toInt16(value));
+ var set_value = _toInt16(value);
+ if (endian !== Endianness.HOST_ENDIAN) {
+ set_value = _toEndianInt16(set_value, endian._littleEndian);
+ }
+ _typeddata._setInt16(_offset + byteOffset, set_value);
}
- int getUint16(int byteOffset) {
+ int getUint16(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
if (byteOffset < 0 || byteOffset >= length) {
_throwRangeError(byteOffset, length);
}
- return _typeddata._getUint16(_offset + byteOffset);
+ var result = _typeddata._getUint16(_offset + byteOffset);
+ if (endian === Endianness.HOST_ENDIAN) {
+ return result;
+ }
+ return _toEndianUint16(result, endian._littleEndian);
}
- void setUint16(int byteOffset, int value) {
+ void setUint16(int byteOffset,
+ int value,
+ [Endianness endian = Endianness.BIG_ENDIAN]) {
if (byteOffset < 0 || byteOffset >= length) {
_throwRangeError(byteOffset, length);
}
- _typeddata._setUint16(_offset + byteOffset, _toUint16(value));
+ var set_value = _toUint16(value);
+ if (endian !== Endianness.HOST_ENDIAN) {
+ set_value = _toEndianUint16(set_value, endian._littleEndian);
+ }
+ _typeddata._setUint16(_offset + byteOffset, set_value);
}
- int getInt32(int byteOffset) {
+ int getInt32(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
if (byteOffset < 0 || byteOffset >= length) {
_throwRangeError(byteOffset, length);
}
- return _typeddata._getInt32(_offset + byteOffset);
+ var result = _typeddata._getInt32(_offset + byteOffset);
+ if (endian === Endianness.HOST_ENDIAN) {
+ return result;
+ }
+ return _toEndianInt32(result, endian._littleEndian);
}
- void setInt32(int byteOffset, int value) {
+ void setInt32(int byteOffset,
+ int value,
+ [Endianness endian = Endianness.BIG_ENDIAN]) {
if (byteOffset < 0 || byteOffset >= length) {
_throwRangeError(byteOffset, length);
}
- _typeddata._setInt32(_offset + byteOffset, _toInt32(value));
+ var set_value = _toInt32(value);
+ if (endian !== Endianness.HOST_ENDIAN) {
+ set_value = _toEndianInt32(set_value, endian._littleEndian);
+ }
+ _typeddata._setInt32(_offset + byteOffset, set_value);
}
- int getUint32(int byteOffset) {
+ int getUint32(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
if (byteOffset < 0 || byteOffset >= length) {
_throwRangeError(byteOffset, length);
}
- return _typeddata._getUint32(_offset + byteOffset);
+ var result = _typeddata._getUint32(_offset + byteOffset);
+ if (endian === Endianness.HOST_ENDIAN) {
+ return result;
+ }
+ return _toEndianUint32(result, endian._littleEndian);
}
- void setUint32(int byteOffset, int value) {
+ void setUint32(int byteOffset,
+ int value,
+ [Endianness endian = Endianness.BIG_ENDIAN]) {
if (byteOffset < 0 || byteOffset >= length) {
_throwRangeError(byteOffset, length);
}
- _typeddata._setUint32(_offset + byteOffset, _toUint32(value));
+ var set_value = _toUint32(value);
+ if (endian !== Endianness.HOST_ENDIAN) {
+ set_value = _toEndianUint32(set_value, endian._littleEndian);
+ }
+ _typeddata._setUint32(_offset + byteOffset, set_value);
}
- int getInt64(int byteOffset) {
+ int getInt64(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
if (byteOffset < 0 || byteOffset >= length) {
_throwRangeError(byteOffset, length);
}
- return _typeddata._getInt64(_offset + byteOffset);
+ var result = _typeddata._getInt64(_offset + byteOffset);
+ if (endian === Endianness.HOST_ENDIAN) {
+ return result;
+ }
+ return _toEndianInt64(result, endian._littleEndian);
}
- void setInt64(int byteOffset, int value) {
+ void setInt64(int byteOffset,
+ int value,
+ [Endianness endian = Endianness.BIG_ENDIAN]) {
if (byteOffset < 0 || byteOffset >= length) {
_throwRangeError(byteOffset, length);
}
- _typeddata._setInt64(_offset + byteOffset, _toInt64(value));
+ var set_value = _toInt64(value);
+ if (endian !== Endianness.HOST_ENDIAN) {
+ set_value = _toEndianInt64(set_value, endian._littleEndian);
+ }
+ _typeddata._setInt64(_offset + byteOffset, set_value);
}
- int getUint64(int byteOffset) {
+ int getUint64(int byteOffset, [Endianness endian = Endianness.BIG_ENDIAN]) {
if (byteOffset < 0 || byteOffset >= length) {
_throwRangeError(byteOffset, length);
}
- return _typeddata._getUint64(_offset + byteOffset);
+ var result = _typeddata._getUint64(_offset + byteOffset);
+ if (endian === Endianness.HOST_ENDIAN) {
+ return result;
+ }
+ return _toEndianUint64(result, endian._littleEndian);
}
- void setUint64(int byteOffset, int value) {
+ void setUint64(int byteOffset,
+ int value,
+ [Endianness endian = Endianness.BIG_ENDIAN]) {
if (byteOffset < 0 || byteOffset >= length) {
_throwRangeError(byteOffset, length);
}
- _typeddata._setUint64(_offset + byteOffset, _toUint64(value));
+ var set_value = _toUint64(value);
+ if (endian !== Endianness.HOST_ENDIAN) {
+ set_value = _toEndianUint64(set_value, endian._littleEndian);
+ }
+ _typeddata._setUint64(_offset + byteOffset, set_value);
}
- double getFloat32(int byteOffset) {
+ double getFloat32(int byteOffset,
+ [Endianness endian = Endianness.BIG_ENDIAN]) {
if (byteOffset < 0 || byteOffset >= length) {
_throwRangeError(byteOffset, length);
}
- return _typeddata._getFloat32(_offset + byteOffset);
+ var result = _typeddata._getFloat32(_offset + byteOffset);
+ if (endian === Endianness.HOST_ENDIAN) {
+ return result;
+ }
+ return _toEndianFloat32(result, endian._littleEndian);
}
- void setFloat32(int byteOffset, double value) {
+ void setFloat32(int byteOffset,
+ double value,
+ [Endianness endian = Endianness.BIG_ENDIAN]) {
if (byteOffset < 0 || byteOffset >= length) {
_throwRangeError(byteOffset, length);
}
- _typeddata._setFloat32(_offset + byteOffset, value);
+ var set_value = value;
+ if (endian !== Endianness.HOST_ENDIAN) {
+ set_value = _toEndianFloat32(set_value, endian._littleEndian);
+ }
+ _typeddata._setFloat32(_offset + byteOffset, set_value);
}
- double getFloat64(int byteOffset) {
+ double getFloat64(int byteOffset,
+ [Endianness endian = Endianness.BIG_ENDIAN]) {
if (byteOffset < 0 || byteOffset >= length) {
_throwRangeError(byteOffset, length);
}
- return _typeddata._getFloat64(_offset + byteOffset);
+ var result = _typeddata._getFloat64(_offset + byteOffset);
+ if (endian === Endianness.HOST_ENDIAN) {
+ return result;
+ }
+ return _toEndianFloat64(result, endian._littleEndian);
}
- void setFloat64(int byteOffset, double value) {
+ void setFloat64(int byteOffset,
+ double value,
+ [Endianness endian = Endianness.BIG_ENDIAN]) {
if (byteOffset < 0 || byteOffset >= length) {
_throwRangeError(byteOffset, length);
}
- _typeddata._setFloat64(_offset + byteOffset, value);
+ var set_value = value;
+ if (endian !== Endianness.HOST_ENDIAN) {
+ set_value = _toEndianFloat64(set_value, endian._littleEndian);
+ }
+ _typeddata._setFloat64(_offset + byteOffset, set_value);
}
- Float32x4 getFloat32x4(int byteOffset) {
+ Float32x4 getFloat32x4(int byteOffset,
+ [Endianness endian = Endianness.BIG_ENDIAN]) {
if (byteOffset < 0 || byteOffset >= length) {
_throwRangeError(byteOffset, length);
}
+ // TODO(johnmccutchan) : Need to resolve this for endianity.
return _typeddata._getFloat32x4(_offset + byteOffset);
}
- void setFloat32x4(int byteOffset, Float32x4 value) {
+ void setFloat32x4(int byteOffset,
+ Float32x4 value,
+ [Endianness endian = Endianness.BIG_ENDIAN]) {
if (byteOffset < 0 || byteOffset >= length) {
_throwRangeError(byteOffset, length);
}
+ // TODO(johnmccutchan) : Need to resolve this for endianity.
_typeddata._setFloat32x4(_offset + byteOffset, value);
}
+
+ // Internal utility methods.
+
+ static int _toEndianInt16(int host_value, bool little_endian)
+ native "ByteData_ToEndianInt16";
+ static int _toEndianUint16(int host_value, bool little_endian)
+ native "ByteData_ToEndianUint16";
+ static int _toEndianInt32(int host_value, bool little_endian)
+ native "ByteData_ToEndianInt32";
+ static int _toEndianUint32(int host_value, bool little_endian)
+ native "ByteData_ToEndianUint32";
+ static int _toEndianInt64(int host_value, bool little_endian)
+ native "ByteData_ToEndianInt64";
+ static int _toEndianUint64(int host_value, bool little_endian)
+ native "ByteData_ToEndianUint64";
+ static double _toEndianFloat32(double host_value, bool little_endian)
+ native "ByteData_ToEndianFloat32";
+ static double _toEndianFloat64(double host_value, bool little_endian)
+ native "ByteData_ToEndianFloat64";
+
+
final TypedData _typeddata;
final int _offset;
final int length;

Powered by Google App Engine
This is Rietveld 408576698