| ... | ... | @@ -1017,7 +1017,7 @@ fn lenSliceTo(ptr: anytype, comptime end: std.meta.Elem(@TypeOf(ptr))) usize { |
| 1017 | 1017 | return indexOfSentinel(array_info.child, end, ptr); |
| 1018 | 1018 | } |
| 1019 | 1019 | } |
| 1020 | | return indexOfScalar(array_info.child, ptr, end) orelse array_info.len; |
| 1020 | return findScalar(array_info.child, ptr, end) orelse array_info.len; |
| 1021 | 1021 | }, |
| 1022 | 1022 | else => {}, |
| 1023 | 1023 | }, |
| ... | ... | @@ -1042,7 +1042,7 @@ fn lenSliceTo(ptr: anytype, comptime end: std.meta.Elem(@TypeOf(ptr))) usize { |
| 1042 | 1042 | return indexOfSentinel(ptr_info.child, s, ptr); |
| 1043 | 1043 | } |
| 1044 | 1044 | } |
| 1045 | | return indexOfScalar(ptr_info.child, ptr, end) orelse ptr.len; |
| 1045 | return findScalar(ptr_info.child, ptr, end) orelse ptr.len; |
| 1046 | 1046 | }, |
| 1047 | 1047 | }, |
| 1048 | 1048 | else => {}, |
| ... | ... | @@ -1229,7 +1229,7 @@ pub fn allEqual(comptime T: type, slice: []const T, scalar: T) bool { |
| 1229 | 1229 | /// Remove a set of values from the beginning of a slice. |
| 1230 | 1230 | pub fn trimStart(comptime T: type, slice: []const T, values_to_strip: []const T) []const T { |
| 1231 | 1231 | var begin: usize = 0; |
| 1232 | | while (begin < slice.len and indexOfScalar(T, values_to_strip, slice[begin]) != null) : (begin += 1) {} |
| 1232 | while (begin < slice.len and findScalar(T, values_to_strip, slice[begin]) != null) : (begin += 1) {} |
| 1233 | 1233 | return slice[begin..]; |
| 1234 | 1234 | } |
| 1235 | 1235 | |
| ... | ... | @@ -1243,7 +1243,7 @@ pub const trimLeft = trimStart; |
| 1243 | 1243 | /// Remove a set of values from the end of a slice. |
| 1244 | 1244 | pub fn trimEnd(comptime T: type, slice: []const T, values_to_strip: []const T) []const T { |
| 1245 | 1245 | var end: usize = slice.len; |
| 1246 | | while (end > 0 and indexOfScalar(T, values_to_strip, slice[end - 1]) != null) : (end -= 1) {} |
| 1246 | while (end > 0 and findScalar(T, values_to_strip, slice[end - 1]) != null) : (end -= 1) {} |
| 1247 | 1247 | return slice[0..end]; |
| 1248 | 1248 | } |
| 1249 | 1249 | |
| ... | ... | @@ -1258,8 +1258,8 @@ pub const trimRight = trimEnd; |
| 1258 | 1258 | pub fn trim(comptime T: type, slice: []const T, values_to_strip: []const T) []const T { |
| 1259 | 1259 | var begin: usize = 0; |
| 1260 | 1260 | var end: usize = slice.len; |
| 1261 | | while (begin < end and indexOfScalar(T, values_to_strip, slice[begin]) != null) : (begin += 1) {} |
| 1262 | | while (end > begin and indexOfScalar(T, values_to_strip, slice[end - 1]) != null) : (end -= 1) {} |
| 1261 | while (begin < end and findScalar(T, values_to_strip, slice[begin]) != null) : (begin += 1) {} |
| 1262 | while (end > begin and findScalar(T, values_to_strip, slice[end - 1]) != null) : (end -= 1) {} |
| 1263 | 1263 | return slice[begin..end]; |
| 1264 | 1264 | } |
| 1265 | 1265 | |
| ... | ... | @@ -3145,15 +3145,15 @@ test cutSuffix { |
| 3145 | 3145 | try testing.expectEqual(null, cutSuffix(u8, "foobar", "baz")); |
| 3146 | 3146 | } |
| 3147 | 3147 | |
| 3148 | | /// Returns slice of `haystack` before and after `needle`, or `null` if not |
| 3149 | | /// found. |
| 3148 | /// Returns slice of `haystack` before and after first occurrence of `needle`, |
| 3149 | /// or `null` if not found. |
| 3150 | 3150 | /// |
| 3151 | 3151 | /// See also: |
| 3152 | 3152 | /// * `cutScalar` |
| 3153 | 3153 | /// * `split` |
| 3154 | 3154 | /// * `tokenizeAny` |
| 3155 | 3155 | pub fn cut(comptime T: type, haystack: []const T, needle: []const T) ?struct { []const T, []const T } { |
| 3156 | | const index = indexOf(T, haystack, needle) orelse return null; |
| 3156 | const index = find(T, haystack, needle) orelse return null; |
| 3157 | 3157 | return .{ haystack[0..index], haystack[index + needle.len ..] }; |
| 3158 | 3158 | } |
| 3159 | 3159 | |
| ... | ... | @@ -3164,15 +3164,33 @@ test cut { |
| 3164 | 3164 | try testing.expectEqualStrings(" c", after); |
| 3165 | 3165 | } |
| 3166 | 3166 | |
| 3167 | | /// Returns slice of `haystack` before and after `needle`, or `null` if not |
| 3168 | | /// found. |
| 3167 | /// Returns slice of `haystack` before and after last occurrence of `needle`, |
| 3168 | /// or `null` if not found. |
| 3169 | /// |
| 3170 | /// See also: |
| 3171 | /// * `cut` |
| 3172 | /// * `cutScalarLast` |
| 3173 | pub fn cutLast(comptime T: type, haystack: []const T, needle: []const T) ?struct { []const T, []const T } { |
| 3174 | const index = findLast(T, haystack, needle) orelse return null; |
| 3175 | return .{ haystack[0..index], haystack[index + needle.len ..] }; |
| 3176 | } |
| 3177 | |
| 3178 | test cutLast { |
| 3179 | try testing.expectEqual(null, cutLast(u8, "a b c", "B")); |
| 3180 | const before, const after = cutLast(u8, "a be c be d", "be") orelse return error.TestFailed; |
| 3181 | try testing.expectEqualStrings("a be c ", before); |
| 3182 | try testing.expectEqualStrings(" d", after); |
| 3183 | } |
| 3184 | |
| 3185 | /// Returns slice of `haystack` before and after first occurrence `needle`, or |
| 3186 | /// `null` if not found. |
| 3169 | 3187 | /// |
| 3170 | 3188 | /// See also: |
| 3171 | 3189 | /// * `cut` |
| 3172 | 3190 | /// * `splitScalar` |
| 3173 | 3191 | /// * `tokenizeScalar` |
| 3174 | 3192 | pub fn cutScalar(comptime T: type, haystack: []const T, needle: T) ?struct { []const T, []const T } { |
| 3175 | | const index = indexOfScalar(T, haystack, needle) orelse return null; |
| 3193 | const index = findScalar(T, haystack, needle) orelse return null; |
| 3176 | 3194 | return .{ haystack[0..index], haystack[index + 1 ..] }; |
| 3177 | 3195 | } |
| 3178 | 3196 | |
| ... | ... | @@ -3183,6 +3201,25 @@ test cutScalar { |
| 3183 | 3201 | try testing.expectEqualStrings(" c", after); |
| 3184 | 3202 | } |
| 3185 | 3203 | |
| 3204 | /// Returns slice of `haystack` before and after last occurrence of `needle`, |
| 3205 | /// or `null` if not found. |
| 3206 | /// |
| 3207 | /// See also: |
| 3208 | /// * `cut` |
| 3209 | /// * `splitScalar` |
| 3210 | /// * `tokenizeScalar` |
| 3211 | pub fn cutScalarLast(comptime T: type, haystack: []const T, needle: T) ?struct { []const T, []const T } { |
| 3212 | const index = findScalarLast(T, haystack, needle) orelse return null; |
| 3213 | return .{ haystack[0..index], haystack[index + 1 ..] }; |
| 3214 | } |
| 3215 | |
| 3216 | test cutScalarLast { |
| 3217 | try testing.expectEqual(null, cutScalarLast(u8, "a b c", 'B')); |
| 3218 | const before, const after = cutScalarLast(u8, "a b c b d", 'b') orelse return error.TestFailed; |
| 3219 | try testing.expectEqualStrings("a b c ", before); |
| 3220 | try testing.expectEqualStrings(" d", after); |
| 3221 | } |
| 3222 | |
| 3186 | 3223 | /// Delimiter type for tokenization and splitting operations. |
| 3187 | 3224 | pub const DelimiterType = enum { sequence, any, scalar }; |
| 3188 | 3225 | |