10#ifndef MARVIN_SIMDOPS_H
11#define MARVIN_SIMDOPS_H
13#include <marvin/library/marvin_Literals.h>
26 template <FloatType T>
27 void add(T* lhs,
const T* rhs,
size_t size)
noexcept;
35 template <FloatType T>
36 void add(T* arr, T scalar,
size_t size)
noexcept;
43 template <FloatArrayLike T>
44 void add(T& lhs, T& rhs)
noexcept {
45 assert(lhs.size() == rhs.size());
46 add(lhs.data(), rhs.data(), lhs.size());
55 template <FloatArrayLike T>
56 void add(T& arr,
typename T::value_type scalar)
noexcept {
57 add(arr.data(), scalar, arr.size());
67 template <FloatType T>
68 void subtract(T* lhs,
const T* rhs,
size_t size)
noexcept;
76 template <FloatType T>
77 void subtract(T* arr, T scalar,
size_t size)
noexcept;
85 template <FloatArrayLike T>
86 requires std::is_floating_point_v<typename T::value_type>
88 assert(lhs.size() == rhs.size());
89 subtract(lhs.data(), rhs.data(), lhs.size());
98 template <FloatArrayLike T>
99 void subtract(T& arr,
typename T::value_type scalar)
noexcept {
100 subtract(arr.data(), scalar, arr.size());
110 template <FloatType T>
111 void multiply(T* lhs,
const T* rhs,
size_t size)
noexcept;
120 template <FloatType T>
121 void multiply(T* arr, T scalar,
size_t size)
noexcept;
129 template <FloatArrayLike T>
131 assert(lhs.size() == rhs.size());
132 multiply(lhs.data(), rhs.data(), lhs.size());
141 template <FloatArrayLike T>
142 void multiply(T& arr,
typename T::value_type scalar)
noexcept {
143 multiply(arr.data(), scalar, arr.size());
153 template <FloatType T>
154 void divide(T* lhs,
const T* rhs,
size_t size)
noexcept;
163 template <FloatType T>
164 void divide(T* arr, T scalar,
size_t size)
noexcept;
172 template <FloatArrayLike T>
173 void divide(T& lhs,
const T& rhs)
noexcept {
174 assert(lhs.size() == rhs.size());
175 divide(lhs.data(), rhs.data(), lhs.size());
184 template <FloatArrayLike T>
185 void divide(T& arr,
typename T::value_type scalar)
noexcept {
186 divide(arr.data(), scalar, arr.size());
195 template <NumericType T>
196 void copy(T* lhs,
const T* rhs,
size_t size)
noexcept {
197 std::memcpy(lhs, rhs,
sizeof(T) * size);
207 template <ArrayLike T>
208 void copy(T& lhs,
const T& rhs)
noexcept {
209 assert(lhs.size() == rhs.size());
210 copy(lhs.data(), rhs.data(), lhs.size());
Collection of basic arithmetic operations on vectors, SIMD accelerated where possible.
Definition marvin_VecOps.h:17
void multiply(T *lhs, const T *rhs, size_t size) noexcept
void subtract(T *lhs, const T *rhs, size_t size) noexcept
void copy(T *lhs, const T *rhs, size_t size) noexcept
Definition marvin_VecOps.h:196
void add(T *lhs, const T *rhs, size_t size) noexcept
void divide(T *lhs, const T *rhs, size_t size) noexcept