Skip to content

Commit

Permalink
Add BytesView
Browse files Browse the repository at this point in the history
This is a 1:1 clone of VecView
  • Loading branch information
fantix committed Jun 24, 2024
1 parent 70f9c53 commit 883bf66
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 0 deletions.
10 changes: 10 additions & 0 deletions builtin/builtin.mbti
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,15 @@ impl Buffer {
write_sub_string(Self, String, Int, Int) -> Unit
}

type BytesView
impl BytesView {
length(Self) -> Int
op_as_view(Self, ~start : Int, ~end : Int) -> Self
op_get(Self, Int) -> Byte
op_set(Self, Int, Byte) -> Unit
swap(Self, Int, Int) -> Unit
}

type Iter
impl Iter {
_unstable_internal_make[T](((T) -> Bool) -> Bool) -> Self[T]
Expand Down Expand Up @@ -343,6 +352,7 @@ impl Bytes {
length(Bytes) -> Int
make(Int, ~init : Byte = ..) -> Bytes
of_string(String) -> Bytes
op_as_view(Bytes, ~start : Int, ~end : Int) -> BytesView
op_get(Bytes, Int) -> Byte
op_set(Bytes, Int, Byte) -> Unit
set_utf16_char(Bytes, Int, Char) -> Int
Expand Down
78 changes: 78 additions & 0 deletions builtin/bytesview.mbt
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
// Copyright 2024 International Digital Economy Academy
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/// A `BytesView` is a slice of a `Bytes`.
struct BytesView {
buf : Bytes
start : Int
len : Int
}

pub fn length(self : BytesView) -> Int {
self.len
}

pub fn op_get(self : BytesView, index : Int) -> Byte {
if index < 0 || index >= self.len {
let len = self.len
abort(
"index out of bounds: the len is from 0 to \(len) but the index is \(index)",
)
}
self.buf[self.start + index]
}

pub fn op_set(self : BytesView, index : Int, value : Byte) -> Unit {
if index < 0 || index >= self.len {
let len = self.len
abort(
"index out of bounds: the len is from 0 to \(len) but the index is \(index)",
)
}
self.buf[self.start + index] = value
}

pub fn swap(self : BytesView, i : Int, j : Int) -> Unit {
if i >= self.len || j >= self.len || i < 0 || j < 0 {
let len = self.len
abort(
"index out of bounds: the len is from 0 to \(len) but the index is (\(i), \(j))",
)
}
let temp = self.buf[self.start + i]
self.buf[self.start + i] = self.buf[self.start + j]
self.buf[self.start + j] = temp
}

pub fn op_as_view(self : Bytes, ~start : Int, ~end : Int) -> BytesView {
if start < 0 {
abort("Slice start index out of bounds")
} else if end > self.length() {
abort("Slice end index out of bounds")
} else if start > end {
abort("Slice start index greater than end index")
}
BytesView::{ buf: self, start, len: end - start }
}

pub fn op_as_view(self : BytesView, ~start : Int, ~end : Int) -> BytesView {
if start < 0 {
abort("Slice start index out of bounds")
} else if end > self.len {
abort("Slice end index out of bounds")
} else if start > end {
abort("Slice start index greater than end index")
}
BytesView::{ buf: self.buf, start: self.start + start, len: end - start }
}

0 comments on commit 883bf66

Please sign in to comment.