Skip to main content

script_webgpu/
wgsllanguagefeatures.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// check-tidy: no specs after this line
6
7use std::marker::PhantomData;
8
9use dom_struct::dom_struct;
10use indexmap::IndexSet;
11use js::context::JSContext;
12use js::gc::HandleObject;
13use jstraceable_derive::JSTraceable;
14use malloc_size_of_derive::MallocSizeOf;
15use script_bindings::DomTypes;
16use script_bindings::cell::DomRefCell;
17use script_bindings::codegen::GenericBindings::WebGPUBinding::{
18    WGSLLanguageFeaturesMethods, WGSLLanguageFeaturesWrap,
19};
20use script_bindings::domstring::TracedDOMString;
21use script_bindings::like::Setlike;
22use script_bindings::reflector::{Reflector, reflect_dom_object_with_proto_and_wrap};
23use webgpu_traits::ImplementedLanguageExtension;
24
25use crate::dom::bindings::root::DomRoot;
26use crate::dom::bindings::str::DOMString;
27use crate::traits::Equivalence;
28
29#[dom_struct]
30pub struct WGSLLanguageFeatures<D: DomTypes> {
31    reflector: Reflector,
32    // internal storage for features
33    #[custom_trace]
34    internal: DomRefCell<IndexSet<TracedDOMString>>,
35    #[no_trace = "PhantomData does not exist"]
36    phantom: PhantomData<D>,
37}
38
39impl<D: Equivalence> WGSLLanguageFeatures<D> {
40    pub fn new(
41        cx: &mut JSContext,
42        global: &D::GlobalScope,
43        proto: Option<HandleObject>,
44    ) -> DomRoot<Self> {
45        reflect_dom_object_with_proto_and_wrap::<D, _, _>(
46            cx,
47            Box::new(Self {
48                reflector: Reflector::new(),
49                internal: DomRefCell::new(
50                    ImplementedLanguageExtension::all()
51                        .iter()
52                        .map(|le| DOMString::from_static(le.to_ident()).traced())
53                        .collect(),
54                ),
55                phantom: PhantomData,
56            }),
57            global,
58            proto,
59            WGSLLanguageFeaturesWrap::<D>,
60        )
61    }
62}
63
64impl<D: DomTypes> WGSLLanguageFeaturesMethods<D> for WGSLLanguageFeatures<D> {
65    fn Size(&self) -> u32 {
66        self.internal.borrow().len() as u32
67    }
68}
69
70impl<D: DomTypes> Setlike for WGSLLanguageFeatures<D> {
71    type Key = DOMString;
72
73    #[inline(always)]
74    fn get_index(&self, cx: &mut JSContext, index: u32) -> Option<Self::Key> {
75        self.internal
76            .get_index(cx, index)
77            .map(|domstring| domstring.root())
78    }
79    #[inline(always)]
80    fn size(&self, cx: &mut JSContext) -> u32 {
81        self.internal.size(cx)
82    }
83    #[inline(always)]
84    fn add(&self, _cx: &mut JSContext, _key: Self::Key) {
85        unreachable!("readonly");
86    }
87    #[inline(always)]
88    fn has(&self, cx: &mut JSContext, key: Self::Key) -> bool {
89        self.internal.has(cx, key.traced())
90    }
91    #[inline(always)]
92    fn clear(&self, _cx: &mut JSContext) {
93        unreachable!("readonly");
94    }
95    #[inline(always)]
96    fn delete(&self, _cx: &mut JSContext, _key: Self::Key) -> bool {
97        unreachable!("readonly");
98    }
99}