libreda_db/
blanket_impl.rs

1// SPDX-FileCopyrightText: 2023 Thomas Kramer
2//
3// SPDX-License-Identifier: AGPL-3.0-or-later
4
5//! Blanket implementations of hierarchy traits for reference types, `Rc`, `Arc` and `Box`.
6
7use super::traits::*;
8use std::rc::Rc;
9use std::sync::Arc;
10
11macro_rules! blanket {
12    ($type:ty, $trait:ident) => {
13        #[portrait::fill(portrait::delegate(T; *self))]
14        impl<T> $trait for $type where T: $trait {}
15    };
16}
17
18macro_rules! blanket_ids {
19    ($type:ty, $trait:ident) => {
20        #[portrait::fill(portrait::delegate(T))]
21        impl<T> $trait for $type where T: $trait {}
22    };
23}
24
25macro_rules! blanket_id_impls {
26    ($trait:ident) => {
27        blanket_ids!(&T, $trait);
28        blanket_ids!(&mut T, $trait);
29        blanket_ids!(Rc<T>, $trait);
30        blanket_ids!(Arc<T>, $trait);
31        blanket_ids!(Box<T>, $trait);
32    };
33}
34
35macro_rules! blanket_impls {
36    ($trait:ident) => {
37        blanket!(&T, $trait);
38        blanket!(&mut T, $trait);
39        blanket!(Rc<T>, $trait);
40        blanket!(Arc<T>, $trait);
41        blanket!(Box<T>, $trait);
42    };
43}
44
45macro_rules! blanket_impls_mut {
46    ($trait:ident) => {
47        blanket!(&mut T, $trait);
48        blanket!(Box<T>, $trait);
49    };
50}
51
52blanket_id_impls!(HierarchyIds);
53blanket_impls!(HierarchyBase);
54blanket_impls_mut!(HierarchyEdit);
55
56blanket_id_impls!(NetlistIds);
57blanket_impls!(NetlistBase);
58blanket_impls_mut!(NetlistEdit);
59
60blanket_id_impls!(LayoutIds);
61blanket_impls!(LayoutBase);
62blanket_impls_mut!(LayoutEdit);
63
64blanket_impls!(L2NBase);
65blanket_impls_mut!(L2NEdit);