1pub mod ffi;
2use std::sync::Arc;
3
4pub use ffi::*;
5#[cfg(feature = "ic-stable-structures")]
6pub mod ic;
7macro_rules! buffer_slice_impl {
8 ($t:ty) => {
9 impl R68da167712ddf1601aed7908c99972e62a41bdea1e28b241306a6b58d29e532d for $t {
10 fn read8(&mut self, p0: u64) -> (u32) {
11 return self[p0 as usize].into();
12 }
13
14 fn write8(&mut self, p0: u64, p1: u32) -> () {
15 self[p0 as usize] = (p1 & 0xff) as u8;
16 }
17
18 fn size(&mut self) -> (u64) {
19 return self.len().try_into().unwrap();
20 }
21 }
22 };
23}
24buffer_slice_impl!(Vec<u8>);
25buffer_slice_impl!(Box<[u8]>);
26buffer_slice_impl!(&'static mut [u8]);
27macro_rules! buffer_ro_slice_impl {
28 ($t:ty) => {
29 impl R68da167712ddf1601aed7908c99972e62a41bdea1e28b241306a6b58d29e532d for $t {
30 fn read8(&mut self, p0: u64) -> (u32) {
31 return self[p0 as usize].into();
32 }
33
34 fn write8(&mut self, p0: u64, p1: u32) -> () {
35
36 }
37
38 fn size(&mut self) -> (u64) {
39 return self.len().try_into().unwrap();
40 }
41 }
42 };
43}
44buffer_ro_slice_impl!(Arc<[u8]>);
45buffer_ro_slice_impl!(&'static [u8]);
46pub fn slice<'a>(
47 x: &'a mut dyn R68da167712ddf1601aed7908c99972e62a41bdea1e28b241306a6b58d29e532d,
48) -> impl Iterator<Item = u8> + 'a {
49 return (0..x.size()).map(|a| (x.read8(a) & 0xff) as u8);
50}
51pub fn copy<'a, 'b>(
52 a: &'a mut dyn R68da167712ddf1601aed7908c99972e62a41bdea1e28b241306a6b58d29e532d,
53 ai: u64,
54 b: &'b mut dyn R68da167712ddf1601aed7908c99972e62a41bdea1e28b241306a6b58d29e532d,
55 bi: u64,
56) {
57 let l = (a.size() - ai).min(b.size() - bi);
58 for i in 0..l {
59 a.write8(ai + i, b.read8(bi + i));
60 }
61}
62pub fn copy_slice_in<'a, 'b>(
63 a: &'a mut dyn R68da167712ddf1601aed7908c99972e62a41bdea1e28b241306a6b58d29e532d,
64 ai: u64,
65 b: &'b [u8],
66) {
67 for (i, b) in b.iter().enumerate() {
68 if (i as u64) + ai >= a.size() {
69 return;
70 }
71 a.write8(ai + (i as u64), *b as u32)
72 }
73}
74pub fn copy_slice_out<'a, 'b>(
75 c: &'a mut [u8],
76 b: &'b mut dyn R68da167712ddf1601aed7908c99972e62a41bdea1e28b241306a6b58d29e532d,
77 bi: u64,
78) {
79 for (i, c) in c.iter_mut().enumerate() {
80 if (i as u64) + bi >= b.size() {
81 return;
82 }
83 *c = (b.read8(bi + (i as u64)) & 0xff) as u8;
84 }
85}
86pub struct Slice<T>{
87 pub wrapped: T,
88 pub begin: u64,
89 pub size: u64
90}
91impl<T: R68da167712ddf1601aed7908c99972e62a41bdea1e28b241306a6b58d29e532d> R68da167712ddf1601aed7908c99972e62a41bdea1e28b241306a6b58d29e532d for Slice<T>{
92 fn read8(&mut self, p0: u64) -> (u32) {
93 self.wrapped.read8(p0 + self.begin)
94 }
95
96 fn size(&mut self) -> (u64) {
97 self.size
98 }
99
100 fn write8(&mut self, p0: u64, p1: u32) -> () {
101 self.wrapped.write8(p0 + self.begin, p1)
102 }
103}