ACTS
Experiment-independent tracking
Loading...
Searching...
No Matches
array_operators.hpp
1// This file is part of the ACTS project.
2//
3// Copyright (C) 2016 CERN for the benefit of the ACTS project
4//
5// This Source Code Form is subject to the terms of the Mozilla Public
6// License, v. 2.0. If a copy of the MPL was not distributed with this
7// file, You can obtain one at https://mozilla.org/MPL/2.0/.
8#pragma once
9
10// Project include(s)
11#include "detray/algebra/concepts.hpp"
12#include "detray/definitions/detail/qualifiers.hpp"
13
14// System include(s).
15#include <cstddef>
16#include <type_traits>
17
18namespace detray::algebra::storage {
19
22template <template <typename, std::size_t> class array_t,
23 concepts::scalar scalar_t, std::size_t N>
24DETRAY_HOST_DEVICE constexpr array_t<scalar_t, N> operator*(
25 const array_t<scalar_t, N> &a, scalar_t s) noexcept {
26 array_t<scalar_t, N> result;
27 for (std::size_t i = 0u; i < N; ++i) {
28 result[i] = a[i] * s;
29 }
30
31 return result;
32}
33
34template <template <typename, std::size_t> class array_t,
35 concepts::scalar scalar_t, std::size_t N>
36DETRAY_HOST_DEVICE constexpr array_t<scalar_t, N> operator*(
37 scalar_t s, const array_t<scalar_t, N> &a) noexcept {
38 array_t<scalar_t, N> result;
39 for (std::size_t i = 0u; i < N; ++i) {
40 result[i] = s * a[i];
41 }
42
43 return result;
44}
45
46template <template <typename, std::size_t> class array_t,
47 concepts::scalar scalar_t, std::size_t N>
48DETRAY_HOST_DEVICE constexpr array_t<scalar_t, N> operator-(
49 const array_t<scalar_t, N> &a, const array_t<scalar_t, N> &b) noexcept {
50 array_t<scalar_t, N> result;
51 for (std::size_t i = 0u; i < N; ++i) {
52 result[i] = a[i] - b[i];
53 }
54
55 return result;
56}
57
58template <template <typename, std::size_t> class array_t,
59 concepts::scalar scalar_t, std::size_t N>
60DETRAY_HOST_DEVICE constexpr array_t<scalar_t, N> operator+(
61 const array_t<scalar_t, N> &a, const array_t<scalar_t, N> &b) noexcept {
62 array_t<scalar_t, N> result;
63 for (std::size_t i = 0u; i < N; ++i) {
64 result[i] = a[i] + b[i];
65 }
66
67 return result;
68}
69
70template <template <typename, std::size_t> class array_t,
71 concepts::scalar scalar_t, std::size_t N>
72DETRAY_HOST_DEVICE constexpr array_t<scalar_t, N> operator*(
73 const array_t<scalar_t, N> &a, const array_t<scalar_t, N> &b) noexcept {
74 array_t<scalar_t, N> result;
75 for (std::size_t i = 0u; i < N; ++i) {
76 result[i] = a[i] * b[i];
77 }
78
79 return result;
80}
81
82template <template <typename, std::size_t> class array_t,
83 concepts::scalar scalar_t, std::size_t N>
84DETRAY_HOST_DEVICE constexpr array_t<scalar_t, N> operator/(
85 const array_t<scalar_t, N> &a, const array_t<scalar_t, N> &b) noexcept {
86 array_t<scalar_t, N> result;
87 for (std::size_t i = 0u; i < N; ++i) {
88 result[i] = a[i] / b[i];
89 }
90
91 return result;
92}
93
94
95} // namespace detray::algebra::storage
Scalar concept: Elements of vectors/matrices (can be simd vectors).
Definition concepts.hpp:40
constexpr array_t< scalar1_t, 2 > operator*(const array_t< scalar1_t, 2 > &a, scalar2_t s)
Multiply an array-backed vector by a scalar.
Definition array_operators.hpp:26
constexpr array_t< scalar_t, N > operator/(const array_t< scalar_t, N > &a, const array_t< scalar_t, N > &b) noexcept
Divide compatible SoA vectors component-wise.
Definition array_operators.hpp:84
constexpr array_t< scalar_t, 2 > operator+(const array_t< scalar_t, 2 > &a, const array_t< scalar_t, 2 > &b)
Add array-backed vectors component-wise.
Definition array_operators.hpp:47
constexpr array_t< scalar_t, 2 > operator-(const array_t< scalar_t, 2 > &a, const array_t< scalar_t, 2 > &b)
Subtract array-backed vectors component-wise.
Definition array_operators.hpp:40