script_webgpu/
wgsllanguagefeatures.rs1use 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::like::Setlike;
21use script_bindings::reflector::{Reflector, reflect_dom_object_with_proto_and_wrap};
22use wgpu_core::naga::front::wgsl::ImplementedLanguageExtension;
23
24use crate::dom::bindings::root::DomRoot;
25use crate::dom::bindings::str::DOMString;
26use crate::traits::Equivalence;
27
28#[dom_struct]
29pub struct WGSLLanguageFeatures<D: DomTypes> {
30 reflector: Reflector,
31 #[custom_trace]
33 internal: DomRefCell<IndexSet<DOMString>>,
34 #[no_trace = "PhantomData does not exist"]
35 phantom: PhantomData<D>,
36}
37
38impl<D: Equivalence> WGSLLanguageFeatures<D> {
39 pub fn new(
40 cx: &mut JSContext,
41 global: &D::GlobalScope,
42 proto: Option<HandleObject>,
43 ) -> DomRoot<Self> {
44 let set = ImplementedLanguageExtension::all()
45 .iter()
46 .map(|le| le.to_ident().into())
47 .collect();
48 reflect_dom_object_with_proto_and_wrap::<D, _, _>(
49 Box::new(Self {
50 reflector: Reflector::new(),
51 internal: DomRefCell::new(set),
52 phantom: PhantomData,
53 }),
54 global,
55 proto,
56 cx,
57 WGSLLanguageFeaturesWrap::<D>,
58 )
59 }
60}
61
62impl<D: DomTypes> WGSLLanguageFeaturesMethods<D> for WGSLLanguageFeatures<D> {
63 fn Size(&self) -> u32 {
64 self.internal.borrow().len() as u32
65 }
66}
67
68impl<D: DomTypes> Setlike for WGSLLanguageFeatures<D> {
69 type Key = DOMString;
70
71 #[inline(always)]
72 fn get_index(&self, cx: &mut JSContext, index: u32) -> Option<Self::Key> {
73 self.internal.get_index(cx, index)
74 }
75 #[inline(always)]
76 fn size(&self, cx: &mut JSContext) -> u32 {
77 self.internal.size(cx)
78 }
79 #[inline(always)]
80 fn add(&self, _cx: &mut JSContext, _key: Self::Key) {
81 unreachable!("readonly");
82 }
83 #[inline(always)]
84 fn has(&self, cx: &mut JSContext, key: Self::Key) -> bool {
85 self.internal.has(cx, key)
86 }
87 #[inline(always)]
88 fn clear(&self, _cx: &mut JSContext) {
89 unreachable!("readonly");
90 }
91 #[inline(always)]
92 fn delete(&self, _cx: &mut JSContext, _key: Self::Key) -> bool {
93 unreachable!("readonly");
94 }
95}