script/dom/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 dom_struct::dom_struct;
8use indexmap::IndexSet;
9use js::rust::HandleObject;
10use wgpu_core::naga::front::wgsl::ImplementedLanguageExtension;
11
12use crate::dom::bindings::cell::DomRefCell;
13use crate::dom::bindings::codegen::Bindings::WebGPUBinding::WGSLLanguageFeaturesMethods;
14use crate::dom::bindings::like::Setlike;
15use crate::dom::bindings::reflector::{Reflector, reflect_dom_object_with_proto};
16use crate::dom::bindings::root::DomRoot;
17use crate::dom::bindings::str::DOMString;
18use crate::dom::globalscope::GlobalScope;
19use crate::script_runtime::CanGc;
20
21#[dom_struct]
22pub struct WGSLLanguageFeatures {
23    reflector: Reflector,
24    // internal storage for features
25    #[custom_trace]
26    internal: DomRefCell<IndexSet<DOMString>>,
27}
28
29impl WGSLLanguageFeatures {
30    pub(crate) fn new(
31        global: &GlobalScope,
32        proto: Option<HandleObject>,
33        can_gc: CanGc,
34    ) -> DomRoot<Self> {
35        let set = ImplementedLanguageExtension::all()
36            .iter()
37            .map(|le| le.to_ident().into())
38            .collect();
39        reflect_dom_object_with_proto(
40            Box::new(Self {
41                reflector: Reflector::new(),
42                internal: DomRefCell::new(set),
43            }),
44            global,
45            proto,
46            can_gc,
47        )
48    }
49}
50
51impl WGSLLanguageFeaturesMethods<crate::DomTypeHolder> for WGSLLanguageFeatures {
52    fn Size(&self) -> u32 {
53        self.internal.size()
54    }
55}
56
57impl Setlike for WGSLLanguageFeatures {
58    type Key = DOMString;
59
60    #[inline(always)]
61    fn get_index(&self, index: u32) -> Option<Self::Key> {
62        self.internal.get_index(index)
63    }
64    #[inline(always)]
65    fn size(&self) -> u32 {
66        self.internal.size()
67    }
68    #[inline(always)]
69    fn add(&self, _key: Self::Key) {
70        unreachable!("readonly");
71    }
72    #[inline(always)]
73    fn has(&self, key: Self::Key) -> bool {
74        self.internal.has(key)
75    }
76    #[inline(always)]
77    fn clear(&self) {
78        unreachable!("readonly");
79    }
80    #[inline(always)]
81    fn delete(&self, _key: Self::Key) -> bool {
82        unreachable!("readonly");
83    }
84}