multiversx_sc/types/managed/wrapped/
managed_ref.rs1use core::{borrow::Borrow, marker::PhantomData, ops::Deref};
2
3use crate::codec::{
4 EncodeErrorHandler, NestedEncode, NestedEncodeOutput, TopEncode, TopEncodeOutput,
5};
6
7use crate::{api::ManagedTypeApi, types::ManagedType};
8
9pub struct ManagedRef<'a, M, T>
13where
14 M: ManagedTypeApi,
15 T: ManagedType<M>,
16{
17 pub(super) _phantom_m: PhantomData<M>,
18 pub(super) _phantom_t: PhantomData<&'a T>,
19 pub(super) handle: T::OwnHandle,
20}
21
22impl<'a, M, T> ManagedRef<'a, M, T>
23where
24 M: ManagedTypeApi,
25 T: ManagedType<M>,
26{
27 pub fn new(value: &'a T) -> Self {
28 Self {
29 _phantom_m: PhantomData,
30 _phantom_t: PhantomData,
31 handle: value.get_handle(),
32 }
33 }
34
35 #[doc(hidden)]
37 pub unsafe fn wrap_handle(handle: T::OwnHandle) -> Self {
38 Self {
39 _phantom_m: PhantomData,
40 _phantom_t: PhantomData,
41 handle,
42 }
43 }
44
45 #[doc(hidden)]
46 #[inline]
47 pub fn get_raw_handle_of_ref(self) -> T::OwnHandle {
48 self.handle
49 }
50}
51
52impl<M, T> ManagedRef<'_, M, T>
53where
54 M: ManagedTypeApi,
55 T: ManagedType<M> + Clone,
56{
57 pub fn clone_value(&self) -> T {
59 self.deref().clone()
60 }
61}
62
63impl<M, T> ManagedRef<'_, M, T>
64where
65 M: ManagedTypeApi,
66 T: ManagedType<M>,
67{
68 pub fn clone_ref(&self) -> Self {
70 Self {
71 _phantom_m: PhantomData,
72 _phantom_t: PhantomData,
73 handle: self.handle.clone(),
74 }
75 }
76}
77
78impl<M, T> Deref for ManagedRef<'_, M, T>
79where
80 M: ManagedTypeApi,
81 T: ManagedType<M>,
82{
83 type Target = T;
84
85 #[inline]
86 fn deref(&self) -> &Self::Target {
87 Self::Target::transmute_from_handle_ref(&self.handle)
88 }
89}
90
91impl<M, T> Borrow<T> for ManagedRef<'_, M, T>
92where
93 M: ManagedTypeApi,
94 T: ManagedType<M>,
95{
96 #[inline]
97 fn borrow(&self) -> &T {
98 self.deref()
99 }
100}
101
102impl<'a, M, T> From<&'a T> for ManagedRef<'a, M, T>
103where
104 M: ManagedTypeApi,
105 T: ManagedType<M>,
106{
107 #[inline]
108 fn from(value_ref: &'a T) -> Self {
109 Self::new(value_ref)
110 }
111}
112
113impl<M, T> PartialEq for ManagedRef<'_, M, T>
114where
115 M: ManagedTypeApi,
116 T: ManagedType<M> + PartialEq,
117{
118 #[inline]
119 fn eq(&self, other: &Self) -> bool {
120 self.deref() == other.deref()
121 }
122}
123
124impl<M, T> Eq for ManagedRef<'_, M, T>
125where
126 M: ManagedTypeApi,
127 T: ManagedType<M> + PartialEq,
128{
129}
130
131impl<M, T> TopEncode for ManagedRef<'_, M, T>
132where
133 M: ManagedTypeApi,
134 T: ManagedType<M> + TopEncode,
135{
136 #[inline]
137 fn top_encode_or_handle_err<O, H>(&self, output: O, h: H) -> Result<(), H::HandledErr>
138 where
139 O: TopEncodeOutput,
140 H: EncodeErrorHandler,
141 {
142 self.deref().top_encode_or_handle_err(output, h)
143 }
144}
145
146impl<M, T> NestedEncode for ManagedRef<'_, M, T>
147where
148 M: ManagedTypeApi,
149 T: ManagedType<M> + NestedEncode,
150{
151 #[inline]
152 fn dep_encode_or_handle_err<O, H>(&self, dest: &mut O, h: H) -> Result<(), H::HandledErr>
153 where
154 O: NestedEncodeOutput,
155 H: EncodeErrorHandler,
156 {
157 self.deref().dep_encode_or_handle_err(dest, h)
158 }
159}
160
161impl<M, T> core::fmt::Debug for ManagedRef<'_, M, T>
162where
163 M: ManagedTypeApi,
164 T: ManagedType<M> + core::fmt::Debug,
165{
166 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
167 f.debug_tuple("ManagedRef").field(self.deref()).finish()
168 }
169}