Skip to content

Commit 608ff52

Browse files
dbandstraandrewrk
authored andcommittedJul 29, 2018
add SliceOutStream, rename SliceStream to SliceInStream (#1301)
1 parent f884381 commit 608ff52

File tree

2 files changed

+72
-5
lines changed

2 files changed

+72
-5
lines changed
 

‎std/io.zig

+47-1
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,7 @@ pub fn PeekStream(comptime buffer_size: usize, comptime InStreamError: type) typ
419419
};
420420
}
421421

422-
pub const SliceStream = struct {
422+
pub const SliceInStream = struct {
423423
const Self = this;
424424
pub const Error = error { };
425425
pub const Stream = InStream(Error);
@@ -447,7 +447,53 @@ pub const SliceStream = struct {
447447

448448
return size;
449449
}
450+
};
451+
452+
/// This is a simple OutStream that writes to a slice, and returns an error
453+
/// when it runs out of space.
454+
pub const SliceOutStream = struct {
455+
pub const Error = error{OutOfSpace};
456+
pub const Stream = OutStream(Error);
457+
458+
pub stream: Stream,
459+
460+
pos: usize,
461+
slice: []u8,
450462

463+
pub fn init(slice: []u8) SliceOutStream {
464+
return SliceOutStream{
465+
.slice = slice,
466+
.pos = 0,
467+
.stream = Stream{ .writeFn = writeFn },
468+
};
469+
}
470+
471+
pub fn getWritten(self: *const SliceOutStream) []const u8 {
472+
return self.slice[0..self.pos];
473+
}
474+
475+
pub fn reset(self: *SliceOutStream) void {
476+
self.pos = 0;
477+
}
478+
479+
fn writeFn(out_stream: *Stream, bytes: []const u8) Error!void {
480+
const self = @fieldParentPtr(SliceOutStream, "stream", out_stream);
481+
482+
assert(self.pos <= self.slice.len);
483+
484+
const n =
485+
if (self.pos + bytes.len <= self.slice.len)
486+
bytes.len
487+
else
488+
self.slice.len - self.pos;
489+
490+
std.mem.copy(u8, self.slice[self.pos..self.pos + n], bytes[0..n]);
491+
self.pos += n;
492+
493+
if (n < bytes.len) {
494+
return Error.OutOfSpace;
495+
}
496+
}
451497
};
452498

453499
pub fn BufferedOutStream(comptime Error: type) type {

‎std/io_test.zig

+25-4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const std = @import("index.zig");
22
const io = std.io;
33
const DefaultPrng = std.rand.DefaultPrng;
44
const assert = std.debug.assert;
5+
const assertError = std.debug.assertError;
56
const mem = std.mem;
67
const os = std.os;
78
const builtin = @import("builtin");
@@ -61,9 +62,9 @@ test "BufferOutStream" {
6162
assert(mem.eql(u8, buffer.toSlice(), "x: 42\ny: 1234\n"));
6263
}
6364

64-
test "SliceStream" {
65+
test "SliceInStream" {
6566
const bytes = []const u8 { 1, 2, 3, 4, 5, 6, 7 };
66-
var ss = io.SliceStream.init(bytes);
67+
var ss = io.SliceInStream.init(bytes);
6768

6869
var dest: [4]u8 = undefined;
6970

@@ -81,8 +82,8 @@ test "SliceStream" {
8182

8283
test "PeekStream" {
8384
const bytes = []const u8 { 1, 2, 3, 4, 5, 6, 7, 8 };
84-
var ss = io.SliceStream.init(bytes);
85-
var ps = io.PeekStream(2, io.SliceStream.Error).init(&ss.stream);
85+
var ss = io.SliceInStream.init(bytes);
86+
var ps = io.PeekStream(2, io.SliceInStream.Error).init(&ss.stream);
8687

8788
var dest: [4]u8 = undefined;
8889

@@ -111,3 +112,23 @@ test "PeekStream" {
111112
assert(dest[0] == 12);
112113
assert(dest[1] == 11);
113114
}
115+
116+
test "SliceOutStream" {
117+
var buffer: [10]u8 = undefined;
118+
var ss = io.SliceOutStream.init(buffer[0..]);
119+
120+
try ss.stream.write("Hello");
121+
assert(mem.eql(u8, ss.getWritten(), "Hello"));
122+
123+
try ss.stream.write("world");
124+
assert(mem.eql(u8, ss.getWritten(), "Helloworld"));
125+
126+
assertError(ss.stream.write("!"), error.OutOfSpace);
127+
assert(mem.eql(u8, ss.getWritten(), "Helloworld"));
128+
129+
ss.reset();
130+
assert(ss.getWritten().len == 0);
131+
132+
assertError(ss.stream.write("Hello world!"), error.OutOfSpace);
133+
assert(mem.eql(u8, ss.getWritten(), "Hello worl"));
134+
}

0 commit comments

Comments
 (0)
Please sign in to comment.