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

Unified Diff: sdk/lib/utf/utf16.dart

Issue 11783009: Big merge from experimental to bleeding edge. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 11 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
« no previous file with comments | « sdk/lib/uri/uri.dart ('k') | sdk/lib/utf/utf32.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/utf/utf16.dart
diff --git a/sdk/lib/utf/utf16.dart b/sdk/lib/utf/utf16.dart
index 7c67a301f24afee79798364da6c7390f0bae0b2f..4fbb80ff9618352ab030b752ea439c10654433e0 100644
--- a/sdk/lib/utf/utf16.dart
+++ b/sdk/lib/utf/utf16.dart
@@ -113,7 +113,7 @@ List<int> encodeUtf16(String str) =>
List<int> encodeUtf16be(String str, [bool writeBOM = false]) {
List<int> utf16CodeUnits = _stringToUtf16CodeUnits(str);
List<int> encoding =
- new List<int>(2 * utf16CodeUnits.length + (writeBOM ? 2 : 0));
+ new List<int>.fixedLength(2 * utf16CodeUnits.length + (writeBOM ? 2 : 0));
int i = 0;
if (writeBOM) {
encoding[i++] = UNICODE_UTF_BOM_HI;
@@ -133,7 +133,7 @@ List<int> encodeUtf16be(String str, [bool writeBOM = false]) {
List<int> encodeUtf16le(String str, [bool writeBOM = false]) {
List<int> utf16CodeUnits = _stringToUtf16CodeUnits(str);
List<int> encoding =
- new List<int>(2 * utf16CodeUnits.length + (writeBOM ? 2 : 0));
+ new List<int>.fixedLength(2 * utf16CodeUnits.length + (writeBOM ? 2 : 0));
int i = 0;
if (writeBOM) {
encoding[i++] = UNICODE_UTF_BOM_LO;
@@ -188,13 +188,15 @@ typedef _ListRangeIterator _CodeUnitsProvider();
* provides an iterator on demand and the iterator will only translate bytes
* as requested by the user of the iterator. (Note: results are not cached.)
*/
-class IterableUtf16Decoder implements Iterable<int> {
+// TODO(floitsch): Consider removing the extend and switch to implements since
+// that's cheaper to allocate.
+class IterableUtf16Decoder extends Iterable<int> {
final _CodeUnitsProvider codeunitsProvider;
final int replacementCodepoint;
IterableUtf16Decoder._(this.codeunitsProvider, this.replacementCodepoint);
- Utf16CodeUnitDecoder iterator() =>
+ Utf16CodeUnitDecoder get iterator =>
new Utf16CodeUnitDecoder.fromListRangeIterator(codeunitsProvider(),
replacementCodepoint);
}
@@ -207,6 +209,7 @@ class IterableUtf16Decoder implements Iterable<int> {
class Utf16BytesToCodeUnitsDecoder implements _ListRangeIterator {
final _ListRangeIterator utf16EncodedBytesIterator;
final int replacementCodepoint;
+ int _current = null;
Utf16BytesToCodeUnitsDecoder._fromListRangeIterator(
this.utf16EncodedBytesIterator, this.replacementCodepoint);
@@ -235,33 +238,36 @@ class Utf16BytesToCodeUnitsDecoder implements _ListRangeIterator {
* over-allocates the List containing results.
*/
List<int> decodeRest() {
- List<int> codeunits = new List<int>(remaining);
+ List<int> codeunits = new List<int>.fixedLength(remaining);
int i = 0;
- while (hasNext) {
- codeunits[i++] = next();
+ while (moveNext()) {
+ codeunits[i++] = current;
}
if (i == codeunits.length) {
return codeunits;
} else {
- List<int> truncCodeunits = new List<int>(i);
+ List<int> truncCodeunits = new List<int>.fixedLength(i);
truncCodeunits.setRange(0, i, codeunits);
return truncCodeunits;
}
}
- bool get hasNext => utf16EncodedBytesIterator.hasNext;
+ int get current => _current;
- int next() {
+ bool moveNext() {
+ _current = null;
if (utf16EncodedBytesIterator.remaining < 2) {
- utf16EncodedBytesIterator.next();
+ utf16EncodedBytesIterator.moveNext();
if (replacementCodepoint != null) {
- return replacementCodepoint;
+ _current = replacementCodepoint;
+ return true;
} else {
throw new ArgumentError(
"Invalid UTF16 at ${utf16EncodedBytesIterator.position}");
}
} else {
- return decode();
+ _current = decode();
+ return true;
}
}
@@ -288,16 +294,19 @@ class Utf16beBytesToCodeUnitsDecoder extends Utf16BytesToCodeUnitsDecoder {
Utf16beBytesToCodeUnitsDecoder(List<int> utf16EncodedBytes, [
int offset = 0, int length, bool stripBom = true,
int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) :
- super._fromListRangeIterator((new _ListRange(utf16EncodedBytes, offset,
- length)).iterator(), replacementCodepoint) {
+ super._fromListRangeIterator(
+ (new _ListRange(utf16EncodedBytes, offset, length)).iterator,
+ replacementCodepoint) {
if (stripBom && hasUtf16beBom(utf16EncodedBytes, offset, length)) {
skip();
}
}
int decode() {
- int hi = utf16EncodedBytesIterator.next();
- int lo = utf16EncodedBytesIterator.next();
+ utf16EncodedBytesIterator.moveNext();
+ int hi = utf16EncodedBytesIterator.current;
+ utf16EncodedBytesIterator.moveNext();
+ int lo = utf16EncodedBytesIterator.current;
return (hi << 8) + lo;
}
}
@@ -310,16 +319,19 @@ class Utf16leBytesToCodeUnitsDecoder extends Utf16BytesToCodeUnitsDecoder {
Utf16leBytesToCodeUnitsDecoder(List<int> utf16EncodedBytes, [
int offset = 0, int length, bool stripBom = true,
int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) :
- super._fromListRangeIterator((new _ListRange(utf16EncodedBytes, offset,
- length)).iterator(), replacementCodepoint) {
+ super._fromListRangeIterator(
+ (new _ListRange(utf16EncodedBytes, offset, length)).iterator,
+ replacementCodepoint) {
if (stripBom && hasUtf16leBom(utf16EncodedBytes, offset, length)) {
skip();
}
}
int decode() {
- int lo = utf16EncodedBytesIterator.next();
- int hi = utf16EncodedBytesIterator.next();
+ utf16EncodedBytesIterator.moveNext();
+ int lo = utf16EncodedBytesIterator.current;
+ utf16EncodedBytesIterator.moveNext();
+ int hi = utf16EncodedBytesIterator.current;
return (hi << 8) + lo;
}
}
« no previous file with comments | « sdk/lib/uri/uri.dart ('k') | sdk/lib/utf/utf32.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698