added: `dyn_str` type ([..] u8)
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 7 Mar 2023 20:13:13 +0000 (14:13 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 7 Mar 2023 20:13:13 +0000 (14:13 -0600)
core/builtin.onyx
core/container/array.onyx
core/string/string.onyx

index d809e2b87154823c59b6a652672d7210edd5efc7..af99c4ca7b80bcedc25b0438b61c1c19f369564a 100644 (file)
@@ -26,8 +26,9 @@ package builtin
 // The builtin string and C-string types.
 // A string is simply a slice of bytes, and a c-string is a pointer
 // to byte, with a null-terminator ('\0') at the end.
-str  :: #type [] u8;
-cstr :: #type  & u8;
+str     :: #type   [] u8;
+cstr    :: #type    & u8;
+dyn_str :: #type [..] u8;
 
 
 
index 0a55bfaf8830fa057bff5325cbc50c1d6b9970c2..9a6cb4baaf9bdc203ab3be49647d82bdfadabfeb 100644 (file)
@@ -116,6 +116,9 @@ push :: (arr: &[..] $T, x: T) -> bool {
 // Semi-useful shortcut for adding something to an array.
 #operator << macro (arr: [..] $T, v: T) do core.array.push(&arr, v);
 
+insert :: #match #local {}
+
+#overload
 insert :: (arr: &[..] $T, idx: u32, x: T) -> bool {
     if !ensure_capacity(arr, arr.count + 1) do return false;
 
@@ -129,6 +132,22 @@ insert :: (arr: &[..] $T, idx: u32, x: T) -> bool {
     return true;
 }
 
+#overload
+insert :: (arr: &[..] $T, idx: u32, new_arr: [] T) -> bool {
+    if !ensure_capacity(arr, arr.count + new_arr.count) do return false;
+
+    arr.count += new_arr.count;
+    while i := arr.count; i > idx {
+        arr.data[i] = arr.data[i - 1];
+        i -= 1;
+    }
+
+    for i: 0 .. new_arr.count {
+        arr.data[i + idx] = new_arr[i];
+    }
+    return true;
+}
+
 insert_empty :: (arr: &[..] $T, idx: u32) -> bool {
     if !ensure_capacity(arr, arr.count + 1) do return false;
 
@@ -176,10 +195,11 @@ fast_delete :: (arr: &[..] $T, idx: u32) -> T {
     return to_return;
 }
 
-pop :: (arr: &[..] $T) -> T {
+pop :: (arr: &[..] $T, n := 1) -> T {
     if arr.count == 0 do return .{};
 
-    arr.count -= 1;
+    c := core.math.min(n, arr.count);
+    arr.count -= n;
     return arr.data[arr.count];
 }
 
index 0b1b465bf16b9cacf7a0d46f7311f75cefa8887f..425d1c5c0778c767ec721c214ec14c587323a461 100644 (file)
@@ -644,3 +644,9 @@ bisect :: (s: str, substr: str) -> (str, str) {
     return s[0 .. index], s[index+substr.length .. s.length];
 }
 
+// Used by dyn_str
+delete  :: core.array.delete
+append  :: core.array.concat
+clear   :: core.array.clear
+retreat :: core.array.pop
+insert  :: core.array.insert