3#include <stratax/core/Concepts.hpp>
16void require_same_bitwise_shape(
const A& lhs,
const A& rhs)
18 stratax::core::validation::require_same_shape(
21 "Bitwise operands must have the same shape.");
34template<Array A,
typename Op>
36A binary_bitwise_op(
const A& lhs,
const A& rhs, Op op)
38 require_same_bitwise_shape(lhs, rhs);
40 A result(lhs.shape());
42 auto out = result.begin();
43 auto it_lhs = lhs.begin();
44 auto it_rhs = rhs.begin();
46 for (; it_lhs != lhs.end(); ++it_lhs, ++it_rhs, ++out)
48 *out =
static_cast<typename A::value_type
>(op(*it_lhs, *it_rhs));
62template<Array A, Integer Scalar,
typename Op>
64A binary_scalar_bitwise_op(
const A& lhs,
const Scalar& rhs, Op op)
66 A result(lhs.shape());
68 auto out = result.begin();
69 for (
auto it = lhs.begin(); it != lhs.end(); ++it, ++out)
71 *out =
static_cast<typename A::value_type
>(op(*it, rhs));
85template<Integer Scalar, Array A,
typename Op>
87A binary_scalar_bitwise_op(
const Scalar& lhs,
const A& rhs, Op op)
89 A result(rhs.shape());
91 auto out = result.begin();
92 for (
auto it = rhs.begin(); it != rhs.end(); ++it, ++out)
94 *out =
static_cast<typename A::value_type
>(op(lhs, *it));
110A operator~(
const A& value)
112 A result(value.shape());
114 auto out = result.begin();
115 for (
auto it = value.begin(); it != value.end(); ++it, ++out)
117 *out =
static_cast<typename A::value_type
>(std::bit_not<>{}(*it));
134A operator&(
const A& lhs,
const A& rhs)
136 return binary_bitwise_op(lhs, rhs, std::bit_and<>{});
148A operator|(
const A& lhs,
const A& rhs)
150 return binary_bitwise_op(lhs, rhs, std::bit_or<>{});
162A operator^(
const A& lhs,
const A& rhs)
164 return binary_bitwise_op(lhs, rhs, std::bit_xor<>{});
176A operator<<(
const A& lhs,
const A& rhs)
178 return binary_bitwise_op(lhs, rhs, [](
auto left,
auto right) {
return left << right; });
190A operator>>(
const A& lhs,
const A& rhs)
192 return binary_bitwise_op(lhs, rhs, [](
auto left,
auto right) {
return left >> right; });
204template<Array A, Integer Scalar>
206A operator&(
const A& lhs,
const Scalar& rhs)
208 return binary_scalar_bitwise_op(lhs, rhs, std::bit_and<>{});
218template<Array A, Integer Scalar>
220A operator|(
const A& lhs,
const Scalar& rhs)
222 return binary_scalar_bitwise_op(lhs, rhs, std::bit_or<>{});
232template<Array A, Integer Scalar>
234A operator^(
const A& lhs,
const Scalar& rhs)
236 return binary_scalar_bitwise_op(lhs, rhs, std::bit_xor<>{});
246template<Array A, Integer Scalar>
248A operator<<(
const A& lhs,
const Scalar& rhs)
250 return binary_scalar_bitwise_op(lhs, rhs, [](
auto left,
auto right) {
return left << right; });
260template<Array A, Integer Scalar>
262A operator>>(
const A& lhs,
const Scalar& rhs)
264 return binary_scalar_bitwise_op(lhs, rhs, [](
auto left,
auto right) {
return left >> right; });
276template<Integer Scalar, Array A>
278A operator&(
const Scalar& lhs,
const A& rhs)
280 return binary_scalar_bitwise_op(lhs, rhs, std::bit_and<>{});
290template<Integer Scalar, Array A>
292A operator|(
const Scalar& lhs,
const A& rhs)
294 return binary_scalar_bitwise_op(lhs, rhs, std::bit_or<>{});
304template<Integer Scalar, Array A>
306A operator^(
const Scalar& lhs,
const A& rhs)
308 return binary_scalar_bitwise_op(lhs, rhs, std::bit_xor<>{});
318template<Integer Scalar, Array A>
320A operator<<(
const Scalar& lhs,
const A& rhs)
322 return binary_scalar_bitwise_op(lhs, rhs, [](
auto left,
auto right) {
return left << right; });
332template<Integer Scalar, Array A>
334A operator>>(
const Scalar& lhs,
const A& rhs)
336 return binary_scalar_bitwise_op(lhs, rhs, [](
auto left,
auto right) {
return left >> right; });
350A& operator&=(A& lhs,
const A& rhs)
365A& operator|=(A& lhs,
const A& rhs)
380A& operator^=(A& lhs,
const A& rhs)
395A& operator<<=(A& lhs,
const A& rhs)
410A& operator>>=(A& lhs,
const A& rhs)
425template<Array A, Integer Scalar>
427A& operator&=(A& lhs,
const Scalar& rhs)
440template<Array A, Integer Scalar>
442A& operator|=(A& lhs,
const Scalar& rhs)
455template<Array A, Integer Scalar>
457A& operator^=(A& lhs,
const Scalar& rhs)
470template<Array A, Integer Scalar>
472A& operator<<=(A& lhs,
const Scalar& rhs)
485template<Array A, Integer Scalar>
487A& operator>>=(A& lhs,
const Scalar& rhs)
Shared runtime validation helpers.
Alias for Stratax-supported integer types.
Alias for any scalar type accepted by Stratax numeric containers.