Skip to main content

script/dom/bindings/
like.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5//! Implementation of `setlike<...>` and `maplike<..., ...>` WebIDL declarations.
6
7/// Usage:
8/// ```rust
9/// pub(crate) struct TestBindingSetlike {
10///     // setlike<DOMString>
11///     internal: DomRefCell<IndexSet<DOMString>>,
12/// }
13/// impl Setlike for TestBindingSetlike {
14///     type Key = DOMString;
15///     setlike!(self, internal);
16/// }
17/// ```
18#[macro_export]
19macro_rules! setlike {
20    ( $self:ident, $x:ident ) => {
21        #[inline(always)]
22        fn get_index(&$self, index: u32) -> Option<Self::Key> {
23            $self.$x.get_index(index)
24        }
25
26        #[inline(always)]
27        fn size(&$self) -> u32 {
28            $self.$x.size()
29        }
30
31        #[inline(always)]
32        fn add(&$self, key: Self::Key) {
33            $self.$x.add(key)
34        }
35
36        #[inline(always)]
37        fn has(&$self, key: Self::Key) -> bool {
38            $self.$x.has(key)
39        }
40
41        #[inline(always)]
42        fn clear(&$self) {
43            $self.$x.clear()
44        }
45
46        #[inline(always)]
47        fn delete(&$self, key: Self::Key) -> bool {
48            $self.$x.delete(key)
49        }
50    };
51}
52
53/// Usage:
54/// ```rust
55/// pub(crate) struct TestBindingMaplike {
56///     // maplike<DOMString, long>
57///     internal: DomRefCell<IndexMap<DOMString, i32>>,
58/// }
59/// impl Maplike for TestBindingSetlike {
60///     type Key = DOMString;
61///     type Value = i32;
62///     maplike!(self, internal);
63/// }
64/// ```
65#[macro_export]
66macro_rules! maplike {
67    ( $self:ident, $internal:ident ) => {
68        #[inline(always)]
69        fn get_index(&$self, index: u32) -> Option<(Self::Key, Self::Value)> {
70            $self.$internal.get_index(index)
71        }
72
73        #[inline(always)]
74        fn get(&$self, key: Self::Key) -> Option<Self::Value> {
75            $self.$internal.get(key)
76        }
77
78        #[inline(always)]
79        fn size(&$self) -> u32 {
80            $self.$internal.size()
81        }
82
83        #[inline(always)]
84        fn set(&$self, key: Self::Key, value: Self::Value) {
85            $self.$internal.set(key, value)
86        }
87
88        #[inline(always)]
89        fn has(&$self, key: Self::Key) -> bool {
90            $self.$internal.has(key)
91        }
92
93        #[inline(always)]
94        fn clear(&$self) {
95            $self.$internal.clear()
96        }
97
98        #[inline(always)]
99        fn delete(&$self, key: Self::Key) -> bool {
100            $self.$internal.delete(key)
101        }
102    };
103}