1+ module ;
2+ #include < type_traits>
3+ export module mcpplibs.primitives.operations.operators;
4+
5+ import mcpplibs.primitives.underlying;
6+ import mcpplibs.primitives.policy;
7+ import mcpplibs.primitives.primitive;
8+ import mcpplibs.primitives.operations.impl;
9+
10+ export namespace mcpplibs ::primitives::operators {
11+ template <typename T, policy::policy_type... Policies>
12+ requires std_numeric<T>
13+ constexpr auto operator ~(const primitive<T, Policies...> &p) {
14+ // Placeholder: unary bitwise NOT not yet forwarded to operations layer.
15+ // TODO: forward to operations::bit_not when implemented.
16+ return primitives::primitive<T, Policies...>(~p.value ());
17+ }
18+
19+ template <typename T, policy::policy_type... Policies>
20+ requires std_numeric<T>
21+ constexpr auto operator +(const primitive<T, Policies...> &p) {
22+ // Placeholder: unary plus not yet forwarded to operations layer.
23+ // TODO: forward to operations::unary_plus when implemented.
24+ return primitives::primitive<T, Policies...>(+p.value ());
25+ }
26+
27+ template <typename T, policy::policy_type... Policies>
28+ requires std_numeric<T>
29+ constexpr auto operator -(const primitive<T, Policies...> &p) {
30+ // Placeholder: unary minus not yet forwarded to operations layer.
31+ // TODO: forward to operations::unary_neg when implemented.
32+ return primitives::primitive<T, Policies...>(-p.value ());
33+ }
34+
35+ template <typename LHS, typename RHS, policy::policy_type... PoliciesLHS,
36+ policy::policy_type... PoliciesRHS>
37+ requires std_numeric<LHS> && std_numeric<RHS>
38+ constexpr auto operator +(const primitive<LHS, PoliciesLHS...> &lhs,
39+ const primitive<RHS, PoliciesRHS...> &rhs) {
40+ return operations::add (lhs, rhs);
41+ }
42+
43+ template <typename LHS, typename RHS, policy::policy_type... PoliciesLHS,
44+ policy::policy_type... PoliciesRHS>
45+ requires std_numeric<LHS> && std_numeric<RHS>
46+ constexpr auto operator -(const primitive<LHS, PoliciesLHS...> &lhs,
47+ const primitive<RHS, PoliciesRHS...> &rhs) {
48+ return operations::sub (lhs, rhs);
49+ }
50+
51+ template <std_numeric LHS, std_numeric RHS, policy::policy_type... PoliciesLHS,
52+ policy::policy_type... PoliciesRHS>
53+ constexpr auto operator *(const primitive<LHS, PoliciesLHS...> &lhs,
54+ const primitive<RHS, PoliciesRHS...> &rhs) {
55+ return operations::mul (lhs, rhs);
56+ }
57+
58+ template <std_numeric LHS, std_numeric RHS, policy::policy_type... PoliciesLHS,
59+ policy::policy_type... PoliciesRHS>
60+ constexpr auto operator /(const primitive<LHS, PoliciesLHS...> &lhs,
61+ const primitive<RHS, PoliciesRHS...> &rhs) {
62+ // Placeholder: division not yet forwarded to operations layer.
63+ // TODO: forward to operations::div when implemented (handle policies).
64+ using result_type = std::common_type_t <LHS, RHS>;
65+ return primitives::primitive<result_type, PoliciesLHS..., PoliciesRHS...>(
66+ static_cast <result_type>(lhs.value ()) /
67+ static_cast <result_type>(rhs.value ()));
68+ }
69+
70+ template <std_numeric LHS, std_numeric RHS, policy::policy_type... PoliciesLHS,
71+ policy::policy_type... PoliciesRHS>
72+ constexpr auto operator %(const primitive<LHS, PoliciesLHS...> &lhs,
73+ const primitive<RHS, PoliciesRHS...> &rhs) {
74+ // Placeholder: modulo not yet forwarded to operations layer.
75+ // TODO: forward to operations::mod when implemented (handle policies).
76+ using result_type = std::common_type_t <LHS, RHS>;
77+ return primitives::primitive<result_type, PoliciesLHS..., PoliciesRHS...>(
78+ static_cast <result_type>(lhs.value ()) %
79+ static_cast <result_type>(rhs.value ()));
80+ }
81+
82+ template <std_numeric LHS, std_numeric RHS, policy::policy_type... PoliciesLHS,
83+ policy::policy_type... PoliciesRHS>
84+ constexpr auto operator <<(const primitive<LHS, PoliciesLHS...> &lhs,
85+ const primitive<RHS, PoliciesRHS...> &rhs) {
86+ // Placeholder: left shift not yet forwarded to operations layer.
87+ // TODO: forward to operations::shl when implemented (handle policies).
88+ using result_type = std::common_type_t <LHS, RHS>;
89+ return primitives::primitive<result_type, PoliciesLHS..., PoliciesRHS...>(
90+ static_cast <result_type>(lhs.value ())
91+ << static_cast <result_type>(rhs.value ()));
92+ }
93+
94+ template <std_numeric LHS, std_numeric RHS, policy::policy_type... PoliciesLHS,
95+ policy::policy_type... PoliciesRHS>
96+ constexpr auto operator >>(const primitive<LHS, PoliciesLHS...> &lhs,
97+ const primitive<RHS, PoliciesRHS...> &rhs) {
98+ // Placeholder: right shift not yet forwarded to operations layer.
99+ // TODO: forward to operations::shr when implemented (handle policies).
100+ using result_type = std::common_type_t <LHS, RHS>;
101+ return primitives::primitive<result_type, PoliciesLHS..., PoliciesRHS...>(
102+ static_cast <result_type>(lhs.value ()) >>
103+ static_cast <result_type>(rhs.value ()));
104+ }
105+
106+ template <std_numeric LHS, std_numeric RHS, policy::policy_type... PoliciesLHS,
107+ policy::policy_type... PoliciesRHS>
108+ constexpr auto operator &(const primitive<LHS, PoliciesLHS...> &lhs,
109+ const primitive<RHS, PoliciesRHS...> &rhs) {
110+ // Placeholder: bitwise AND not yet forwarded to operations layer.
111+ // TODO: forward to operations::bit_and when implemented (handle policies).
112+ using result_type = std::common_type_t <LHS, RHS>;
113+ return primitives::primitive<result_type, PoliciesLHS..., PoliciesRHS...>(
114+ static_cast <result_type>(lhs.value ()) &
115+ static_cast <result_type>(rhs.value ()));
116+ }
117+
118+ template <std_numeric LHS, std_numeric RHS, policy::policy_type... PoliciesLHS,
119+ policy::policy_type... PoliciesRHS>
120+ constexpr auto operator |(const primitive<LHS, PoliciesLHS...> &lhs,
121+ const primitive<RHS, PoliciesRHS...> &rhs) {
122+ // Placeholder: bitwise OR not yet forwarded to operations layer.
123+ // TODO: forward to operations::bit_or when implemented (handle policies).
124+ using result_type = std::common_type_t <LHS, RHS>;
125+ return primitives::primitive<result_type, PoliciesLHS..., PoliciesRHS...>(
126+ static_cast <result_type>(lhs.value ()) |
127+ static_cast <result_type>(rhs.value ()));
128+ }
129+
130+ template <std_numeric LHS, std_numeric RHS, policy::policy_type... PoliciesLHS,
131+ policy::policy_type... PoliciesRHS>
132+ constexpr auto operator ^(const primitive<LHS, PoliciesLHS...> &lhs,
133+ const primitive<RHS, PoliciesRHS...> &rhs) {
134+ // Placeholder: bitwise XOR not yet forwarded to operations layer.
135+ // TODO: forward to operations::bit_xor when implemented (handle policies).
136+ using result_type = std::common_type_t <LHS, RHS>;
137+ return primitives::primitive<result_type, PoliciesLHS..., PoliciesRHS...>(
138+ static_cast <result_type>(lhs.value ()) ^
139+ static_cast <result_type>(rhs.value ()));
140+ }
141+ } // namespace mcpplibs::primitives::operators
0 commit comments