1use super::primitives::{JsBoolean, JsNumber, JsString};
2use super::value::JsValue;
3use crate::link::Browser;
4use crate::serialize::{UseInJsCode, UseInJsCodeWriter};
5use crate::{JsCast, ToJs};
6
7#[rustfmt::skip]
8impl Browser {
9 pub fn op_add (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsValue {self.value_from_raw_code(format_args!("(({}) + ({}))", UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
11 pub fn op_sub (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsNumber {self.value_from_raw_code(format_args!("(({}) - ({}))", UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
13 pub fn op_mul (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsNumber {self.value_from_raw_code(format_args!("(({}) * ({}))", UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
15 pub fn op_div (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsNumber {self.value_from_raw_code(format_args!("(({}) / ({}))", UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
17 pub fn op_remainder (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsNumber {self.value_from_raw_code(format_args!("(({}) % ({}))", UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
19 pub fn op_exponent (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsNumber {self.value_from_raw_code(format_args!("(({}) ** ({}))", UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
21 pub fn op_bitwise_and (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsNumber {self.value_from_raw_code(format_args!("(({}) & ({}))", UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
23 pub fn op_bitwise_or (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsNumber {self.value_from_raw_code(format_args!("(({}) | ({}))", UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
25 pub fn op_bitwise_xor (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsNumber {self.value_from_raw_code(format_args!("(({}) ^ ({}))", UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
27 pub fn op_lshift2 (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsNumber {self.value_from_raw_code(format_args!("(({}) << ({}))", UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
29 pub fn op_rshift2 (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsNumber {self.value_from_raw_code(format_args!("(({}) >> ({}))", UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
31 pub fn op_rshift3 (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsNumber {self.value_from_raw_code(format_args!("(({}) >>> ({}))", UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
33 pub fn op_logical_and (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsValue {self.value_from_raw_code(format_args!("(({}) && ({}))", UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
35 pub fn op_logical_or (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsValue {self.value_from_raw_code(format_args!("(({}) || ({}))", UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
37 pub fn op_eq2 (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsBoolean {self.value_from_raw_code(format_args!("(({}) == ({}))", UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
39 pub fn op_neq1 (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsBoolean {self.value_from_raw_code(format_args!("(({}) != ({}))", UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
41 pub fn op_eq3 (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsBoolean {self.value_from_raw_code(format_args!("(({}) === ({}))", UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
43 pub fn op_neq2 (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsBoolean {self.value_from_raw_code(format_args!("(({}) !== ({}))", UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
45 pub fn op_gt (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsBoolean {self.value_from_raw_code(format_args!("(({}) > ({}))", UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
47 pub fn op_gte (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsBoolean {self.value_from_raw_code(format_args!("(({}) >= ({}))", UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
49 pub fn op_lt (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsBoolean {self.value_from_raw_code(format_args!("(({}) < ({}))", UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
51 pub fn op_lte (&self, a: &dyn UseInJsCode, b: &dyn UseInJsCode) -> JsBoolean {self.value_from_raw_code(format_args!("(({}) <= ({}))", UseInJsCodeWriter(a), UseInJsCodeWriter(b))).unchecked_into()}
53
54 pub fn op_neg (&self, a: &dyn UseInJsCode) -> JsNumber {self.value_from_raw_code(format_args!("(-({}))", UseInJsCodeWriter(a))).unchecked_into()}
56 pub fn op_bitwise_not (&self, a: &dyn UseInJsCode) -> JsNumber {self.value_from_raw_code(format_args!("(~({}))", UseInJsCodeWriter(a))).unchecked_into()}
58 pub fn op_logical_not (&self, a: &dyn UseInJsCode) -> JsBoolean {self.value_from_raw_code(format_args!("(!({}))", UseInJsCodeWriter(a))).unchecked_into()}
60}
61
62macro_rules! impl_number_op {
63 ($trait_name:ident, $method_name:ident, $wsdom_name:ident) => {
64 impl<'a, T: ToJs<JsNumber>> $trait_name<&'a T> for &'a JsNumber {
65 type Output = JsNumber;
66
67 fn $method_name(self, rhs: &'a T) -> Self::Output {
68 self.browser.$wsdom_name(self, rhs).unchecked_into()
69 }
70 }
71 };
72}
73
74use std::ops::*;
75impl_number_op!(Add, add, op_add);
76impl_number_op!(Sub, sub, op_sub);
77impl_number_op!(Mul, mul, op_mul);
78impl_number_op!(Div, div, op_div);
79impl_number_op!(Rem, rem, op_remainder);
80impl_number_op!(Shl, shl, op_lshift2);
81impl_number_op!(Shr, shr, op_rshift2);
82impl_number_op!(BitAnd, bitand, op_bitwise_and);
83impl_number_op!(BitOr, bitor, op_bitwise_or);
84impl_number_op!(BitXor, bitxor, op_bitwise_xor);
85
86impl<'a, T: ToJs<JsString>> Add<&'a T> for &'a JsString {
87 type Output = JsString;
88
89 fn add(self, rhs: &'a T) -> Self::Output {
90 self.browser.op_add(self, rhs).unchecked_into()
91 }
92}
93impl<'a> Neg for &'a JsNumber {
94 type Output = JsNumber;
95
96 fn neg(self) -> Self::Output {
97 self.browser.op_neg(self)
98 }
99}