Skip to content

Commit 0548e64

Browse files
task() unmanaged string impl.
1 parent bb64372 commit 0548e64

File tree

5 files changed

+50
-46
lines changed

5 files changed

+50
-46
lines changed

README.md

+22-18
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,24 @@
11
# Zig String (A UTF-8 String Library)
22

3-
[![CI](https://github.com/JakubSzark/zig-string/actions/workflows/main.yml/badge.svg)](https://github.com/JakubSzark/zig-string/actions/workflows/main.yml) ![Github Repo Issues](https://img.shields.io/github/issues/JakubSzark/zig-string?style=flat) ![GitHub Repo stars](https://img.shields.io/github/stars/JakubSzark/zig-string?style=social)
4-
5-
This library is a UTF-8 compatible **string** library for the **Zig** programming language.
6-
I made this for the sole purpose to further my experience and understanding of zig.
7-
Also it may be useful for some people who need it (including myself), with future projects. Project is also open for people to add to and improve. Please check the **issues** to view requested features.
3+
This library is a UTF-8 compatible **string** library for the **Zig** programming language. I copied [JakubSzark's](https://github.com/JakubSzark/zig-string) String implementation and expanded on it.
84

95
# Basic Usage
106

117
## Managed String
128

139
```zig
1410
const std = @import("std");
15-
const String = @import("./zig-string.zig").String;
11+
const String = @import("./stringz.zig").StringManaged;
1612
// ...
1713
1814
// Use your favorite allocator
1915
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
2016
defer arena.deinit();
17+
const allocator = arena.allocator();
18+
2119
2220
// Create your String
23-
var myString = String.init(arena.allocator());
21+
var myString = String.init(allocator);
2422
defer myString.deinit();
2523
2624
// Use functions provided
@@ -37,21 +35,22 @@ std.debug.assert(myString.cmp("🔥 Hello, World 🔥"));
3735

3836
```zig
3937
const std = @import("std");
40-
const StringUnmanaged = @import("./zig-string.zig").StringUnmanaged;
38+
const String = @import("./stringz.zig").StringUnmanaged;
4139
// ...
4240
4341
// Use your favorite allocator
4442
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
4543
defer arena.deinit();
44+
const allocator = arena.allocator();
4645
4746
// Create your String
4847
var myString = String.init();
49-
defer myString.deinit(arena.allocator());
48+
defer myString.deinit(allocator);
5049
5150
// Use functions provided
52-
try myString.concat(arena.allocator(), "🔥 Hello!");
51+
try myString.concat(allocator, "🔥 Hello!");
5352
_ = myString.pop();
54-
try myString.concat(arena.allocator(), ", World 🔥");
53+
try myString.concat(allocator, ", World 🔥");
5554
5655
// Success!
5756
std.debug.assert(myString.cmp("🔥 Hello, World 🔥"));
@@ -60,7 +59,7 @@ std.debug.assert(myString.cmp("🔥 Hello, World 🔥"));
6059

6160
## When To Use Which?
6261

63-
If simplicity is what you want and you don't need granular control over memory, then use `String` (this is fine for most cases). Otherwise you probably want `StringUnmanaged`.
62+
If simplicity is what you want and you don't need granular control over memory, then use `StringManaged` (this is fine for most cases). Otherwise you probably want `StringUnmanaged`.
6463

6564
| Feature | String | StringUnmanaged |
6665
| ------------------------------- | ------ | -------------------------- |
@@ -76,8 +75,8 @@ Add this to your build.zig.zon
7675
```zig
7776
.dependencies = .{
7877
.string = .{
79-
.url = "https://github.com/JakubSzark/zig-string/archive/refs/heads/master.tar.gz",
80-
//the correct hash will be suggested by zig
78+
.url = "https://github.com/definitepotato/stringz/archive/refs/heads/master.tar.gz",
79+
// The correct hash will be suggested by zig at build time.
8180
}
8281
}
8382
@@ -86,19 +85,24 @@ Add this to your build.zig.zon
8685
And add this to you build.zig
8786

8887
```zig
89-
const string = b.dependency("string", .{
88+
const string = b.dependency("stringz", .{
9089
.target = target,
9190
.optimize = optimize,
9291
});
93-
exe.root_module.addImport("string", string.module("string"));
92+
exe.root_module.addImport("stringz", string.module("stringz"));
9493
9594
```
9695

9796
You can then import the library into your code like this
9897

9998
```zig
100-
const String = @import("string").String;
101-
const StringUnmanaged = @import("string").StringUnmanaged;
99+
const String = @import("stringz").StringManaged;
100+
```
101+
102+
Or
103+
104+
```zig
105+
const String = @import("stringz").StringUnmanaged;
102106
```
103107

104108
# How to Contribute

build.zig

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ pub fn build(b: *std.Build) void {
44
const target = b.standardTargetOptions(.{});
55
const optimize = b.standardOptimizeOption(.{});
66

7-
_ = b.addModule("string", .{ .root_source_file = b.path("zig-string.zig") });
7+
_ = b.addModule("string", .{ .root_source_file = b.path("stringz.zig") });
88

99
var main_tests = b.addTest(.{
10-
.root_source_file = b.path("zig-string-tests.zig"),
10+
.root_source_file = b.path("stringz-tests.zig"),
1111
.target = target,
1212
.optimize = optimize,
1313
});

build.zig.zon

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
.{
2-
.name = .zig_string,
2+
.name = .stringz,
33
.version = "0.10.0",
44
.minimum_zig_version = "0.14.0",
5-
.fingerprint = 0xd2ee692e5a4bdae9,
5+
.fingerprint = 0xcd46d25165d43c8a,
66
.paths = .{""},
77
}

zig-string-tests.zig renamed to stringz-tests.zig

+23-23
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ const expect = std.testing.expect;
33
const expectEqual = std.testing.expectEqual;
44
const expectEqualStrings = std.testing.expectEqualStrings;
55

6-
const String = @import("stringz.zig").String;
6+
const StringManaged = @import("stringz.zig").StringManaged;
77
const StringUnmanaged = @import("stringz.zig").StringUnmanaged;
88

9-
test "String Basic Usage" {
9+
test "StringManaged Basic Usage" {
1010
// Create your String
11-
var myString = String.init(std.testing.allocator);
11+
var myString = StringManaged.init(std.testing.allocator);
1212
defer myString.deinit();
1313

1414
// Use functions provided
@@ -20,9 +20,9 @@ test "String Basic Usage" {
2020
try expect(myString.cmp("🔥 Hello, World 🔥"));
2121
}
2222

23-
test "String Tests" {
23+
test "StringManaged Tests" {
2424
// This is how we create the String
25-
var myStr = String.init(std.testing.allocator);
25+
var myStr = StringManaged.init(std.testing.allocator);
2626
defer myStr.deinit();
2727

2828
// allocate & capacity
@@ -113,15 +113,15 @@ test "String Tests" {
113113
try expectEqualStrings(myStr.split("💯", 5).?, "Hello");
114114
try expectEqualStrings(myStr.split("💯", 6).?, "");
115115

116-
var splitStr = String.init(std.testing.allocator);
116+
var splitStr = StringManaged.init(std.testing.allocator);
117117
defer splitStr.deinit();
118118

119119
try splitStr.concat("variable='value'");
120120
try expectEqualStrings(splitStr.split("=", 0).?, "variable");
121121
try expectEqualStrings(splitStr.split("=", 1).?, "'value'");
122122

123123
// splitAll
124-
var splitAllStr = try String.init_with_contents(std.testing.allocator, "THIS IS A TEST");
124+
var splitAllStr = try StringManaged.init_with_contents(std.testing.allocator, "THIS IS A TEST");
125125
defer splitAllStr.deinit();
126126
const splitAllSlices = try splitAllStr.splitAll(" ");
127127

@@ -155,7 +155,7 @@ test "String Tests" {
155155
// lines
156156
const lineSlice = "Line0\r\nLine1\nLine2";
157157

158-
var lineStr = try String.init_with_contents(std.testing.allocator, lineSlice);
158+
var lineStr = try StringManaged.init_with_contents(std.testing.allocator, lineSlice);
159159
defer lineStr.deinit();
160160
var linesSlice = try lineStr.lines();
161161
defer for (linesSlice) |*str| {
@@ -214,26 +214,26 @@ test "String Tests" {
214214
// try expectEqual(std.os.windows.kernel32.GetConsoleOutputCP(), 65001);
215215
}
216216

217-
test "String init with contents" {
217+
test "StringManaged init with contents" {
218218
const initial_contents = "String with initial contents!";
219219

220220
// This is how we create the String with contents at the start
221-
var myStr = try String.init_with_contents(std.testing.allocator, initial_contents);
221+
var myStr = try StringManaged.init_with_contents(std.testing.allocator, initial_contents);
222222
defer myStr.deinit();
223223
try expectEqualStrings(myStr.str(), initial_contents);
224224
}
225225

226-
test "String startsWith Tests" {
227-
var myString = String.init(std.testing.allocator);
226+
test "StringManaged startsWith Tests" {
227+
var myString = StringManaged.init(std.testing.allocator);
228228
defer myString.deinit();
229229

230230
try myString.concat("bananas");
231231
try expect(myString.startsWith("bana"));
232232
try expect(!myString.startsWith("abc"));
233233
}
234234

235-
test "String endsWith Tests" {
236-
var myString = String.init(std.testing.allocator);
235+
test "StringManaged endsWith Tests" {
236+
var myString = StringManaged.init(std.testing.allocator);
237237
defer myString.deinit();
238238

239239
try myString.concat("asbananas");
@@ -246,9 +246,9 @@ test "String endsWith Tests" {
246246
try expect(myString.endsWith("hello💯"));
247247
}
248248

249-
test "String replace Tests" {
249+
test "StringManaged replace Tests" {
250250
// Create your String
251-
var myString = String.init(std.testing.allocator);
251+
var myString = StringManaged.init(std.testing.allocator);
252252
defer myString.deinit();
253253

254254
try myString.concat("hi,how are you");
@@ -265,27 +265,27 @@ test "String replace Tests" {
265265
try expectEqualStrings(myString.str(), "💯hi💯💯hi💯💯hi💯");
266266
}
267267

268-
test "String rfind Tests" {
269-
var myString = try String.init_with_contents(std.testing.allocator, "💯hi💯💯hi💯💯hi💯");
268+
test "StringManaged rfind Tests" {
269+
var myString = try StringManaged.init_with_contents(std.testing.allocator, "💯hi💯💯hi💯💯hi💯");
270270
defer myString.deinit();
271271

272272
try expectEqual(myString.rfind("hi"), 9);
273273
}
274274

275-
test "String toCapitalized Tests" {
276-
var myString = try String.init_with_contents(std.testing.allocator, "love and be loved");
275+
test "StringManaged toCapitalized Tests" {
276+
var myString = try StringManaged.init_with_contents(std.testing.allocator, "love and be loved");
277277
defer myString.deinit();
278278

279279
myString.toCapitalized();
280280

281281
try expectEqualStrings(myString.str(), "Love And Be Loved");
282282
}
283283

284-
test "String includes Tests" {
285-
var myString = try String.init_with_contents(std.testing.allocator, "love and be loved");
284+
test "StringManaged includes Tests" {
285+
var myString = try StringManaged.init_with_contents(std.testing.allocator, "love and be loved");
286286
defer myString.deinit();
287287

288-
var needle = try String.init_with_contents(std.testing.allocator, "be");
288+
var needle = try StringManaged.init_with_contents(std.testing.allocator, "be");
289289
defer needle.deinit();
290290

291291
try expect(myString.includesLiteral("and"));

zig-string.zig renamed to stringz.zig

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ const assert = std.debug.assert;
33
const builtin = @import("builtin");
44

55
/// A managed variable length collection of characters
6-
pub const String = struct {
6+
pub const StringManaged = struct {
77
/// A variable length collection of characters
88
const Self = @This();
99
/// The internal character buffer

0 commit comments

Comments
 (0)