diff --git a/lib/Slice.bux b/lib/Slice.bux new file mode 100644 index 0000000..8598c76 --- /dev/null +++ b/lib/Slice.bux @@ -0,0 +1,31 @@ +module Std::Slice { + +extern func bux_bounds_check(index: uint, len: uint); + +struct Slice { + data: *T, + len: uint, +} + +func Slice_FromArray(arr: *Array) -> Slice { + var s: Slice; + s.data = arr.data; + s.len = arr.len; + return s; +} + +func Slice_Get(self: *Slice, idx: uint) -> T { + bux_bounds_check(idx, self.len); + return self.data[idx]; +} + +func Slice_Set(self: *Slice, idx: uint, value: T) { + bux_bounds_check(idx, self.len); + self.data[idx] = value; +} + +func Slice_Len(self: *Slice) -> uint { + return self.len; +} + +} diff --git a/src/c_backend.bux b/src/c_backend.bux index 8396c46..2d7e7b1 100644 --- a/src/c_backend.bux +++ b/src/c_backend.bux @@ -683,6 +683,7 @@ func CBE_IsGenericTypeName(name: String) -> bool { if String_Eq(name, "MapEntry") || String_Eq(name, "MapEntry*") { return true; } if String_Eq(name, "StringMap") || String_Eq(name, "StringMap*") { return true; } if String_Eq(name, "StringMapEntry") || String_Eq(name, "StringMapEntry*") { return true; } + if String_Eq(name, "Slice") || String_Eq(name, "Slice*") { return true; } return false; }