Chromium Code Reviews| Index: sdk/lib/io/io_sink.dart |
| diff --git a/sdk/lib/io/io_sink.dart b/sdk/lib/io/io_sink.dart |
| index 8001905509676c265355189d1ecebed38dac85ef..c6a82f00338e7fefc4fac78a7828f22c85471c41 100644 |
| --- a/sdk/lib/io/io_sink.dart |
| +++ b/sdk/lib/io/io_sink.dart |
| @@ -52,74 +52,20 @@ abstract class IOSink implements StreamSink<List<int>>, StringSink { |
| Future get done; |
| } |
| - |
| -class _IOSinkImpl implements IOSink { |
| - final StreamConsumer<List<int>> _target; |
| +class _StreamSinkImpl<T> implements StreamSink<T> { |
|
Søren Gjesse
2013/04/16 12:41:31
Should this class be public in dart:async to enabl
Anders Johnsen
2013/04/16 13:46:22
Maybe. I'll consider moving it later on, after tal
|
| + final StreamConsumer<T> _target; |
| Completer _doneCompleter = new Completer(); |
| Future _doneFuture; |
| - StreamController<List<int>> _controllerInstance; |
| + StreamController<T> _controllerInstance; |
| Completer _controllerCompleter; |
| - Encoding _encoding; |
| bool _isClosed = false; |
| bool _isBound = false; |
| - bool _encodingMutable = true; |
| - _IOSinkImpl(StreamConsumer<List<int>> this._target, this._encoding) { |
| + _StreamSinkImpl(StreamConsumer<T> this._target) { |
| _doneFuture = _doneCompleter.future; |
| } |
| - Encoding get encoding => _encoding; |
| - |
| - void set encoding(Encoding value) { |
| - if (!_encodingMutable) { |
| - throw new StateError("IOSink encoding is not mutable"); |
| - } |
| - _encoding = value; |
| - } |
| - |
| - void write(Object obj) { |
| - // This comment is copied from runtime/lib/string_buffer_patch.dart. |
| - // TODO(srdjan): The following four lines could be replaced by |
| - // '$obj', but apparently this is too slow on the Dart VM. |
| - String string; |
| - if (obj is String) { |
| - string = obj; |
| - } else { |
| - string = obj.toString(); |
| - if (string is! String) { |
| - throw new ArgumentError('toString() did not return a string'); |
| - } |
| - } |
| - if (string.isEmpty) return; |
| - add(_encodeString(string, _encoding)); |
| - } |
| - |
| - void writeAll(Iterable objects, [String separator = ""]) { |
| - Iterator iterator = objects.iterator; |
| - if (!iterator.moveNext()) return; |
| - if (separator.isEmpty) { |
| - do { |
| - write(iterator.current); |
| - } while (iterator.moveNext()); |
| - } else { |
| - write(iterator.current); |
| - while (iterator.moveNext()) { |
| - write(separator); |
| - write(iterator.current); |
| - } |
| - } |
| - } |
| - |
| - void writeln([Object obj = ""]) { |
| - write(obj); |
| - write("\n"); |
| - } |
| - |
| - void writeCharCode(int charCode) { |
| - write(new String.fromCharCode(charCode)); |
| - } |
| - |
| - void add(List<int> data) { |
| + void add(T data) { |
| _controller.add(data); |
| } |
| @@ -127,9 +73,9 @@ class _IOSinkImpl implements IOSink { |
| _controller.addError(error); |
| } |
| - Future addStream(Stream<List<int>> stream) { |
| + Future addStream(Stream<T> stream) { |
| if (_isBound) { |
| - throw new StateError("IOSink is already bound to a stream"); |
| + throw new StateError("StreamSink is already bound to a stream"); |
| } |
| _isBound = true; |
| // Wait for any sync operations to complete. |
| @@ -147,7 +93,7 @@ class _IOSinkImpl implements IOSink { |
| Future close() { |
| if (_isBound) { |
| - throw new StateError("IOSink is bound to a stream"); |
| + throw new StateError("StreamSink is bound to a stream"); |
| } |
| if (!_isClosed) { |
| _isClosed = true; |
| @@ -179,15 +125,15 @@ class _IOSinkImpl implements IOSink { |
| } |
| } |
| - StreamController<List<int>> get _controller { |
| + StreamController<T> get _controller { |
| if (_isBound) { |
| - throw new StateError("IOSink is bound to a stream"); |
| + throw new StateError("StreamSink is bound to a stream"); |
| } |
| if (_isClosed) { |
| - throw new StateError("IOSink is closed"); |
| + throw new StateError("StreamSink is closed"); |
| } |
| if (_controllerInstance == null) { |
| - _controllerInstance = new StreamController<List<int>>(); |
| + _controllerInstance = new StreamController<T>(); |
| _controllerCompleter = new Completer(); |
| _target.addStream(_controller.stream) |
| .then( |
| @@ -220,3 +166,63 @@ class _IOSinkImpl implements IOSink { |
| return _controllerInstance; |
| } |
| } |
| + |
| + |
| +class _IOSinkImpl extends _StreamSinkImpl<List<int>> implements IOSink { |
| + Encoding _encoding; |
| + bool _encodingMutable = true; |
| + |
| + _IOSinkImpl(StreamConsumer<List<int>> target, this._encoding) |
| + : super(target); |
| + |
| + Encoding get encoding => _encoding; |
| + |
| + void set encoding(Encoding value) { |
| + if (!_encodingMutable) { |
| + throw new StateError("IOSink encoding is not mutable"); |
| + } |
| + _encoding = value; |
| + } |
| + |
| + void write(Object obj) { |
| + // This comment is copied from runtime/lib/string_buffer_patch.dart. |
| + // TODO(srdjan): The following four lines could be replaced by |
| + // '$obj', but apparently this is too slow on the Dart VM. |
| + String string; |
| + if (obj is String) { |
| + string = obj; |
| + } else { |
| + string = obj.toString(); |
| + if (string is! String) { |
| + throw new ArgumentError('toString() did not return a string'); |
| + } |
| + } |
| + if (string.isEmpty) return; |
| + add(_encodeString(string, _encoding)); |
| + } |
| + |
| + void writeAll(Iterable objects, [String separator = ""]) { |
| + Iterator iterator = objects.iterator; |
| + if (!iterator.moveNext()) return; |
| + if (separator.isEmpty) { |
| + do { |
| + write(iterator.current); |
| + } while (iterator.moveNext()); |
| + } else { |
| + write(iterator.current); |
| + while (iterator.moveNext()) { |
| + write(separator); |
| + write(iterator.current); |
| + } |
| + } |
| + } |
| + |
| + void writeln([Object obj = ""]) { |
| + write(obj); |
| + write("\n"); |
| + } |
| + |
| + void writeCharCode(int charCode) { |
| + write(new String.fromCharCode(charCode)); |
| + } |
| +} |