Skip to main content

reifydb_evaluate/expression/arith/
mod.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4/// Builds the whole numeric type-pair match by push-down accumulation. The 144 fixed-width pairs
5/// dispatch to `$fh`; the 81 pairs involving an arbitrary-precision type dispatch to `$ah`.
6macro_rules! dispatch_arith {
7
8	(
9		$left:expr, $right:expr;
10		fixed: $fh:ident, arb: $ah:ident ($ctx:expr, $target:expr, $fragment:expr);
11		$($extra:tt)*
12	) => {
13		dispatch_arith!(@rows
14			($left, $right) $fh $ah ($ctx, $target, $fragment)
15			[Float4 Float8 Int1 Int2 Int4 Int8 Int16 Uint1 Uint2 Uint4 Uint8 Uint16]
16			{$($extra)*}
17			{}
18		)
19	};
20
21
22	(@rows
23		($left:expr, $right:expr) $fh:ident $ah:ident ($ctx:expr, $target:expr, $fragment:expr)
24		[$L:ident $($rest:ident)*]
25		{$($extra:tt)*}
26		{$($acc:tt)*}
27	) => {
28		dispatch_arith!(@rows
29			($left, $right) $fh $ah ($ctx, $target, $fragment)
30			[$($rest)*]
31			{$($extra)*}
32			{
33				$($acc)*
34				(ColumnBuffer::$L(l), ColumnBuffer::Float4(r)) => $fh($ctx, l, r, $target, $fragment),
35				(ColumnBuffer::$L(l), ColumnBuffer::Float8(r)) => $fh($ctx, l, r, $target, $fragment),
36				(ColumnBuffer::$L(l), ColumnBuffer::Int1(r)) => $fh($ctx, l, r, $target, $fragment),
37				(ColumnBuffer::$L(l), ColumnBuffer::Int2(r)) => $fh($ctx, l, r, $target, $fragment),
38				(ColumnBuffer::$L(l), ColumnBuffer::Int4(r)) => $fh($ctx, l, r, $target, $fragment),
39				(ColumnBuffer::$L(l), ColumnBuffer::Int8(r)) => $fh($ctx, l, r, $target, $fragment),
40				(ColumnBuffer::$L(l), ColumnBuffer::Int16(r)) => $fh($ctx, l, r, $target, $fragment),
41				(ColumnBuffer::$L(l), ColumnBuffer::Uint1(r)) => $fh($ctx, l, r, $target, $fragment),
42				(ColumnBuffer::$L(l), ColumnBuffer::Uint2(r)) => $fh($ctx, l, r, $target, $fragment),
43				(ColumnBuffer::$L(l), ColumnBuffer::Uint4(r)) => $fh($ctx, l, r, $target, $fragment),
44				(ColumnBuffer::$L(l), ColumnBuffer::Uint8(r)) => $fh($ctx, l, r, $target, $fragment),
45				(ColumnBuffer::$L(l), ColumnBuffer::Uint16(r)) => $fh($ctx, l, r, $target, $fragment),
46				(ColumnBuffer::$L(l), ColumnBuffer::Int { container: r, .. }) => $ah($ctx, l, r, $target, $fragment),
47				(ColumnBuffer::$L(l), ColumnBuffer::Uint { container: r, .. }) => $ah($ctx, l, r, $target, $fragment),
48				(ColumnBuffer::$L(l), ColumnBuffer::Decimal { container: r, .. }) => $ah($ctx, l, r, $target, $fragment),
49			}
50		)
51	};
52
53
54	(@rows
55		($left:expr, $right:expr) $fh:ident $ah:ident ($ctx:expr, $target:expr, $fragment:expr)
56		[]
57		{$($extra:tt)*}
58		{$($acc:tt)*}
59	) => {
60		match ($left, $right) {
61
62			$($acc)*
63
64
65			(ColumnBuffer::Int { container: l, .. }, ColumnBuffer::Float4(r)) => $ah($ctx, l, r, $target, $fragment),
66			(ColumnBuffer::Int { container: l, .. }, ColumnBuffer::Float8(r)) => $ah($ctx, l, r, $target, $fragment),
67			(ColumnBuffer::Int { container: l, .. }, ColumnBuffer::Int1(r)) => $ah($ctx, l, r, $target, $fragment),
68			(ColumnBuffer::Int { container: l, .. }, ColumnBuffer::Int2(r)) => $ah($ctx, l, r, $target, $fragment),
69			(ColumnBuffer::Int { container: l, .. }, ColumnBuffer::Int4(r)) => $ah($ctx, l, r, $target, $fragment),
70			(ColumnBuffer::Int { container: l, .. }, ColumnBuffer::Int8(r)) => $ah($ctx, l, r, $target, $fragment),
71			(ColumnBuffer::Int { container: l, .. }, ColumnBuffer::Int16(r)) => $ah($ctx, l, r, $target, $fragment),
72			(ColumnBuffer::Int { container: l, .. }, ColumnBuffer::Uint1(r)) => $ah($ctx, l, r, $target, $fragment),
73			(ColumnBuffer::Int { container: l, .. }, ColumnBuffer::Uint2(r)) => $ah($ctx, l, r, $target, $fragment),
74			(ColumnBuffer::Int { container: l, .. }, ColumnBuffer::Uint4(r)) => $ah($ctx, l, r, $target, $fragment),
75			(ColumnBuffer::Int { container: l, .. }, ColumnBuffer::Uint8(r)) => $ah($ctx, l, r, $target, $fragment),
76			(ColumnBuffer::Int { container: l, .. }, ColumnBuffer::Uint16(r)) => $ah($ctx, l, r, $target, $fragment),
77			(ColumnBuffer::Int { container: l, .. }, ColumnBuffer::Int { container: r, .. }) => $ah($ctx, l, r, $target, $fragment),
78			(ColumnBuffer::Int { container: l, .. }, ColumnBuffer::Uint { container: r, .. }) => $ah($ctx, l, r, $target, $fragment),
79			(ColumnBuffer::Int { container: l, .. }, ColumnBuffer::Decimal { container: r, .. }) => $ah($ctx, l, r, $target, $fragment),
80
81			(ColumnBuffer::Uint { container: l, .. }, ColumnBuffer::Float4(r)) => $ah($ctx, l, r, $target, $fragment),
82			(ColumnBuffer::Uint { container: l, .. }, ColumnBuffer::Float8(r)) => $ah($ctx, l, r, $target, $fragment),
83			(ColumnBuffer::Uint { container: l, .. }, ColumnBuffer::Int1(r)) => $ah($ctx, l, r, $target, $fragment),
84			(ColumnBuffer::Uint { container: l, .. }, ColumnBuffer::Int2(r)) => $ah($ctx, l, r, $target, $fragment),
85			(ColumnBuffer::Uint { container: l, .. }, ColumnBuffer::Int4(r)) => $ah($ctx, l, r, $target, $fragment),
86			(ColumnBuffer::Uint { container: l, .. }, ColumnBuffer::Int8(r)) => $ah($ctx, l, r, $target, $fragment),
87			(ColumnBuffer::Uint { container: l, .. }, ColumnBuffer::Int16(r)) => $ah($ctx, l, r, $target, $fragment),
88			(ColumnBuffer::Uint { container: l, .. }, ColumnBuffer::Uint1(r)) => $ah($ctx, l, r, $target, $fragment),
89			(ColumnBuffer::Uint { container: l, .. }, ColumnBuffer::Uint2(r)) => $ah($ctx, l, r, $target, $fragment),
90			(ColumnBuffer::Uint { container: l, .. }, ColumnBuffer::Uint4(r)) => $ah($ctx, l, r, $target, $fragment),
91			(ColumnBuffer::Uint { container: l, .. }, ColumnBuffer::Uint8(r)) => $ah($ctx, l, r, $target, $fragment),
92			(ColumnBuffer::Uint { container: l, .. }, ColumnBuffer::Uint16(r)) => $ah($ctx, l, r, $target, $fragment),
93			(ColumnBuffer::Uint { container: l, .. }, ColumnBuffer::Int { container: r, .. }) => $ah($ctx, l, r, $target, $fragment),
94			(ColumnBuffer::Uint { container: l, .. }, ColumnBuffer::Uint { container: r, .. }) => $ah($ctx, l, r, $target, $fragment),
95			(ColumnBuffer::Uint { container: l, .. }, ColumnBuffer::Decimal { container: r, .. }) => $ah($ctx, l, r, $target, $fragment),
96
97			(ColumnBuffer::Decimal { container: l, .. }, ColumnBuffer::Float4(r)) => $ah($ctx, l, r, $target, $fragment),
98			(ColumnBuffer::Decimal { container: l, .. }, ColumnBuffer::Float8(r)) => $ah($ctx, l, r, $target, $fragment),
99			(ColumnBuffer::Decimal { container: l, .. }, ColumnBuffer::Int1(r)) => $ah($ctx, l, r, $target, $fragment),
100			(ColumnBuffer::Decimal { container: l, .. }, ColumnBuffer::Int2(r)) => $ah($ctx, l, r, $target, $fragment),
101			(ColumnBuffer::Decimal { container: l, .. }, ColumnBuffer::Int4(r)) => $ah($ctx, l, r, $target, $fragment),
102			(ColumnBuffer::Decimal { container: l, .. }, ColumnBuffer::Int8(r)) => $ah($ctx, l, r, $target, $fragment),
103			(ColumnBuffer::Decimal { container: l, .. }, ColumnBuffer::Int16(r)) => $ah($ctx, l, r, $target, $fragment),
104			(ColumnBuffer::Decimal { container: l, .. }, ColumnBuffer::Uint1(r)) => $ah($ctx, l, r, $target, $fragment),
105			(ColumnBuffer::Decimal { container: l, .. }, ColumnBuffer::Uint2(r)) => $ah($ctx, l, r, $target, $fragment),
106			(ColumnBuffer::Decimal { container: l, .. }, ColumnBuffer::Uint4(r)) => $ah($ctx, l, r, $target, $fragment),
107			(ColumnBuffer::Decimal { container: l, .. }, ColumnBuffer::Uint8(r)) => $ah($ctx, l, r, $target, $fragment),
108			(ColumnBuffer::Decimal { container: l, .. }, ColumnBuffer::Uint16(r)) => $ah($ctx, l, r, $target, $fragment),
109			(ColumnBuffer::Decimal { container: l, .. }, ColumnBuffer::Int { container: r, .. }) => $ah($ctx, l, r, $target, $fragment),
110			(ColumnBuffer::Decimal { container: l, .. }, ColumnBuffer::Uint { container: r, .. }) => $ah($ctx, l, r, $target, $fragment),
111			(ColumnBuffer::Decimal { container: l, .. }, ColumnBuffer::Decimal { container: r, .. }) => $ah($ctx, l, r, $target, $fragment),
112
113
114			$($extra)*
115		}
116	};
117}
118
119pub mod add;
120pub mod div;
121pub mod mul;
122pub mod rem;
123pub mod sub;