-
Notifications
You must be signed in to change notification settings - Fork 96
/
Copy pathfixedarray_block.mbt
83 lines (80 loc) · 2.47 KB
/
fixedarray_block.mbt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// Copyright 2025 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.
///|
/// Copies a slice of elements from one fixed array to another.
///
/// This function copies `len` elements from `src` starting at `src_offset` to `dst` starting at `dst_offset`.
/// The arrays may overlap, in which case the copy is performed in a way that preserves the data.
///
/// # Example
/// ```
/// let src = FixedArray::from_array([1, 2, 3, 4, 5])
/// let dst = FixedArray::from_array([0, 0, 0, 0, 0])
/// FixedArray::unsafe_blit(dst, 0, src, 0, 3)
/// assert_eq!(dst, FixedArray::from_array([1, 2, 3, 0, 0]))
/// ```
///
/// The behavior is undefined and platform-specific if:
/// - `len < 0`
/// - `src_offset < 0`
/// - `dst_offset < 0`
/// - `dst_offset + len > dst.length()`
/// - `src_offset + len > src.length()`
///
/// @intrinsic %fixedarray.copy
pub fn FixedArray::unsafe_blit[A](
dst : FixedArray[A],
dst_offset : Int,
src : FixedArray[A],
src_offset : Int,
len : Int
) -> Unit {
if physical_equal(dst, src) && dst_offset < src_offset {
for i = 0; i < len; i = i + 1 {
dst[dst_offset + i] = src[src_offset + i]
}
} else {
for i = len - 1; i >= 0; i = i - 1 {
dst[dst_offset + i] = src[src_offset + i]
}
}
}
///|
/// @intrinsic %fixedarray.copy
/// This is the same as `unsafe_blit`, but it is used when the source array is
/// FixedArray[T] instead of UninitializedArray[T].
fn UninitializedArray::unsafe_blit_fixed[T](
dst : UninitializedArray[T],
dst_offset : Int,
src : FixedArray[T],
src_offset : Int,
len : Int
) -> Unit {
for i = len - 1; i >= 0; i = i - 1 {
dst[dst_offset + i] = src[src_offset + i]
}
}
///|
pub fn FixedArray::blit_to[A](
self : FixedArray[A],
dst : FixedArray[A],
len~ : Int,
src_offset~ : Int = 0,
dst_offset~ : Int = 0
) -> Unit {
if dst_offset + len > dst.length() || src_offset + len > self.length() {
panic()
}
FixedArray::unsafe_blit(dst, dst_offset, self, src_offset, len)
}