1use std::borrow::Borrow;
2use std::fmt;
3use std::marker::PhantomData;
4use std::ops::Deref;
5use std::rc::{Rc, Weak as RcWeak};
6use std::sync::{Arc, Weak as ArcWeak};
7
8use serde::de::{Error as _, Visitor};
9
10use crate::anchor_store;
11
12
13#[repr(transparent)]
36#[derive(Clone)]
37pub struct RcAnchor<T>(pub Rc<T>);
38
39#[repr(transparent)]
61#[derive(Clone)]
62pub struct ArcAnchor<T>(pub Arc<T>);
63
64#[repr(transparent)]
90#[derive(Clone)]
91pub struct RcWeakAnchor<T>(pub RcWeak<T>);
92
93#[repr(transparent)]
116#[derive(Clone)]
117pub struct ArcWeakAnchor<T>(pub ArcWeak<T>);
118
119impl<T> From<Rc<T>> for RcAnchor<T> {
122 fn from(rc: Rc<T>) -> Self { RcAnchor(rc) }
123
124}
125
126impl <T> RcAnchor<T> {
127 pub fn wrapping(x: T) -> Self {
129 RcAnchor(Rc::new(x))
130 }
131}
132
133impl <T> ArcAnchor<T> {
134 pub fn wrapping(x: T) -> Self {
136 ArcAnchor(Arc::new(x))
137 }
138}
139
140impl<T> From<Arc<T>> for ArcAnchor<T> {
141 #[inline]
142 fn from(arc: Arc<T>) -> Self { ArcAnchor(arc) }
143}
144
145impl<T> From<&Rc<T>> for RcWeakAnchor<T> {
148 #[inline]
149 fn from(rc: &Rc<T>) -> Self { RcWeakAnchor(Rc::downgrade(rc)) }
150}
151impl<T> From<Rc<T>> for RcWeakAnchor<T> {
152 #[inline]
153 fn from(rc: Rc<T>) -> Self { RcWeakAnchor(Rc::downgrade(&rc)) }
154}
155impl<T> From<&RcAnchor<T>> for RcWeakAnchor<T> {
156 #[inline]
157 fn from(rca: &RcAnchor<T>) -> Self { RcWeakAnchor(Rc::downgrade(&rca.0)) }
158}
159impl<T> From<&Arc<T>> for ArcWeakAnchor<T> {
160 #[inline]
161 fn from(arc: &Arc<T>) -> Self { ArcWeakAnchor(Arc::downgrade(arc)) }
162}
163impl<T> From<Arc<T>> for ArcWeakAnchor<T> {
164 #[inline]
165 fn from(arc: Arc<T>) -> Self { ArcWeakAnchor(Arc::downgrade(&arc)) }
166}
167impl<T> From<&ArcAnchor<T>> for ArcWeakAnchor<T> {
168 #[inline]
169 fn from(ara: &ArcAnchor<T>) -> Self { ArcWeakAnchor(Arc::downgrade(&ara.0)) }
170}
171
172impl<T> Deref for RcAnchor<T> {
175 type Target = Rc<T>;
176 #[inline]
177 fn deref(&self) -> &Self::Target { &self.0 }
178}
179impl<T> Deref for ArcAnchor<T> {
180 type Target = Arc<T>;
181 #[inline]
182 fn deref(&self) -> &Self::Target { &self.0 }
183}
184impl<T> AsRef<Rc<T>> for RcAnchor<T> {
185 #[inline]
186 fn as_ref(&self) -> &Rc<T> { &self.0 }
187}
188impl<T> AsRef<Arc<T>> for ArcAnchor<T> {
189 #[inline]
190 fn as_ref(&self) -> &Arc<T> { &self.0 }
191}
192impl<T> Borrow<Rc<T>> for RcAnchor<T> {
193 #[inline]
194 fn borrow(&self) -> &Rc<T> { &self.0 }
195}
196impl<T> Borrow<Arc<T>> for ArcAnchor<T> {
197 #[inline]
198 fn borrow(&self) -> &Arc<T> { &self.0 }
199}
200impl<T> From<RcAnchor<T>> for Rc<T> {
201 #[inline]
202 fn from(a: RcAnchor<T>) -> Rc<T> { a.0 }
203}
204impl<T> From<ArcAnchor<T>> for Arc<T> {
205 #[inline]
206 fn from(a: ArcAnchor<T>) -> Arc<T> { a.0 }
207}
208
209impl<T> RcWeakAnchor<T> {
212 #[inline]
215 pub fn upgrade(&self) -> Option<Rc<T>> { self.0.upgrade() }
216
217 #[inline]
219 pub fn is_dangling(&self) -> bool { self.0.strong_count() == 0 }
220}
221impl<T> ArcWeakAnchor<T> {
222 #[inline]
225 pub fn upgrade(&self) -> Option<Arc<T>> { self.0.upgrade() }
226
227 #[inline]
229 pub fn is_dangling(&self) -> bool { self.0.strong_count() == 0 }
230}
231
232impl<T> PartialEq for RcAnchor<T> {
235 #[inline]
236 fn eq(&self, other: &Self) -> bool { Rc::ptr_eq(&self.0, &other.0) }
237}
238impl<T> Eq for RcAnchor<T> {}
239
240impl<T> PartialEq for ArcAnchor<T> {
241 #[inline]
242 fn eq(&self, other: &Self) -> bool { Arc::ptr_eq(&self.0, &other.0) }
243}
244impl<T> Eq for ArcAnchor<T> {}
245
246impl<T> PartialEq for RcWeakAnchor<T> {
247 #[inline]
248 fn eq(&self, other: &Self) -> bool {
249 match (self.0.upgrade(), other.0.upgrade()) {
250 (Some(a), Some(b)) => Rc::ptr_eq(&a, &b),
251 (None, None) => true,
252 _ => false,
253 }
254 }
255}
256impl<T> Eq for RcWeakAnchor<T> {}
257
258impl<T> PartialEq for ArcWeakAnchor<T> {
259 #[inline]
260 fn eq(&self, other: &Self) -> bool {
261 match (self.0.upgrade(), other.0.upgrade()) {
262 (Some(a), Some(b)) => Arc::ptr_eq(&a, &b),
263 (None, None) => true,
264 _ => false,
265 }
266 }
267}
268impl<T> Eq for ArcWeakAnchor<T> {}
269
270impl<T> fmt::Debug for RcAnchor<T> {
273 #[inline]
274 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
275 write!(f, "RcAnchor({:p})", Rc::as_ptr(&self.0))
276 }
277}
278impl<T> fmt::Debug for ArcAnchor<T> {
279 #[inline]
280 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
281 write!(f, "ArcAnchor({:p})", Arc::as_ptr(&self.0))
282 }
283}
284impl<T> fmt::Debug for RcWeakAnchor<T> {
285 #[inline]
286 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
287 if let Some(rc) = self.0.upgrade() {
288 write!(f, "RcWeakAnchor(upgrade={:p})", Rc::as_ptr(&rc))
289 } else {
290 write!(f, "RcWeakAnchor(dangling)")
291 }
292 }
293}
294impl<T> fmt::Debug for ArcWeakAnchor<T> {
295 #[inline]
296 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
297 if let Some(arc) = self.0.upgrade() {
298 write!(f, "ArcWeakAnchor(upgrade={:p})", Arc::as_ptr(&arc))
299 } else {
300 write!(f, "ArcWeakAnchor(dangling)")
301 }
302 }
303}
304
305impl<T: Default> Default for RcAnchor<T> {
308 #[inline]
309 fn default() -> Self { RcAnchor(Rc::new(T::default())) }
310}
311impl<T: Default> Default for ArcAnchor<T> {
312 fn default() -> Self { ArcAnchor(Arc::new(T::default())) }
313}
314
315impl<'de, T> serde::de::Deserialize<'de> for RcAnchor<T>
319where
320 T: serde::de::Deserialize<'de> + 'static,
321{
322 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
323 where
324 D: serde::de::Deserializer<'de>,
325 {
326 struct RcAnchorVisitor<T>(PhantomData<T>);
327
328 impl<'de, T> Visitor<'de> for RcAnchorVisitor<T>
329 where
330 T: serde::de::Deserialize<'de> + 'static,
331 {
332 type Value = RcAnchor<T>;
333
334 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
335 f.write_str("an RcAnchor newtype")
336 }
337
338 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
339 where
340 D: serde::de::Deserializer<'de>,
341 {
342 let anchor_id = anchor_store::current_rc_anchor();
343 let existing = match anchor_id {
344 Some(id) => Some((id, anchor_store::get_rc::<T>(id).map_err(D::Error::custom)?)),
345 None => None,
346 };
347
348 let value = T::deserialize(deserializer)?;
349 if let Some((_, Some(rc))) = existing {
350 drop(value);
351 return Ok(RcAnchor(rc));
352 }
353 if let Some((id, None)) = existing {
354 let rc = Rc::new(value);
355 anchor_store::store_rc(id, rc.clone());
356 return Ok(RcAnchor(rc));
357 }
358 Ok(RcAnchor(Rc::new(value)))
359 }
360 }
361
362 deserializer.deserialize_newtype_struct("__yaml_rc_anchor", RcAnchorVisitor(PhantomData))
363 }
364}
365
366impl<'de, T> serde::de::Deserialize<'de> for ArcAnchor<T>
367where
368 T: serde::de::Deserialize<'de> + Send + Sync + 'static,
369{
370 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
371 where
372 D: serde::de::Deserializer<'de>,
373 {
374 struct ArcAnchorVisitor<T>(PhantomData<T>);
375
376 impl<'de, T> Visitor<'de> for ArcAnchorVisitor<T>
377 where
378 T: serde::de::Deserialize<'de> + Send + Sync + 'static,
379 {
380 type Value = ArcAnchor<T>;
381
382 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
383 f.write_str("an ArcAnchor newtype")
384 }
385
386 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
387 where
388 D: serde::de::Deserializer<'de>,
389 {
390 let anchor_id = anchor_store::current_arc_anchor();
391 let existing = match anchor_id {
392 Some(id) => Some((id, anchor_store::get_arc::<T>(id).map_err(D::Error::custom)?)),
393 None => None,
394 };
395
396 let value = T::deserialize(deserializer)?;
397 if let Some((_, Some(arc))) = existing {
398 drop(value);
399 return Ok(ArcAnchor(arc));
400 }
401 if let Some((id, None)) = existing {
402 let arc = Arc::new(value);
403 anchor_store::store_arc(id, arc.clone());
404 return Ok(ArcAnchor(arc));
405 }
406 Ok(ArcAnchor(Arc::new(value)))
407 }
408 }
409
410 deserializer.deserialize_newtype_struct("__yaml_arc_anchor", ArcAnchorVisitor(PhantomData))
411 }
412}
413
414impl<'de, T> serde::de::Deserialize<'de> for RcWeakAnchor<T>
418where
419 T: serde::de::Deserialize<'de> + 'static,
420{
421 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
422 where
423 D: serde::de::Deserializer<'de>,
424 {
425 struct RcWeakVisitor<T>(PhantomData<T>);
426 impl<'de, T> Visitor<'de> for RcWeakVisitor<T>
427 where
428 T: serde::de::Deserialize<'de> + 'static,
429 {
430 type Value = RcWeakAnchor<T>;
431 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
432 f.write_str("an RcWeakAnchor referring to a previously defined strong anchor (via alias)")
433 }
434 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
435 where
436 D: serde::de::Deserializer<'de>,
437 {
438 let id = anchor_store::current_rc_anchor().ok_or_else(|| D::Error::custom("weak Rc anchor must refer to an existing strong anchor via alias"))?;
440 let _ = <serde::de::IgnoredAny as serde::de::Deserialize>::deserialize(deserializer)?;
442 match anchor_store::get_rc::<T>(id).map_err(D::Error::custom)? {
444 Some(rc) => Ok(RcWeakAnchor(Rc::downgrade(&rc))),
445 None => Err(D::Error::custom("weak Rc anchor refers to unknown anchor id; strong anchor must be defined before weak")),
446 }
447 }
448 }
449 deserializer.deserialize_newtype_struct("__yaml_rc_weak_anchor", RcWeakVisitor(PhantomData))
450 }
451}
452
453impl<'de, T> serde::de::Deserialize<'de> for ArcWeakAnchor<T>
454where
455 T: serde::de::Deserialize<'de> + Send + Sync + 'static,
456{
457 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
458 where
459 D: serde::de::Deserializer<'de>,
460 {
461 struct ArcWeakVisitor<T>(PhantomData<T>);
462 impl<'de, T> Visitor<'de> for ArcWeakVisitor<T>
463 where
464 T: serde::de::Deserialize<'de> + Send + Sync + 'static,
465 {
466 type Value = ArcWeakAnchor<T>;
467 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
468 f.write_str("an ArcWeakAnchor referring to a previously defined strong anchor (via alias)")
469 }
470 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
471 where
472 D: serde::de::Deserializer<'de>,
473 {
474 let id = anchor_store::current_arc_anchor().ok_or_else(|| D::Error::custom("weak Arc anchor must refer to an existing strong anchor via alias"))?;
475 let _ = <serde::de::IgnoredAny as serde::de::Deserialize>::deserialize(deserializer)?;
477 match anchor_store::get_arc::<T>(id).map_err(D::Error::custom)? {
478 Some(arc) => Ok(ArcWeakAnchor(Arc::downgrade(&arc))),
479 None => Err(D::Error::custom("weak Arc anchor refers to unknown anchor id; strong anchor must be defined before weak")),
480 }
481 }
482 }
483 deserializer.deserialize_newtype_struct("__yaml_arc_weak_anchor", ArcWeakVisitor(PhantomData))
484 }
485}
486
487