1use crate::constants::{CircleConstants, ScalarConstants};
3use crate::core::integer::{FullInt, IntConvert};
4use crate::{operators::*, Circle, ExponentConstants, FractionConstants, Integer, Scalar};
5use i256::I256;
6use num_traits::{AsPrimitive, WrappingNeg, WrappingAdd, WrappingMul, WrappingSub};
7use std::ops::*;
8
9macro_rules! impl_circle_op_rust_to_circle {
13 ($trait:ident, $method:ident, $circle_method:ident, $($t:ty),*) => {
14 $(
15 impl<
17 F: Integer
18 + FractionConstants
19 + FullInt
20 + Shl<isize, Output = F>
21 + Shr<isize, Output = F>
22 + Shl<F, Output = F>
23 + Shr<F, Output = F>
24 + Shl<E, Output = F>
25 + Shr<E, Output = F>
26 + WrappingNeg
27 + WrappingAdd
28 + WrappingMul
29 + WrappingSub,
30 E: Integer
31 + ExponentConstants
32 + FullInt
33 + Shl<isize, Output = E>
34 + Shr<isize, Output = E>
35 + Shl<E, Output = E>
36 + Shr<E, Output = E>
37 + Shl<F, Output = E>
38 + Shr<F, Output = E>
39 + WrappingNeg
40 + WrappingAdd
41 + WrappingMul
42 + WrappingSub,
43 > $trait<$t> for &Circle<F, E>
44 where
45 Circle<F, E>: CircleConstants,
46 Scalar<F, E>: ScalarConstants,
47 u8: AsPrimitive<F>,
48 u16: AsPrimitive<F>,
49 u32: AsPrimitive<F>,
50 u64: AsPrimitive<F>,
51 u128: AsPrimitive<F>,
52 usize: AsPrimitive<F>,
53 i8: AsPrimitive<F>,
54 i16: AsPrimitive<F>,
55 i32: AsPrimitive<F>,
56 i64: AsPrimitive<F>,
57 i128: AsPrimitive<F>,
58 isize: AsPrimitive<F>,
59 I256: From<F>,
60 u8: AsPrimitive<E>,
61 u16: AsPrimitive<E>,
62 u32: AsPrimitive<E>,
63 u64: AsPrimitive<E>,
64 u128: AsPrimitive<E>,
65 usize: AsPrimitive<E>,
66 i8: AsPrimitive<E>,
67 i16: AsPrimitive<E>,
68 i32: AsPrimitive<E>,
69 i64: AsPrimitive<E>,
70 i128: AsPrimitive<E>,
71 isize: AsPrimitive<E>,
72 I256: From<E>,
73 {
74 type Output = Circle<F, E>;
75
76 fn $method(self, rhs: $t) -> Self::Output {
77 let scalar_rhs = Scalar::<F, E>::from(rhs);
78 self.$circle_method(&scalar_rhs)
79 }
80 }
81
82 impl<
84 F: Integer
85 + FractionConstants
86 + FullInt
87 + Shl<isize, Output = F>
88 + Shr<isize, Output = F>
89 + Shl<F, Output = F>
90 + Shr<F, Output = F>
91 + Shl<E, Output = F>
92 + Shr<E, Output = F>
93 + WrappingNeg
94 + WrappingAdd
95 + WrappingMul
96 + WrappingSub,
97 E: Integer
98 + ExponentConstants
99 + FullInt
100 + Shl<isize, Output = E>
101 + Shr<isize, Output = E>
102 + Shl<E, Output = E>
103 + Shr<E, Output = E>
104 + Shl<F, Output = E>
105 + Shr<F, Output = E>
106 + WrappingNeg
107 + WrappingAdd
108 + WrappingMul
109 + WrappingSub,
110 > $trait<$t> for &mut Circle<F, E>
111 where
112 Circle<F, E>: CircleConstants,
113 Scalar<F, E>: ScalarConstants,
114 u8: AsPrimitive<F>,
115 u16: AsPrimitive<F>,
116 u32: AsPrimitive<F>,
117 u64: AsPrimitive<F>,
118 u128: AsPrimitive<F>,
119 usize: AsPrimitive<F>,
120 i8: AsPrimitive<F>,
121 i16: AsPrimitive<F>,
122 i32: AsPrimitive<F>,
123 i64: AsPrimitive<F>,
124 i128: AsPrimitive<F>,
125 isize: AsPrimitive<F>,
126 I256: From<F>,
127 u8: AsPrimitive<E>,
128 u16: AsPrimitive<E>,
129 u32: AsPrimitive<E>,
130 u64: AsPrimitive<E>,
131 u128: AsPrimitive<E>,
132 usize: AsPrimitive<E>,
133 i8: AsPrimitive<E>,
134 i16: AsPrimitive<E>,
135 i32: AsPrimitive<E>,
136 i64: AsPrimitive<E>,
137 i128: AsPrimitive<E>,
138 isize: AsPrimitive<E>,
139 I256: From<E>,
140 {
141 type Output = Circle<F, E>;
142
143 fn $method(self, rhs: $t) -> Self::Output {
144 let scalar_rhs = Scalar::<F, E>::from(rhs);
145 self.$circle_method(&scalar_rhs)
146 }
147 }
148
149 impl<
151 F: Integer
152 + FractionConstants
153 + FullInt
154 + Shl<isize, Output = F>
155 + Shr<isize, Output = F>
156 + Shl<F, Output = F>
157 + Shr<F, Output = F>
158 + Shl<E, Output = F>
159 + Shr<E, Output = F>
160 + WrappingNeg
161 + WrappingAdd
162 + WrappingMul
163 + WrappingSub,
164 E: Integer
165 + ExponentConstants
166 + FullInt
167 + Shl<isize, Output = E>
168 + Shr<isize, Output = E>
169 + Shl<E, Output = E>
170 + Shr<E, Output = E>
171 + Shl<F, Output = E>
172 + Shr<F, Output = E>
173 + WrappingNeg
174 + WrappingAdd
175 + WrappingMul
176 + WrappingSub,
177 > $trait<$t> for Circle<F, E>
178 where
179 Circle<F, E>: CircleConstants,
180 Scalar<F, E>: ScalarConstants,
181 u8: AsPrimitive<F>,
182 u16: AsPrimitive<F>,
183 u32: AsPrimitive<F>,
184 u64: AsPrimitive<F>,
185 u128: AsPrimitive<F>,
186 usize: AsPrimitive<F>,
187 i8: AsPrimitive<F>,
188 i16: AsPrimitive<F>,
189 i32: AsPrimitive<F>,
190 i64: AsPrimitive<F>,
191 i128: AsPrimitive<F>,
192 isize: AsPrimitive<F>,
193 I256: From<F>,
194 u8: AsPrimitive<E>,
195 u16: AsPrimitive<E>,
196 u32: AsPrimitive<E>,
197 u64: AsPrimitive<E>,
198 u128: AsPrimitive<E>,
199 usize: AsPrimitive<E>,
200 i8: AsPrimitive<E>,
201 i16: AsPrimitive<E>,
202 i32: AsPrimitive<E>,
203 i64: AsPrimitive<E>,
204 i128: AsPrimitive<E>,
205 isize: AsPrimitive<E>,
206 I256: From<E>,
207 {
208 type Output = Circle<F, E>;
209
210 fn $method(self, rhs: $t) -> Self::Output {
211 let scalar_rhs = Scalar::<F, E>::from(rhs);
212 (&self).$circle_method(&scalar_rhs)
213 }
214 }
215 )*
216 }
217}
218
219impl_circle_op_rust_to_circle!(
221 Add,
222 add,
223 circle_add_scalar,
224 i8,
225 i16,
226 i32,
227 i64,
228 i128,
229 isize,
230 u8,
231 u16,
232 u32,
233 u64,
234 u128,
235 usize,
236 f32,
237 f64
238);
239
240impl_circle_op_rust_to_circle!(
241 Sub,
242 sub,
243 circle_subtract_scalar,
244 i8,
245 i16,
246 i32,
247 i64,
248 i128,
249 isize,
250 u8,
251 u16,
252 u32,
253 u64,
254 u128,
255 usize,
256 f32,
257 f64
258);
259
260impl_circle_op_rust_to_circle!(
261 Mul,
262 mul,
263 circle_multiply_scalar,
264 i8,
265 i16,
266 i32,
267 i64,
268 i128,
269 isize,
270 u8,
271 u16,
272 u32,
273 u64,
274 u128,
275 usize,
276 f32,
277 f64
278);
279
280impl_circle_op_rust_to_circle!(
281 Div,
282 div,
283 circle_divide_scalar,
284 i8,
285 i16,
286 i32,
287 i64,
288 i128,
289 isize,
290 u8,
291 u16,
292 u32,
293 u64,
294 u128,
295 usize,
296 f32,
297 f64
298);
299
300macro_rules! impl_circle_op_rust_to_scalar {
304 ($trait:ident, $method:ident, $circle_method:ident, $($t:ty),*) => {
305 $(
306 impl<
308 F: Integer
309 + FractionConstants
310 + FullInt
311 + Shl<isize, Output = F>
312 + Shr<isize, Output = F>
313 + Shl<F, Output = F>
314 + Shr<F, Output = F>
315 + Shl<E, Output = F>
316 + Shr<E, Output = F>
317 + WrappingNeg
318 + WrappingAdd
319 + WrappingMul
320 + WrappingSub,
321 E: Integer
322 + ExponentConstants
323 + FullInt
324 + Shl<isize, Output = E>
325 + Shr<isize, Output = E>
326 + Shl<E, Output = E>
327 + Shr<E, Output = E>
328 + Shl<F, Output = E>
329 + Shr<F, Output = E>
330 + WrappingNeg
331 + WrappingAdd
332 + WrappingMul
333 + WrappingSub,
334 > $trait<$t> for &Circle<F, E>
335 where
336 Circle<F, E>: CircleConstants,
337 Scalar<F, E>: ScalarConstants,
338 u8: AsPrimitive<F>,
339 u16: AsPrimitive<F>,
340 u32: AsPrimitive<F>,
341 u64: AsPrimitive<F>,
342 u128: AsPrimitive<F>,
343 usize: AsPrimitive<F>,
344 i8: AsPrimitive<F>,
345 i16: AsPrimitive<F>,
346 i32: AsPrimitive<F>,
347 i64: AsPrimitive<F>,
348 i128: AsPrimitive<F>,
349 isize: AsPrimitive<F>,
350 I256: From<F>,
351 u8: AsPrimitive<E>,
352 u16: AsPrimitive<E>,
353 u32: AsPrimitive<E>,
354 u64: AsPrimitive<E>,
355 u128: AsPrimitive<E>,
356 usize: AsPrimitive<E>,
357 i8: AsPrimitive<E>,
358 i16: AsPrimitive<E>,
359 i32: AsPrimitive<E>,
360 i64: AsPrimitive<E>,
361 i128: AsPrimitive<E>,
362 isize: AsPrimitive<E>,
363 I256: From<E>,
364 {
365 type Output = Scalar<F, E>;
366
367 fn $method(self, rhs: $t) -> Self::Output {
368 let scalar_rhs = Scalar::<F, E>::from(rhs);
369 self.$circle_method(&scalar_rhs)
370 }
371 }
372
373 impl<
375 F: Integer
376 + FractionConstants
377 + FullInt
378 + Shl<isize, Output = F>
379 + Shr<isize, Output = F>
380 + Shl<F, Output = F>
381 + Shr<F, Output = F>
382 + Shl<E, Output = F>
383 + Shr<E, Output = F>
384 + WrappingNeg
385 + WrappingAdd
386 + WrappingMul
387 + WrappingSub,
388 E: Integer
389 + ExponentConstants
390 + FullInt
391 + Shl<isize, Output = E>
392 + Shr<isize, Output = E>
393 + Shl<E, Output = E>
394 + Shr<E, Output = E>
395 + Shl<F, Output = E>
396 + Shr<F, Output = E>
397 + WrappingNeg
398 + WrappingAdd
399 + WrappingMul
400 + WrappingSub,
401 > $trait<$t> for &mut Circle<F, E>
402 where
403 Circle<F, E>: CircleConstants,
404 Scalar<F, E>: ScalarConstants,
405 u8: AsPrimitive<F>,
406 u16: AsPrimitive<F>,
407 u32: AsPrimitive<F>,
408 u64: AsPrimitive<F>,
409 u128: AsPrimitive<F>,
410 usize: AsPrimitive<F>,
411 i8: AsPrimitive<F>,
412 i16: AsPrimitive<F>,
413 i32: AsPrimitive<F>,
414 i64: AsPrimitive<F>,
415 i128: AsPrimitive<F>,
416 isize: AsPrimitive<F>,
417 I256: From<F>,
418 u8: AsPrimitive<E>,
419 u16: AsPrimitive<E>,
420 u32: AsPrimitive<E>,
421 u64: AsPrimitive<E>,
422 u128: AsPrimitive<E>,
423 usize: AsPrimitive<E>,
424 i8: AsPrimitive<E>,
425 i16: AsPrimitive<E>,
426 i32: AsPrimitive<E>,
427 i64: AsPrimitive<E>,
428 i128: AsPrimitive<E>,
429 isize: AsPrimitive<E>,
430 I256: From<E>,
431 {
432 type Output = Scalar<F, E>;
433
434 fn $method(self, rhs: $t) -> Self::Output {
435 let scalar_rhs = Scalar::<F, E>::from(rhs);
436 self.$circle_method(&scalar_rhs)
437 }
438 }
439
440 impl<
442 F: Integer
443 + FractionConstants
444 + FullInt
445 + Shl<isize, Output = F>
446 + Shr<isize, Output = F>
447 + Shl<F, Output = F>
448 + Shr<F, Output = F>
449 + Shl<E, Output = F>
450 + Shr<E, Output = F>
451 + WrappingNeg
452 + WrappingAdd
453 + WrappingMul
454 + WrappingSub,
455 E: Integer
456 + ExponentConstants
457 + FullInt
458 + Shl<isize, Output = E>
459 + Shr<isize, Output = E>
460 + Shl<E, Output = E>
461 + Shr<E, Output = E>
462 + Shl<F, Output = E>
463 + Shr<F, Output = E>
464 + WrappingNeg
465 + WrappingAdd
466 + WrappingMul
467 + WrappingSub,
468 > $trait<$t> for Circle<F, E>
469 where
470 Circle<F, E>: CircleConstants,
471 Scalar<F, E>: ScalarConstants,
472 u8: AsPrimitive<F>,
473 u16: AsPrimitive<F>,
474 u32: AsPrimitive<F>,
475 u64: AsPrimitive<F>,
476 u128: AsPrimitive<F>,
477 usize: AsPrimitive<F>,
478 i8: AsPrimitive<F>,
479 i16: AsPrimitive<F>,
480 i32: AsPrimitive<F>,
481 i64: AsPrimitive<F>,
482 i128: AsPrimitive<F>,
483 isize: AsPrimitive<F>,
484 I256: From<F>,
485 u8: AsPrimitive<E>,
486 u16: AsPrimitive<E>,
487 u32: AsPrimitive<E>,
488 u64: AsPrimitive<E>,
489 u128: AsPrimitive<E>,
490 usize: AsPrimitive<E>,
491 i8: AsPrimitive<E>,
492 i16: AsPrimitive<E>,
493 i32: AsPrimitive<E>,
494 i64: AsPrimitive<E>,
495 i128: AsPrimitive<E>,
496 isize: AsPrimitive<E>,
497 I256: From<E>,
498 {
499 type Output = Scalar<F, E>;
500
501 fn $method(self, rhs: $t) -> Self::Output {
502 let scalar_rhs = Scalar::<F, E>::from(rhs);
503 (&self).$circle_method(&scalar_rhs)
504 }
505 }
506 )*
507 }
508}
509
510impl_circle_op_rust_to_scalar!(
512 Rem,
513 rem,
514 circle_modulus_scalar,
515 i8,
516 i16,
517 i32,
518 i64,
519 i128,
520 isize,
521 u8,
522 u16,
523 u32,
524 u64,
525 u128,
526 usize,
527 f32,
528 f64
529);
530
531macro_rules! impl_circle_assign_op_rust {
535 ($trait:ident, $method:ident, $circle_method:ident, $($t:ty),*) => {
536 $(
537 impl<
538 F: Integer
539 + FractionConstants
540 + FullInt
541 + Shl<isize, Output = F>
542 + Shr<isize, Output = F>
543 + Shl<F, Output = F>
544 + Shr<F, Output = F>
545 + Shl<E, Output = F>
546 + Shr<E, Output = F>
547 + WrappingNeg
548 + WrappingAdd
549 + WrappingMul
550 + WrappingSub,
551 E: Integer
552 + ExponentConstants
553 + FullInt
554 + Shl<isize, Output = E>
555 + Shr<isize, Output = E>
556 + Shl<E, Output = E>
557 + Shr<E, Output = E>
558 + Shl<F, Output = E>
559 + Shr<F, Output = E>
560 + WrappingNeg
561 + WrappingAdd
562 + WrappingMul
563 + WrappingSub,
564 > $trait<$t> for Circle<F, E>
565 where
566 Circle<F, E>: CircleConstants,
567 Scalar<F, E>: ScalarConstants,
568 u8: AsPrimitive<F>,
569 u16: AsPrimitive<F>,
570 u32: AsPrimitive<F>,
571 u64: AsPrimitive<F>,
572 u128: AsPrimitive<F>,
573 usize: AsPrimitive<F>,
574 i8: AsPrimitive<F>,
575 i16: AsPrimitive<F>,
576 i32: AsPrimitive<F>,
577 i64: AsPrimitive<F>,
578 i128: AsPrimitive<F>,
579 isize: AsPrimitive<F>,
580 I256: From<F>,
581 u8: AsPrimitive<E>,
582 u16: AsPrimitive<E>,
583 u32: AsPrimitive<E>,
584 u64: AsPrimitive<E>,
585 u128: AsPrimitive<E>,
586 usize: AsPrimitive<E>,
587 i8: AsPrimitive<E>,
588 i16: AsPrimitive<E>,
589 i32: AsPrimitive<E>,
590 i64: AsPrimitive<E>,
591 i128: AsPrimitive<E>,
592 isize: AsPrimitive<E>,
593 I256: From<E>,
594 {
595 fn $method(&mut self, rhs: $t) {
596 let scalar_rhs = Scalar::<F, E>::from(rhs);
597 *self = self.$circle_method(&scalar_rhs);
598 }
599 }
600 )*
601 }
602}
603
604impl_circle_assign_op_rust!(
606 AddAssign,
607 add_assign,
608 circle_add_scalar,
609 i8,
610 i16,
611 i32,
612 i64,
613 i128,
614 isize,
615 u8,
616 u16,
617 u32,
618 u64,
619 u128,
620 usize,
621 f32,
622 f64
623);
624
625impl_circle_assign_op_rust!(
626 SubAssign,
627 sub_assign,
628 circle_subtract_scalar,
629 i8,
630 i16,
631 i32,
632 i64,
633 i128,
634 isize,
635 u8,
636 u16,
637 u32,
638 u64,
639 u128,
640 usize,
641 f32,
642 f64
643);
644
645impl_circle_assign_op_rust!(
646 MulAssign,
647 mul_assign,
648 circle_multiply_scalar,
649 i8,
650 i16,
651 i32,
652 i64,
653 i128,
654 isize,
655 u8,
656 u16,
657 u32,
658 u64,
659 u128,
660 usize,
661 f32,
662 f64
663);
664
665impl_circle_assign_op_rust!(
666 DivAssign,
667 div_assign,
668 circle_divide_scalar,
669 i8,
670 i16,
671 i32,
672 i64,
673 i128,
674 isize,
675 u8,
676 u16,
677 u32,
678 u64,
679 u128,
680 usize,
681 f32,
682 f64
683);
684
685macro_rules! impl_circle_shift_op {
689 ($trait:ident, $method:ident, $circle_method:ident, $($rhs_type:ty),*) => {
690 $(
691 impl<
693 F: Integer
694 + FractionConstants
695 + FullInt
696 + Shl<isize, Output = F>
697 + Shr<isize, Output = F>
698 + Shl<F, Output = F>
699 + Shr<F, Output = F>
700 + Shl<E, Output = F>
701 + Shr<E, Output = F>
702 + WrappingNeg
703 + WrappingAdd
704 + WrappingMul
705 + WrappingSub,
706 E: Integer
707 + ExponentConstants
708 + FullInt
709 + Shl<isize, Output = E>
710 + Shr<isize, Output = E>
711 + Shl<E, Output = E>
712 + Shr<E, Output = E>
713 + Shl<F, Output = E>
714 + Shr<F, Output = E>
715 + WrappingNeg
716 + WrappingAdd
717 + WrappingMul
718 + WrappingSub,
719 > $trait<$rhs_type> for &Circle<F, E>
720 where
721 Circle<F, E>: CircleConstants,
722 Scalar<F, E>: ScalarConstants,
723 u8: AsPrimitive<F>,
724 u16: AsPrimitive<F>,
725 u32: AsPrimitive<F>,
726 u64: AsPrimitive<F>,
727 u128: AsPrimitive<F>,
728 usize: AsPrimitive<F>,
729 i8: AsPrimitive<F>,
730 i16: AsPrimitive<F>,
731 i32: AsPrimitive<F>,
732 i64: AsPrimitive<F>,
733 i128: AsPrimitive<F>,
734 isize: AsPrimitive<F>,
735 I256: From<F>,
736 u8: AsPrimitive<E>,
737 u16: AsPrimitive<E>,
738 u32: AsPrimitive<E>,
739 u64: AsPrimitive<E>,
740 u128: AsPrimitive<E>,
741 usize: AsPrimitive<E>,
742 i8: AsPrimitive<E>,
743 i16: AsPrimitive<E>,
744 i32: AsPrimitive<E>,
745 i64: AsPrimitive<E>,
746 i128: AsPrimitive<E>,
747 isize: AsPrimitive<E>,
748 I256: From<E>,
749 {
750 type Output = Circle<F, E>;
751
752 fn $method(self, rhs: $rhs_type) -> Self::Output {
753 let shift: E = rhs.saturate();
754 self.$circle_method(&shift)
755 }
756 }
757
758 impl<
760 F: Integer
761 + FractionConstants
762 + FullInt
763 + Shl<isize, Output = F>
764 + Shr<isize, Output = F>
765 + Shl<F, Output = F>
766 + Shr<F, Output = F>
767 + Shl<E, Output = F>
768 + Shr<E, Output = F>
769 + WrappingNeg
770 + WrappingAdd
771 + WrappingMul
772 + WrappingSub,
773 E: Integer
774 + ExponentConstants
775 + FullInt
776 + Shl<isize, Output = E>
777 + Shr<isize, Output = E>
778 + Shl<E, Output = E>
779 + Shr<E, Output = E>
780 + Shl<F, Output = E>
781 + Shr<F, Output = E>
782 + WrappingNeg
783 + WrappingAdd
784 + WrappingMul
785 + WrappingSub,
786 > $trait<$rhs_type> for &mut Circle<F, E>
787 where
788 Circle<F, E>: CircleConstants,
789 Scalar<F, E>: ScalarConstants,
790 u8: AsPrimitive<F>,
791 u16: AsPrimitive<F>,
792 u32: AsPrimitive<F>,
793 u64: AsPrimitive<F>,
794 u128: AsPrimitive<F>,
795 usize: AsPrimitive<F>,
796 i8: AsPrimitive<F>,
797 i16: AsPrimitive<F>,
798 i32: AsPrimitive<F>,
799 i64: AsPrimitive<F>,
800 i128: AsPrimitive<F>,
801 isize: AsPrimitive<F>,
802 I256: From<F>,
803 u8: AsPrimitive<E>,
804 u16: AsPrimitive<E>,
805 u32: AsPrimitive<E>,
806 u64: AsPrimitive<E>,
807 u128: AsPrimitive<E>,
808 usize: AsPrimitive<E>,
809 i8: AsPrimitive<E>,
810 i16: AsPrimitive<E>,
811 i32: AsPrimitive<E>,
812 i64: AsPrimitive<E>,
813 i128: AsPrimitive<E>,
814 isize: AsPrimitive<E>,
815 I256: From<E>,
816 {
817 type Output = Circle<F, E>;
818
819 fn $method(self, rhs: $rhs_type) -> Self::Output {
820 let shift: E = rhs.saturate();
821 self.$circle_method(&shift)
822 }
823 }
824
825 impl<
827 F: Integer
828 + FractionConstants
829 + FullInt
830 + Shl<isize, Output = F>
831 + Shr<isize, Output = F>
832 + Shl<F, Output = F>
833 + Shr<F, Output = F>
834 + Shl<E, Output = F>
835 + Shr<E, Output = F>
836 + WrappingNeg
837 + WrappingAdd
838 + WrappingMul
839 + WrappingSub,
840 E: Integer
841 + ExponentConstants
842 + FullInt
843 + Shl<isize, Output = E>
844 + Shr<isize, Output = E>
845 + Shl<E, Output = E>
846 + Shr<E, Output = E>
847 + Shl<F, Output = E>
848 + Shr<F, Output = E>
849 + WrappingNeg
850 + WrappingAdd
851 + WrappingMul
852 + WrappingSub,
853 > $trait<$rhs_type> for Circle<F, E>
854 where
855 Circle<F, E>: CircleConstants,
856 Scalar<F, E>: ScalarConstants,
857 u8: AsPrimitive<F>,
858 u16: AsPrimitive<F>,
859 u32: AsPrimitive<F>,
860 u64: AsPrimitive<F>,
861 u128: AsPrimitive<F>,
862 usize: AsPrimitive<F>,
863 i8: AsPrimitive<F>,
864 i16: AsPrimitive<F>,
865 i32: AsPrimitive<F>,
866 i64: AsPrimitive<F>,
867 i128: AsPrimitive<F>,
868 isize: AsPrimitive<F>,
869 I256: From<F>,
870 u8: AsPrimitive<E>,
871 u16: AsPrimitive<E>,
872 u32: AsPrimitive<E>,
873 u64: AsPrimitive<E>,
874 u128: AsPrimitive<E>,
875 usize: AsPrimitive<E>,
876 i8: AsPrimitive<E>,
877 i16: AsPrimitive<E>,
878 i32: AsPrimitive<E>,
879 i64: AsPrimitive<E>,
880 i128: AsPrimitive<E>,
881 isize: AsPrimitive<E>,
882 I256: From<E>,
883 {
884 type Output = Circle<F, E>;
885
886 fn $method(self, rhs: $rhs_type) -> Self::Output {
887 let shift: E = rhs.saturate();
888 (&self).$circle_method(&shift)
889 }
890 }
891 )*
892 };
893}
894
895impl_circle_shift_op!(
897 Shl,
898 shl,
899 circle_shl_integer,
900 u8,
901 u16,
902 u32,
903 u64,
904 u128,
905 usize,
906 i8,
907 i16,
908 i32,
909 i64,
910 i128,
911 isize
912);
913
914impl_circle_shift_op!(
915 Shr,
916 shr,
917 circle_shr_integer,
918 u8,
919 u16,
920 u32,
921 u64,
922 u128,
923 usize,
924 i8,
925 i16,
926 i32,
927 i64,
928 i128,
929 isize
930);
931
932macro_rules! impl_circle_shift_assign_op {
936 ($trait:ident, $method:ident, $circle_method:ident, $($rhs_type:ty),*) => {
937 $(
938 impl<
939 F: Integer
940 + FractionConstants
941 + FullInt
942 + Shl<isize, Output = F>
943 + Shr<isize, Output = F>
944 + Shl<F, Output = F>
945 + Shr<F, Output = F>
946 + Shl<E, Output = F>
947 + Shr<E, Output = F>
948 + WrappingNeg
949 + WrappingAdd
950 + WrappingMul
951 + WrappingSub,
952 E: Integer
953 + ExponentConstants
954 + FullInt
955 + Shl<isize, Output = E>
956 + Shr<isize, Output = E>
957 + Shl<E, Output = E>
958 + Shr<E, Output = E>
959 + Shl<F, Output = E>
960 + Shr<F, Output = E>
961 + WrappingNeg
962 + WrappingAdd
963 + WrappingMul
964 + WrappingSub,
965 > $trait<$rhs_type> for Circle<F, E>
966 where
967 Circle<F, E>: CircleConstants,
968 Scalar<F, E>: ScalarConstants,
969 u8: AsPrimitive<F>,
970 u16: AsPrimitive<F>,
971 u32: AsPrimitive<F>,
972 u64: AsPrimitive<F>,
973 u128: AsPrimitive<F>,
974 usize: AsPrimitive<F>,
975 i8: AsPrimitive<F>,
976 i16: AsPrimitive<F>,
977 i32: AsPrimitive<F>,
978 i64: AsPrimitive<F>,
979 i128: AsPrimitive<F>,
980 isize: AsPrimitive<F>,
981 I256: From<F>,
982 u8: AsPrimitive<E>,
983 u16: AsPrimitive<E>,
984 u32: AsPrimitive<E>,
985 u64: AsPrimitive<E>,
986 u128: AsPrimitive<E>,
987 usize: AsPrimitive<E>,
988 i8: AsPrimitive<E>,
989 i16: AsPrimitive<E>,
990 i32: AsPrimitive<E>,
991 i64: AsPrimitive<E>,
992 i128: AsPrimitive<E>,
993 isize: AsPrimitive<E>,
994 I256: From<E>,
995 {
996 fn $method(&mut self, rhs: $rhs_type) {
997 let shift: E = rhs.saturate();
998 *self = self.$circle_method(&shift);
999 }
1000 }
1001 )*
1002 };
1003}
1004
1005impl_circle_shift_assign_op!(
1007 ShlAssign,
1008 shl_assign,
1009 circle_shl_integer,
1010 u8,
1011 u16,
1012 u32,
1013 u64,
1014 u128,
1015 usize,
1016 i8,
1017 i16,
1018 i32,
1019 i64,
1020 i128,
1021 isize
1022);
1023
1024impl_circle_shift_assign_op!(
1025 ShrAssign,
1026 shr_assign,
1027 circle_shr_integer,
1028 u8,
1029 u16,
1030 u32,
1031 u64,
1032 u128,
1033 usize,
1034 i8,
1035 i16,
1036 i32,
1037 i64,
1038 i128,
1039 isize
1040);
1041macro_rules! impl_circle_exponent_rust {
1045 ($trait:ident, $method:ident, $circle_method:ident, $($t:ty),*) => {
1046 $(
1047 impl<
1049 F: Integer
1050 + FractionConstants
1051 + FullInt
1052 + Shl<isize, Output = F>
1053 + Shr<isize, Output = F>
1054 + Shl<F, Output = F>
1055 + Shr<F, Output = F>
1056 + Shl<E, Output = F>
1057 + Shr<E, Output = F>
1058 + WrappingNeg
1059 + WrappingAdd
1060 + WrappingMul
1061 + WrappingSub,
1062 E: Integer
1063 + ExponentConstants
1064 + FullInt
1065 + Shl<isize, Output = E>
1066 + Shr<isize, Output = E>
1067 + Shl<E, Output = E>
1068 + Shr<E, Output = E>
1069 + Shl<F, Output = E>
1070 + Shr<F, Output = E>
1071 + WrappingNeg
1072 + WrappingAdd
1073 + WrappingMul
1074 + WrappingSub,
1075 > $trait<$t> for &Circle<F, E>
1076 where
1077 Circle<F, E>: CircleConstants,
1078 Scalar<F, E>: ScalarConstants,
1079 u8: AsPrimitive<F>,
1080 u16: AsPrimitive<F>,
1081 u32: AsPrimitive<F>,
1082 u64: AsPrimitive<F>,
1083 u128: AsPrimitive<F>,
1084 usize: AsPrimitive<F>,
1085 i8: AsPrimitive<F>,
1086 i16: AsPrimitive<F>,
1087 i32: AsPrimitive<F>,
1088 i64: AsPrimitive<F>,
1089 i128: AsPrimitive<F>,
1090 isize: AsPrimitive<F>,
1091 I256: From<F>,
1092 u8: AsPrimitive<E>,
1093 u16: AsPrimitive<E>,
1094 u32: AsPrimitive<E>,
1095 u64: AsPrimitive<E>,
1096 u128: AsPrimitive<E>,
1097 usize: AsPrimitive<E>,
1098 i8: AsPrimitive<E>,
1099 i16: AsPrimitive<E>,
1100 i32: AsPrimitive<E>,
1101 i64: AsPrimitive<E>,
1102 i128: AsPrimitive<E>,
1103 isize: AsPrimitive<E>,
1104 I256: From<E>,
1105 {
1106 type Output = Circle<F, E>;
1107
1108 fn $method(&self, rhs: $t) -> Self::Output {
1109 let scalar_rhs = Scalar::<F, E>::from(rhs);
1110 self.$circle_method(&scalar_rhs)
1111 }
1112 }
1113
1114 impl<
1116 F: Integer
1117 + FractionConstants
1118 + FullInt
1119 + Shl<isize, Output = F>
1120 + Shr<isize, Output = F>
1121 + Shl<F, Output = F>
1122 + Shr<F, Output = F>
1123 + Shl<E, Output = F>
1124 + Shr<E, Output = F>
1125 + WrappingNeg
1126 + WrappingAdd
1127 + WrappingMul
1128 + WrappingSub,
1129 E: Integer
1130 + ExponentConstants
1131 + FullInt
1132 + Shl<isize, Output = E>
1133 + Shr<isize, Output = E>
1134 + Shl<E, Output = E>
1135 + Shr<E, Output = E>
1136 + Shl<F, Output = E>
1137 + Shr<F, Output = E>
1138 + WrappingNeg
1139 + WrappingAdd
1140 + WrappingMul
1141 + WrappingSub,
1142 > $trait<$t> for &mut Circle<F, E>
1143 where
1144 Circle<F, E>: CircleConstants,
1145 Scalar<F, E>: ScalarConstants,
1146 u8: AsPrimitive<F>,
1147 u16: AsPrimitive<F>,
1148 u32: AsPrimitive<F>,
1149 u64: AsPrimitive<F>,
1150 u128: AsPrimitive<F>,
1151 usize: AsPrimitive<F>,
1152 i8: AsPrimitive<F>,
1153 i16: AsPrimitive<F>,
1154 i32: AsPrimitive<F>,
1155 i64: AsPrimitive<F>,
1156 i128: AsPrimitive<F>,
1157 isize: AsPrimitive<F>,
1158 I256: From<F>,
1159 u8: AsPrimitive<E>,
1160 u16: AsPrimitive<E>,
1161 u32: AsPrimitive<E>,
1162 u64: AsPrimitive<E>,
1163 u128: AsPrimitive<E>,
1164 usize: AsPrimitive<E>,
1165 i8: AsPrimitive<E>,
1166 i16: AsPrimitive<E>,
1167 i32: AsPrimitive<E>,
1168 i64: AsPrimitive<E>,
1169 i128: AsPrimitive<E>,
1170 isize: AsPrimitive<E>,
1171 I256: From<E>,
1172 {
1173 type Output = Circle<F, E>;
1174
1175 fn $method(&self, rhs: $t) -> Self::Output {
1176 let scalar_rhs = Scalar::<F, E>::from(rhs);
1177 self.$circle_method(&scalar_rhs)
1178 }
1179 }
1180
1181 impl<
1183 F: Integer
1184 + FractionConstants
1185 + FullInt
1186 + Shl<isize, Output = F>
1187 + Shr<isize, Output = F>
1188 + Shl<F, Output = F>
1189 + Shr<F, Output = F>
1190 + Shl<E, Output = F>
1191 + Shr<E, Output = F>
1192 + WrappingNeg
1193 + WrappingAdd
1194 + WrappingMul
1195 + WrappingSub,
1196 E: Integer
1197 + ExponentConstants
1198 + FullInt
1199 + Shl<isize, Output = E>
1200 + Shr<isize, Output = E>
1201 + Shl<E, Output = E>
1202 + Shr<E, Output = E>
1203 + Shl<F, Output = E>
1204 + Shr<F, Output = E>
1205 + WrappingNeg
1206 + WrappingAdd
1207 + WrappingMul
1208 + WrappingSub,
1209 > $trait<$t> for Circle<F, E>
1210 where
1211 Circle<F, E>: CircleConstants,
1212 Scalar<F, E>: ScalarConstants,
1213 u8: AsPrimitive<F>,
1214 u16: AsPrimitive<F>,
1215 u32: AsPrimitive<F>,
1216 u64: AsPrimitive<F>,
1217 u128: AsPrimitive<F>,
1218 usize: AsPrimitive<F>,
1219 i8: AsPrimitive<F>,
1220 i16: AsPrimitive<F>,
1221 i32: AsPrimitive<F>,
1222 i64: AsPrimitive<F>,
1223 i128: AsPrimitive<F>,
1224 isize: AsPrimitive<F>,
1225 I256: From<F>,
1226 u8: AsPrimitive<E>,
1227 u16: AsPrimitive<E>,
1228 u32: AsPrimitive<E>,
1229 u64: AsPrimitive<E>,
1230 u128: AsPrimitive<E>,
1231 usize: AsPrimitive<E>,
1232 i8: AsPrimitive<E>,
1233 i16: AsPrimitive<E>,
1234 i32: AsPrimitive<E>,
1235 i64: AsPrimitive<E>,
1236 i128: AsPrimitive<E>,
1237 isize: AsPrimitive<E>,
1238 I256: From<E>,
1239 {
1240 type Output = Circle<F, E>;
1241
1242 fn $method(&self, rhs: $t) -> Self::Output {
1243 let scalar_rhs = Scalar::<F, E>::from(rhs);
1244 (&self).$circle_method(&scalar_rhs)
1245 }
1246 }
1247 )*
1248 }
1249}
1250
1251impl_circle_exponent_rust!(
1252 Modulo,
1253 modulo,
1254 circle_modulo_scalar,
1255 i8,
1256 i16,
1257 i32,
1258 i64,
1259 i128,
1260 isize,
1261 u8,
1262 u16,
1263 u32,
1264 u64,
1265 u128,
1266 usize,
1267 f32,
1268 f64
1269);
1270impl_circle_exponent_rust!(
1271 Power,
1272 pow,
1273 circle_power_scalar,
1274 i8,
1275 i16,
1276 i32,
1277 i64,
1278 i128,
1279 isize,
1280 u8,
1281 u16,
1282 u32,
1283 u64,
1284 u128,
1285 usize,
1286 f32,
1287 f64
1288);
1289impl_circle_exponent_rust!(
1290 Logarithm,
1291 log,
1292 circle_logarithm_scalar,
1293 i8,
1294 i16,
1295 i32,
1296 i64,
1297 i128,
1298 isize,
1299 u8,
1300 u16,
1301 u32,
1302 u64,
1303 u128,
1304 usize,
1305 f32,
1306 f64
1307);
1308
1309macro_rules! impl_circle_cmp_rust {
1313 ($($t:ty),*) => {
1314 $(
1315 impl<
1317 F: Integer
1318 + FractionConstants
1319 + FullInt
1320 + Shl<isize, Output = F>
1321 + Shr<isize, Output = F>
1322 + Shl<F, Output = F>
1323 + Shr<F, Output = F>
1324 + Shl<E, Output = F>
1325 + Shr<E, Output = F>
1326 + WrappingNeg
1327 + WrappingAdd
1328 + WrappingMul
1329 + WrappingSub,
1330 E: Integer
1331 + ExponentConstants
1332 + FullInt
1333 + Shl<isize, Output = E>
1334 + Shr<isize, Output = E>
1335 + Shl<E, Output = E>
1336 + Shr<E, Output = E>
1337 + Shl<F, Output = E>
1338 + Shr<F, Output = E>
1339 + WrappingNeg
1340 + WrappingAdd
1341 + WrappingMul
1342 + WrappingSub,
1343 > PartialEq<$t> for Circle<F, E>
1344 where
1345 Circle<F, E>: CircleConstants,
1346 Scalar<F, E>: ScalarConstants,
1347 u8: AsPrimitive<F>,
1348 u16: AsPrimitive<F>,
1349 u32: AsPrimitive<F>,
1350 u64: AsPrimitive<F>,
1351 u128: AsPrimitive<F>,
1352 usize: AsPrimitive<F>,
1353 i8: AsPrimitive<F>,
1354 i16: AsPrimitive<F>,
1355 i32: AsPrimitive<F>,
1356 i64: AsPrimitive<F>,
1357 i128: AsPrimitive<F>,
1358 isize: AsPrimitive<F>,
1359 I256: From<F>,
1360 u8: AsPrimitive<E>,
1361 u16: AsPrimitive<E>,
1362 u32: AsPrimitive<E>,
1363 u64: AsPrimitive<E>,
1364 u128: AsPrimitive<E>,
1365 usize: AsPrimitive<E>,
1366 i8: AsPrimitive<E>,
1367 i16: AsPrimitive<E>,
1368 i32: AsPrimitive<E>,
1369 i64: AsPrimitive<E>,
1370 i128: AsPrimitive<E>,
1371 isize: AsPrimitive<E>,
1372 I256: From<E>,
1373 {
1374 fn eq(&self, other: &$t) -> bool {
1375 let circle_other = Circle::<F, E>::from(*other);
1376 self.equals(&circle_other)
1377 }
1378 }
1379
1380 impl<
1382 'a,
1383 F: Integer
1384 + FractionConstants
1385 + FullInt
1386 + Shl<isize, Output = F>
1387 + Shr<isize, Output = F>
1388 + Shl<F, Output = F>
1389 + Shr<F, Output = F>
1390 + Shl<E, Output = F>
1391 + Shr<E, Output = F>
1392 + WrappingNeg
1393 + WrappingAdd
1394 + WrappingMul
1395 + WrappingSub,
1396 E: Integer
1397 + ExponentConstants
1398 + FullInt
1399 + Shl<isize, Output = E>
1400 + Shr<isize, Output = E>
1401 + Shl<E, Output = E>
1402 + Shr<E, Output = E>
1403 + Shl<F, Output = E>
1404 + Shr<F, Output = E>
1405 + WrappingNeg
1406 + WrappingAdd
1407 + WrappingMul
1408 + WrappingSub,
1409 > PartialEq<$t> for &'a Circle<F, E>
1410 where
1411 Circle<F, E>: CircleConstants,
1412 Scalar<F, E>: ScalarConstants,
1413 u8: AsPrimitive<F>,
1414 u16: AsPrimitive<F>,
1415 u32: AsPrimitive<F>,
1416 u64: AsPrimitive<F>,
1417 u128: AsPrimitive<F>,
1418 usize: AsPrimitive<F>,
1419 i8: AsPrimitive<F>,
1420 i16: AsPrimitive<F>,
1421 i32: AsPrimitive<F>,
1422 i64: AsPrimitive<F>,
1423 i128: AsPrimitive<F>,
1424 isize: AsPrimitive<F>,
1425 I256: From<F>,
1426 u8: AsPrimitive<E>,
1427 u16: AsPrimitive<E>,
1428 u32: AsPrimitive<E>,
1429 u64: AsPrimitive<E>,
1430 u128: AsPrimitive<E>,
1431 usize: AsPrimitive<E>,
1432 i8: AsPrimitive<E>,
1433 i16: AsPrimitive<E>,
1434 i32: AsPrimitive<E>,
1435 i64: AsPrimitive<E>,
1436 i128: AsPrimitive<E>,
1437 isize: AsPrimitive<E>,
1438 I256: From<E>,
1439 {
1440 fn eq(&self, other: &$t) -> bool {
1441 let circle_other = Circle::<F, E>::from(*other);
1442 self.equals(&circle_other)
1443 }
1444 }
1445
1446 impl<
1448 F: Integer
1449 + FractionConstants
1450 + FullInt
1451 + Shl<isize, Output = F>
1452 + Shr<isize, Output = F>
1453 + Shl<F, Output = F>
1454 + Shr<F, Output = F>
1455 + Shl<E, Output = F>
1456 + Shr<E, Output = F>
1457 + WrappingNeg
1458 + WrappingAdd
1459 + WrappingMul
1460 + WrappingSub,
1461 E: Integer
1462 + ExponentConstants
1463 + FullInt
1464 + Shl<isize, Output = E>
1465 + Shr<isize, Output = E>
1466 + Shl<E, Output = E>
1467 + Shr<E, Output = E>
1468 + Shl<F, Output = E>
1469 + Shr<F, Output = E>
1470 + WrappingNeg
1471 + WrappingAdd
1472 + WrappingMul
1473 + WrappingSub,
1474 > PartialEq<Circle<F, E>> for $t
1475 where
1476 Circle<F, E>: CircleConstants,
1477 Scalar<F, E>: ScalarConstants,
1478 u8: AsPrimitive<F>,
1479 u16: AsPrimitive<F>,
1480 u32: AsPrimitive<F>,
1481 u64: AsPrimitive<F>,
1482 u128: AsPrimitive<F>,
1483 usize: AsPrimitive<F>,
1484 i8: AsPrimitive<F>,
1485 i16: AsPrimitive<F>,
1486 i32: AsPrimitive<F>,
1487 i64: AsPrimitive<F>,
1488 i128: AsPrimitive<F>,
1489 isize: AsPrimitive<F>,
1490 I256: From<F>,
1491 u8: AsPrimitive<E>,
1492 u16: AsPrimitive<E>,
1493 u32: AsPrimitive<E>,
1494 u64: AsPrimitive<E>,
1495 u128: AsPrimitive<E>,
1496 usize: AsPrimitive<E>,
1497 i8: AsPrimitive<E>,
1498 i16: AsPrimitive<E>,
1499 i32: AsPrimitive<E>,
1500 i64: AsPrimitive<E>,
1501 i128: AsPrimitive<E>,
1502 isize: AsPrimitive<E>,
1503 I256: From<E>,
1504 {
1505 fn eq(&self, other: &Circle<F, E>) -> bool {
1506 let circle_self = Circle::<F, E>::from(*self);
1507 circle_self.equals(other)
1508 }
1509 }
1510
1511 impl<
1513 'a,
1514 F: Integer
1515 + FractionConstants
1516 + FullInt
1517 + Shl<isize, Output = F>
1518 + Shr<isize, Output = F>
1519 + Shl<F, Output = F>
1520 + Shr<F, Output = F>
1521 + Shl<E, Output = F>
1522 + Shr<E, Output = F>
1523 + WrappingNeg
1524 + WrappingAdd
1525 + WrappingMul
1526 + WrappingSub,
1527 E: Integer
1528 + ExponentConstants
1529 + FullInt
1530 + Shl<isize, Output = E>
1531 + Shr<isize, Output = E>
1532 + Shl<E, Output = E>
1533 + Shr<E, Output = E>
1534 + Shl<F, Output = E>
1535 + Shr<F, Output = E>
1536 + WrappingNeg
1537 + WrappingAdd
1538 + WrappingMul
1539 + WrappingSub,
1540 > PartialEq<&'a Circle<F, E>> for $t
1541 where
1542 Circle<F, E>: CircleConstants,
1543 Scalar<F, E>: ScalarConstants,
1544 u8: AsPrimitive<F>,
1545 u16: AsPrimitive<F>,
1546 u32: AsPrimitive<F>,
1547 u64: AsPrimitive<F>,
1548 u128: AsPrimitive<F>,
1549 usize: AsPrimitive<F>,
1550 i8: AsPrimitive<F>,
1551 i16: AsPrimitive<F>,
1552 i32: AsPrimitive<F>,
1553 i64: AsPrimitive<F>,
1554 i128: AsPrimitive<F>,
1555 isize: AsPrimitive<F>,
1556 I256: From<F>,
1557 u8: AsPrimitive<E>,
1558 u16: AsPrimitive<E>,
1559 u32: AsPrimitive<E>,
1560 u64: AsPrimitive<E>,
1561 u128: AsPrimitive<E>,
1562 usize: AsPrimitive<E>,
1563 i8: AsPrimitive<E>,
1564 i16: AsPrimitive<E>,
1565 i32: AsPrimitive<E>,
1566 i64: AsPrimitive<E>,
1567 i128: AsPrimitive<E>,
1568 isize: AsPrimitive<E>,
1569 I256: From<E>,
1570 {
1571 fn eq(&self, other: &&'a Circle<F, E>) -> bool {
1572 let circle_self = Circle::<F, E>::from(*self);
1573 circle_self.equals(other)
1574 }
1575 }
1576 )*
1577 };
1578}
1579
1580impl_circle_cmp_rust!(i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize, f32, f64);