diff --git a/src/_build/steps/PathCopy.zig b/src/_build/steps/PathCopy.zig
index 17eaed9..3c1e862 100644
--- a/src/_build/steps/PathCopy.zig
+++ b/src/_build/steps/PathCopy.zig
@@ -3,7 +3,7 @@
//! during the build.
const std = @import("std");
-const ArrayList = std.ArrayListUnmanaged;
+const ArrayList = std.ArrayList;
const PathCopy = @This();
diff --git a/src/autodoc/wasm/Decl.zig b/src/autodoc/wasm/Decl.zig
index 1a01b9e..72a9971 100644
--- a/src/autodoc/wasm/Decl.zig
+++ b/src/autodoc/wasm/Decl.zig
@@ -1,4 +1,4 @@
-const ArrayList = std.ArrayListUnmanaged;
+const ArrayList = std.ArrayList;
const Decl = @This();
const std = @import("std");
const Ast = std.zig.Ast;
@@ -229,7 +229,7 @@ pub fn lookup(decl: *const Decl, name: []const u8) ?Decl.Index {
}
/// Appends the fully qualified name to `out`.
-pub fn fqn(decl: *const Decl, out: *std.ArrayListUnmanaged(u8)) Oom!void {
+pub fn fqn(decl: *const Decl, out: *std.ArrayList(u8)) Oom!void {
const name = decl.extra_info().name;
if (std.mem.eql(u8, name, "std") or
@@ -246,7 +246,7 @@ pub fn fqn(decl: *const Decl, out: *std.ArrayListUnmanaged(u8)) Oom!void {
}
/// Appends the fully qualified name to `out`.
-pub fn fqn2(decl: *const Decl, parent_idx: Decl.Index, out: *std.ArrayListUnmanaged(u8)) Oom!void {
+pub fn fqn2(decl: *const Decl, parent_idx: Decl.Index, out: *std.ArrayList(u8)) Oom!void {
const name = decl.extra_info().name;
if (std.mem.eql(u8, name, "std") or
@@ -268,7 +268,7 @@ pub fn fqn2(decl: *const Decl, parent_idx: Decl.Index, out: *std.ArrayListUnmana
/// Appends the fully qualified name to `out`.
pub fn fqnWrite(
decl: *const Decl,
- out: std.ArrayListUnmanaged(u8).Writer,
+ out: std.ArrayList(u8).Writer,
) !void {
const name = decl.extra_info().name;
@@ -289,8 +289,8 @@ pub fn fqnWrite(
pub fn fqn2Write(
decl: *const Decl,
parent_idx: Decl.Index,
- out: std.ArrayListUnmanaged(u8).Writer,
-) Oom!void {
+ out: *std.Io.Writer,
+) !void {
const name = decl.extra_info().name;
if (std.mem.eql(u8, name, "std") or
@@ -299,7 +299,7 @@ pub fn fqn2Write(
if (parent_idx == .none) {
try decl.appendPath(out);
- out.context.self.items.len -= 1; // remove the trailing '.'
+ out.end -= 1; // remove the trailing '.'
return;
}
@@ -309,12 +309,12 @@ pub fn fqn2Write(
try out.writeAll(name);
}
-pub fn reset_with_path(decl: *const Decl, list: *std.ArrayListUnmanaged(u8)) Oom!void {
+pub fn reset_with_path(decl: *const Decl, list: *std.ArrayList(u8)) Oom!void {
list.clearRetainingCapacity();
try append_path(decl, list);
}
-pub fn append_path(decl: *const Decl, list: *std.ArrayListUnmanaged(u8)) Oom!void {
+pub fn append_path(decl: *const Decl, list: *std.ArrayList(u8)) Oom!void {
const start = list.items.len;
// Prefer the module name alias.
for (Walk.modules.keys(), Walk.modules.values()) |pkg_name, pkg_file| {
@@ -342,9 +342,9 @@ pub fn append_path(decl: *const Decl, list: *std.ArrayListUnmanaged(u8)) Oom!voi
pub fn appendPath(
decl: *const Decl,
- out: std.ArrayListUnmanaged(u8).Writer,
+ out: *std.Io.Writer,
) !void {
- const start = out.context.self.items.len;
+ const start = out.end;
// Prefer the module name alias.
for (Walk.modules.keys(), Walk.modules.values()) |pkg_name, pkg_file| {
if (pkg_file == decl.file) {
@@ -358,19 +358,18 @@ pub fn appendPath(
// try out.ensureUnusedCapacity(gpa, file_path.len + 1);
try out.writeAll(file_path);
- const list = out.context.self;
- for (list.items[start..]) |*byte| switch (byte.*) {
+ for (out.buffer[start..]) |*byte| switch (byte.*) {
'/' => byte.* = '.',
else => continue,
};
- if (std.mem.endsWith(u8, list.items, ".zig")) {
- list.items.len -= 3;
+ if (std.mem.endsWith(u8, out.buffered(), ".zig")) {
+ out.end -= 3;
} else {
try out.writeByte('.');
}
}
-pub fn append_parent_ns(list: *std.ArrayListUnmanaged(u8), parent: Decl.Index) Oom!void {
+pub fn append_parent_ns(list: *std.ArrayList(u8), parent: Decl.Index) Oom!void {
assert(parent != .none);
const decl = parent.get();
if (decl.parent != .none) {
@@ -380,7 +379,7 @@ pub fn append_parent_ns(list: *std.ArrayListUnmanaged(u8), parent: Decl.Index) O
}
}
-pub fn appendParentNs(out: std.ArrayListUnmanaged(u8).Writer, parent: Decl.Index) !void {
+pub fn appendParentNs(out: std.ArrayList(u8).Writer, parent: Decl.Index) !void {
assert(parent != .none);
const decl = parent.get();
if (decl.parent != .none) {
diff --git a/src/autodoc/wasm/Walk.zig b/src/autodoc/wasm/Walk.zig
index 8253b38..ebb164b 100644
--- a/src/autodoc/wasm/Walk.zig
+++ b/src/autodoc/wasm/Walk.zig
@@ -11,7 +11,7 @@ const Oom = error{OutOfMemory};
pub const Decl = @import("Decl.zig");
pub var files: std.StringArrayHashMapUnmanaged(File) = .empty;
-pub var decls: std.ArrayListUnmanaged(Decl) = .empty;
+pub var decls: std.ArrayList(Decl) = .empty;
pub var modules: std.StringArrayHashMapUnmanaged(File.Index) = .empty;
file: File.Index,
diff --git a/src/autodoc/wasm/html_render.zig b/src/autodoc/wasm/html_render.zig
index f756122..93b4597 100644
--- a/src/autodoc/wasm/html_render.zig
+++ b/src/autodoc/wasm/html_render.zig
@@ -33,7 +33,7 @@ pub const Annotation = struct {
pub fn fileSourceHtml(
file_index: Walk.File.Index,
- out: *std.ArrayListUnmanaged(u8),
+ out: *std.ArrayList(u8),
root_node: Ast.Node.Index,
options: RenderSourceOptions,
) !void {
@@ -41,7 +41,7 @@ pub fn fileSourceHtml(
const file = file_index.get();
const g = struct {
- var field_access_buffer: std.ArrayListUnmanaged(u8) = .empty;
+ var field_access_buffer: std.ArrayList(u8) = .empty;
};
const start_token = ast.firstToken(root_node);
@@ -117,7 +117,7 @@ pub fn fileSourceHtml(
if (next_annotate_index >= options.source_location_annotations.len) break;
const next_annotation = options.source_location_annotations[next_annotate_index];
if (cursor <= next_annotation.file_byte_offset) break;
- try out.writer(gpa).print("", .{
+ try out.print(gpa, "", .{
options.annotation_prefix, next_annotation.dom_id,
});
next_annotate_index += 1;
@@ -387,7 +387,7 @@ pub fn fileSourceHtml(
}
fn appendUnindented(
- out: *std.ArrayListUnmanaged(u8),
+ out: *std.ArrayList(u8),
s: []const u8,
indent: usize,
) !void {
@@ -404,7 +404,7 @@ fn appendUnindented(
}
}
-pub fn appendEscaped(out: *std.ArrayListUnmanaged(u8), s: []const u8) !void {
+pub fn appendEscaped(out: *std.ArrayList(u8), s: []const u8) !void {
for (s) |c| {
try out.ensureUnusedCapacity(gpa, 6);
switch (c) {
@@ -419,7 +419,7 @@ pub fn appendEscaped(out: *std.ArrayListUnmanaged(u8), s: []const u8) !void {
fn walkFieldAccesses(
file_index: Walk.File.Index,
- out: *std.ArrayListUnmanaged(u8),
+ out: *std.ArrayList(u8),
node: Ast.Node.Index,
) Oom!void {
const ast = file_index.get_ast();
@@ -443,7 +443,7 @@ fn walkFieldAccesses(
fn resolveIdentLink(
file_index: Walk.File.Index,
- out: *std.ArrayListUnmanaged(u8),
+ out: *std.ArrayList(u8),
ident_token: Ast.TokenIndex,
) Oom!void {
const decl_index = file_index.get().lookup_token(ident_token);
@@ -463,7 +463,7 @@ fn unindent(s: []const u8, indent: usize) []const u8 {
return s[indent_idx..];
}
-pub fn resolveDeclLink(decl_index: Decl.Index, out: *std.ArrayListUnmanaged(u8)) Oom!void {
+pub fn resolveDeclLink(decl_index: Decl.Index, out: *std.ArrayList(u8)) Oom!void {
const decl = decl_index.get();
switch (decl.categorize()) {
.alias => |alias_decl| try alias_decl.get().fqn(out),
diff --git a/src/autodoc/wasm/main.zig b/src/autodoc/wasm/main.zig
index 90ef071..18fc08e 100644
--- a/src/autodoc/wasm/main.zig
+++ b/src/autodoc/wasm/main.zig
@@ -1,4 +1,4 @@
-const ArrayList = std.ArrayListUnmanaged;
+const ArrayList = std.ArrayList;
const std = @import("std");
const log = std.log;
const assert = std.debug.assert;
@@ -68,8 +68,8 @@ export fn unpack(tar_ptr: [*]u8, tar_len: usize) void {
};
}
-var query_string: std.ArrayListUnmanaged(u8) = .empty;
-var query_results: std.ArrayListUnmanaged(Decl.Index) = .empty;
+var query_string: std.ArrayList(u8) = .empty;
+var query_results: std.ArrayList(Decl.Index) = .empty;
/// Resizes the query string to be the correct length; returns the pointer to
/// the query string.
@@ -101,11 +101,11 @@ fn query_exec_fallible(query: []const u8, ignore_case: bool) !void {
segments: u16,
};
const g = struct {
- var full_path_search_text: std.ArrayListUnmanaged(u8) = .empty;
- var full_path_search_text_lower: std.ArrayListUnmanaged(u8) = .empty;
- var doc_search_text: std.ArrayListUnmanaged(u8) = .empty;
+ var full_path_search_text: std.ArrayList(u8) = .empty;
+ var full_path_search_text_lower: std.ArrayList(u8) = .empty;
+ var doc_search_text: std.ArrayList(u8) = .empty;
/// Each element matches a corresponding query_results element.
- var scores: std.ArrayListUnmanaged(Score) = .empty;
+ var scores: std.ArrayList(Score) = .empty;
};
// First element stores the size of the list.
@@ -239,7 +239,7 @@ const ErrorIdentifier = packed struct(u64) {
fn html(
ei: ErrorIdentifier,
base_decl: Decl.Index,
- out: *std.ArrayListUnmanaged(u8),
+ out: *std.ArrayList(u8),
) !void {
const decl_index = ei.decl_index;
const ast = decl_index.get().file.get_ast();
@@ -266,7 +266,7 @@ const ErrorIdentifier = packed struct(u64) {
}
};
-var string_result: std.ArrayListUnmanaged(u8) = .empty;
+var string_result: std.ArrayList(u8) = .empty;
var error_set_result: std.StringArrayHashMapUnmanaged(ErrorIdentifier) = .empty;
export fn decl_error_set(decl_index: Decl.Index) Slice(ErrorIdentifier) {
@@ -435,7 +435,7 @@ fn decl_fields_fallible(decl_index: Decl.Index) ![]Ast.Node.Index {
fn ast_decl_fields_fallible(ast: *Ast, ast_index: Ast.Node.Index) ![]Ast.Node.Index {
const g = struct {
- var result: std.ArrayListUnmanaged(Ast.Node.Index) = .empty;
+ var result: std.ArrayList(Ast.Node.Index) = .empty;
};
g.result.clearRetainingCapacity();
var buf: [2]Ast.Node.Index = undefined;
@@ -453,7 +453,7 @@ fn ast_decl_fields_fallible(ast: *Ast, ast_index: Ast.Node.Index) ![]Ast.Node.In
fn decl_params_fallible(decl_index: Decl.Index) ![]Ast.Node.Index {
const g = struct {
- var result: std.ArrayListUnmanaged(Ast.Node.Index) = .empty;
+ var result: std.ArrayList(Ast.Node.Index) = .empty;
};
g.result.clearRetainingCapacity();
const decl = decl_index.get();
@@ -498,7 +498,7 @@ export fn decl_param_html(decl_index: Decl.Index, param_node: Ast.Node.Index) St
}
fn decl_field_html_fallible(
- out: *std.ArrayListUnmanaged(u8),
+ out: *std.ArrayList(u8),
decl_index: Decl.Index,
field_node: Ast.Node.Index,
) !void {
@@ -518,7 +518,7 @@ fn decl_field_html_fallible(
}
fn decl_param_html_fallible(
- out: *std.ArrayListUnmanaged(u8),
+ out: *std.ArrayList(u8),
decl_index: Decl.Index,
param_node: Ast.Node.Index,
) !void {
@@ -754,7 +754,7 @@ export fn decl_docs_html(decl_index: Decl.Index, short: bool) String {
}
fn collect_docs(
- list: *std.ArrayListUnmanaged(u8),
+ list: *std.ArrayList(u8),
ast: *const Ast,
first_doc_comment: Ast.TokenIndex,
) Oom!void {
@@ -772,7 +772,7 @@ fn collect_docs(
}
fn render_docs(
- out: *std.ArrayListUnmanaged(u8),
+ out: *std.ArrayList(u8),
decl_index: Decl.Index,
first_doc_comment: Ast.TokenIndex,
short: bool,
@@ -799,10 +799,17 @@ fn render_docs(
.context = decl_index,
.renderFn = renderMarkdownNode,
};
- try renderer.render(parsed_doc, out.writer(gpa));
+
+ var allocating = std.Io.Writer.Allocating.fromArrayList(gpa, out);
+ defer out.* = allocating.toArrayList();
+
+ renderer.render(parsed_doc, &allocating.writer) catch |err| switch (err) {
+ error.WriteFailed => return error.OutOfMemory,
+ else => return err,
+ };
}
-const MarkdownWriter = std.ArrayListUnmanaged(u8).Writer;
+const MarkdownWriter = *std.Io.Writer;
const MarkdownRenderer = markdown.Renderer(MarkdownWriter, Decl.Index);
fn renderMarkdownNode(
@@ -812,7 +819,7 @@ fn renderMarkdownNode(
writer: MarkdownWriter,
) !void {
const g = struct {
- var link_buffer: std.ArrayListUnmanaged(u8) = .empty;
+ var link_buffer: std.ArrayList(u8) = .empty;
};
const data = doc.nodes.items(.data)[@intFromEnum(node)];
@@ -839,7 +846,7 @@ fn renderMarkdownNode(
return MarkdownRenderer.renderDefault(r, doc, node, writer);
}
- // var virtual_file_name = std.ArrayListUnmanaged(u8).empty;
+ // var virtual_file_name = std.ArrayList(u8).empty;
// try r.context.get().fqn(&virtual_file_name);
// try virtual_file_name.writer(gpa).print("/snippet", .{});
// log.info("adding virtual file: {s}", .{virtual_file_name.items});
@@ -1034,7 +1041,7 @@ export fn find_module_root(pkg: Walk.ModuleIndex) Decl.Index {
}
/// Set by `set_input_string`.
-var input_string: std.ArrayListUnmanaged(u8) = .empty;
+var input_string: std.ArrayList(u8) = .empty;
export fn set_input_string(len: usize) [*]u8 {
input_string.resize(gpa, len) catch @panic("OOM");
@@ -1058,7 +1065,7 @@ export fn find_decl() Decl.Index {
if (result != .none) return result;
const g = struct {
- var match_fqn: std.ArrayListUnmanaged(u8) = .empty;
+ var match_fqn: std.ArrayList(u8) = .empty;
};
for (Walk.decls.items, 0..) |*decl, decl_index| {
g.match_fqn.clearRetainingCapacity();
@@ -1120,7 +1127,7 @@ export fn namespace_members(
include_private: bool,
) Slice(Decl.Index) {
const g = struct {
- var members: std.ArrayListUnmanaged(Decl.Index) = .empty;
+ var members: std.ArrayList(Decl.Index) = .empty;
};
g.members.clearRetainingCapacity();
@@ -1133,7 +1140,7 @@ export fn namespace_members(
fn namespaceMembersInner(
parent_idx: Decl.Index,
include_private: bool,
- out_members: *std.ArrayListUnmanaged(Decl.Index),
+ out_members: *std.ArrayList(Decl.Index),
) void {
const parent = parent_idx.get();
switch (parent.categorize()) {
diff --git a/src/autodoc/wasm/markdown.zig b/src/autodoc/wasm/markdown.zig
index b18fe05..af7c73d 100644
--- a/src/autodoc/wasm/markdown.zig
+++ b/src/autodoc/wasm/markdown.zig
@@ -145,7 +145,7 @@ fn mainImpl() !void {
var parser = try Parser.init(gpa);
defer parser.deinit();
- var stdin_buf = std.io.bufferedReader(std.io.getStdIn().reader());
+ var stdin_buf = std.Io.bufferedReader(std.Io.getStdIn().reader());
var line_buf = std.ArrayList(u8).init(gpa);
defer line_buf.deinit();
while (stdin_buf.reader().streamUntilDelimiter(line_buf.writer(), '\n', null)) {
@@ -160,7 +160,7 @@ fn mainImpl() !void {
var doc = try parser.endInput();
defer doc.deinit(gpa);
- var stdout_buf = std.io.bufferedWriter(std.io.getStdOut().writer());
+ var stdout_buf = std.Io.bufferedWriter(std.Io.getStdOut().writer());
try doc.render(stdout_buf.writer());
try stdout_buf.flush();
}
diff --git a/src/autodoc/wasm/markdown/Parser.zig b/src/autodoc/wasm/markdown/Parser.zig
index 20a3e03..0e9d48e 100644
--- a/src/autodoc/wasm/markdown/Parser.zig
+++ b/src/autodoc/wasm/markdown/Parser.zig
@@ -29,7 +29,7 @@ const Node = Document.Node;
const ExtraIndex = Document.ExtraIndex;
const ExtraData = Document.ExtraData;
const StringIndex = Document.StringIndex;
-const ArrayList = std.ArrayListUnmanaged;
+const ArrayList = std.ArrayList;
nodes: Node.List = .{},
extra: ArrayList(u32) = .empty,
diff --git a/src/autodoc/wasm/markdown/renderer.zig b/src/autodoc/wasm/markdown/renderer.zig
index 65f67a7..bb850db 100644
--- a/src/autodoc/wasm/markdown/renderer.zig
+++ b/src/autodoc/wasm/markdown/renderer.zig
@@ -189,7 +189,7 @@ pub fn renderInlineNodeText(
doc: Document,
node: Node.Index,
writer: anytype,
-) @TypeOf(writer).Error!void {
+) !void {
const data = doc.nodes.items(.data)[@intFromEnum(node)];
switch (doc.nodes.items(.tag)[@intFromEnum(node)]) {
.root,
@@ -230,11 +230,11 @@ pub fn renderInlineNodeText(
}
}
-pub fn fmtHtml(bytes: []const u8) std.fmt.Formatter([]const u8, formatHtml) {
+pub fn fmtHtml(bytes: []const u8) std.fmt.Alt([]const u8, formatHtml) {
return .{ .data = bytes };
}
-fn formatHtml(bytes: []const u8, writer: *std.io.Writer) std.io.Writer.Error!void {
+fn formatHtml(bytes: []const u8, writer: *std.Io.Writer) std.Io.Writer.Error!void {
for (bytes) |b| {
switch (b) {
'<' => try writer.writeAll("<"),
diff --git a/src/autodoc/wasm/snippet_render.zig b/src/autodoc/wasm/snippet_render.zig
index 83fae55..62d65be 100644
--- a/src/autodoc/wasm/snippet_render.zig
+++ b/src/autodoc/wasm/snippet_render.zig
@@ -34,7 +34,7 @@ pub const Annotation = struct {
pub fn codeSnippetHtml(
ast: std.zig.Ast,
file_index: Walk.File.Index,
- out: std.ArrayListUnmanaged(u8).Writer,
+ out: *std.Io.Writer,
// root_node: Ast.Node.Index,
options: RenderSourceOptions,
) !void {
@@ -43,7 +43,7 @@ pub fn codeSnippetHtml(
// const ast = file.ast;
const g = struct {
- var field_access_buffer: std.ArrayListUnmanaged(u8) = .empty;
+ var field_access_buffer: std.ArrayList(u8) = .empty;
};
const start_token = ast.firstToken(root_node);
@@ -75,9 +75,8 @@ pub fn codeSnippetHtml(
}
} else if (between.len > 0) {
if (options.collapse_whitespace) {
- const list = out.context.self;
- if (list.items.len > 0 and
- list.items[list.items.len - 1] != ' ')
+ if (out.end > 0 and
+ out.buffer[out.end - 1] != ' ')
{
try out.writeByte(' ');
}
@@ -363,7 +362,7 @@ pub fn codeSnippetHtml(
}
fn appendUnindented(
- out: std.ArrayListUnmanaged(u8).Writer,
+ out: *std.Io.Writer,
s: []const u8,
indent: usize,
) !void {
@@ -373,12 +372,12 @@ fn appendUnindented(
try appendEscaped(out, line);
is_first_line = false;
} else {
- try out.writeAll("\n");
+ try out.writeByte('\n');
try appendEscaped(out, unindent(line, indent));
};
}
-pub fn appendEscaped(out: std.ArrayListUnmanaged(u8).Writer, s: []const u8) !void {
+pub fn appendEscaped(out: *std.Io.Writer, s: []const u8) !void {
for (s) |c| try switch (c) {
'&' => out.writeAll("&"),
'<' => out.writeAll("<"),
@@ -390,7 +389,7 @@ pub fn appendEscaped(out: std.ArrayListUnmanaged(u8).Writer, s: []const u8) !voi
fn walkFieldAccesses(
file_index: Walk.File.Index,
- out: *std.ArrayListUnmanaged(u8),
+ out: *std.ArrayList(u8),
node: Ast.Node.Index,
) Oom!void {
const ast = file_index.get_ast();
@@ -414,7 +413,7 @@ fn walkFieldAccesses(
fn resolveIdentLink(
file_index: Walk.File.Index,
- out: *std.ArrayListUnmanaged(u8),
+ out: *std.ArrayList(u8),
ident_token: Ast.TokenIndex,
) Oom!void {
const decl_index = file_index.get().lookup_token(ident_token);
@@ -436,7 +435,7 @@ fn unindent(s: []const u8, indent: usize) []const u8 {
pub fn resolveDeclLink(
decl_index: Decl.Index,
- out: *std.ArrayListUnmanaged(u8),
+ out: *std.ArrayList(u8),
) Oom!void {
const decl = decl_index.get();
switch (decl.categorize()) {
@@ -452,7 +451,7 @@ pub fn tmpFile(bytes: []u8) !Walk.File.Index {
defer ast.deinit(gpa);
const token_offsets = ast.tokens.items(.start);
- var rendered_err: std.ArrayListUnmanaged(u8) = .{};
+ var rendered_err: std.ArrayList(u8) = .{};
defer rendered_err.deinit(gpa);
for (ast.errors) |err| {
const err_offset = token_offsets[err.token] + ast.errorOffset(err);
diff --git a/src/bit_flags.zig b/src/bit_flags.zig
index 32d3656..38b47b0 100644
--- a/src/bit_flags.zig
+++ b/src/bit_flags.zig
@@ -49,7 +49,7 @@ pub fn BitFlagsImpl(comptime T: type) type {
return @bitCast(self);
}
- pub fn format(self: Self, writer: *std.io.Writer) !void {
+ pub fn format(self: Self, writer: *std.Io.Writer) !void {
try writer.writeAll("{");
var count: BackingInt = 0;
diff --git a/src/bounded_array.zig b/src/bounded_array.zig
index 242147b..ee7b4aa 100644
--- a/src/bounded_array.zig
+++ b/src/bounded_array.zig
@@ -1,5 +1,5 @@
const std = @import("std");
-const Writer = std.io.Writer;
+const Writer = std.Io.Writer;
/// A collection structure, with an array and a length, to/from which bounded,
/// variable-length slices can be written/read.