essential_vm/
op_access.rs1use crate::{asm::TryFromBytes, bytecode::BytecodeMapped};
4use std::sync::Arc;
5
6pub trait OpAccess: Clone + Send + Sync {
10 type Op;
12 type Error: core::fmt::Debug + core::fmt::Display + Send;
14 fn op_access(&self, index: usize) -> Option<Result<Self::Op, Self::Error>>;
20}
21
22impl<Op> OpAccess for &[Op]
23where
24 Op: Clone + Send + Sync,
25{
26 type Op = Op;
27 type Error = core::convert::Infallible;
28 fn op_access(&self, index: usize) -> Option<Result<Self::Op, Self::Error>> {
29 self.get(index).cloned().map(Ok)
30 }
31}
32
33impl<Op, Bytes> OpAccess for &BytecodeMapped<Op, Bytes>
34where
35 Op: TryFromBytes + Send + Sync,
36 Bytes: core::ops::Deref<Target = [u8]> + Send + Sync,
37{
38 type Op = Op;
39 type Error = core::convert::Infallible;
40 fn op_access(&self, index: usize) -> Option<Result<Self::Op, Self::Error>> {
41 self.op(index).map(Ok)
42 }
43}
44
45impl<T> OpAccess for Arc<T>
46where
47 T: OpAccess,
48{
49 type Op = T::Op;
50 type Error = T::Error;
51 fn op_access(&self, index: usize) -> Option<Result<Self::Op, Self::Error>> {
52 (**self).op_access(index)
53 }
54}