namespace internal {
// global functions
void row_major_strides(const Shape& shape, size_t \* strides, size_t size);
template <typename C, typename T>
T value_with_padding_or(
const C& arr,
size_t padding,
size_t idx,
T&& default_value
);
template <int A0, int A1, typename T, typename U, typename Functor>
void numpy_autobroadcast_binop(
const T \* arg0,
const T \* arg1,
U \* out,
const Shape& shape0,
const Shape& shape1,
const size_t \* strides0,
const size_t \* strides1,
const size_t padding0,
const size_t padding1,
const Shape& output_shape,
const size_t axis,
const size_t stride,
Functor elementwise_functor
);
size_t calculate_fixed_axis(size_t axis, const size_t \* strides);
} // namespace internal