10 #include "imstkMath.h" 14 namespace ParallelUtils
19 template<
class T,
class Function>
21 atomicOp(T& target,
const T operand, Function&& f)
23 std::atomic<T>& tgt = *(
static_cast<std::atomic<T>*
>(&target));
29 new_val = f(cur_val, operand);
31 while (!tgt.compare_exchange_weak(cur_val, new_val));
39 atomicAdd(T& target,
const T operand)
41 atomicOp(target, operand, [](T a, T b) {
return a + b; });
49 atomicSubtract(T& target,
const T operand)
51 atomicOp(target, operand, [](T a, T b) {
return a - b; });
59 atomicMultiply(T& target,
const T operand)
61 atomicOp(target, operand, [](T a, T b) {
return a * b; });
69 atomicDivide(T& target,
const T operand)
71 atomicOp(target, operand, [](T a, T b) {
return a / b; });
77 template<
class T,
int N>
79 atomicAdd(Eigen::Matrix<T, N, 1>& target,
const Eigen::Matrix<T, N, 1>& operand)
81 for (
int i = 0; i < N; ++i)
83 atomicAdd(target[i], operand[i]);
90 template<
class T,
int N>
92 atomicSubtract(Eigen::Matrix<T, N, 1>& target,
const Eigen::Matrix<T, N, 1>& operand)
94 for (
int i = 0; i < N; ++i)
96 atomicSubtract(target[i], operand[i]);
103 template<
class T,
int N>
105 atomicMultiply(Eigen::Matrix<T, N, 1>& target,
const T operand)
107 for (
int i = 0; i < N; ++i)
109 atomicMultiply(target[i], operand);
116 template<
class T,
int N>
118 atomicDivide(Eigen::Matrix<T, N, 1>& target,
const T operand)
120 for (
int i = 0; i < N; ++i)
122 atomicDivide(target[i], operand);