ACTS
Experiment-independent tracking
Loading...
Searching...
No Matches
casts.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
9#pragma once
10
11// Project include(s)
12#include "detray/algebra/concepts.hpp"
13#include "detray/definitions/detail/qualifiers.hpp"
14
15// System include(s)
16#include <concepts>
17
18namespace detray::algebra {
19
22template <concepts::value value_t, concepts::scalar scalar_t>
23 requires std::convertible_to<scalar_t, value_t>
24DETRAY_HOST_DEVICE constexpr decltype(auto) cast_to(const scalar_t& s) {
25 return static_cast<value_t>(s);
26}
27
30template <concepts::value value_t, typename vector_t>
31 requires(concepts::vector<vector_t> || concepts::point<vector_t>)
32DETRAY_HOST_DEVICE constexpr decltype(auto) cast_to(const vector_t& v) {
33 using index_t = detray::traits::index_t<vector_t>;
34
35 constexpr index_t size{detray::traits::size<vector_t>};
36
37 using new_vector_t = detray::traits::get_vector_t<vector_t, size, value_t>;
38
39 static_assert(std::same_as<value_t, detray::traits::value_t<new_vector_t>>);
40
41 if constexpr (std::same_as<new_vector_t, vector_t>) {
42 return v;
43 } else {
44 new_vector_t ret;
45
46 for (index_t i = 0; i < size; ++i) {
47 ret[i] = ::detray::algebra::cast_to<value_t>(v[i]);
48 }
49
50 return ret;
51 }
52}
53
55template <concepts::value value_t, concepts::column_matrix vector_t>
56DETRAY_HOST_DEVICE constexpr decltype(auto) cast_to(const vector_t& v) {
57 using index_t = detray::traits::index_t<vector_t>;
58 using element_getter_t = detray::traits::element_getter_t<vector_t>;
59
60 constexpr index_t rows{detray::traits::rows<vector_t>};
61
62 using new_vector_t = detray::traits::get_matrix_t<vector_t, rows, 1, value_t>;
63
64 static_assert(std::same_as<value_t, detray::traits::value_t<new_vector_t>>);
65
66 if constexpr (std::same_as<new_vector_t, vector_t>) {
67 return v;
68 } else {
69 new_vector_t ret;
70 for (index_t i = 0; i < rows; ++i) {
71 element_getter_t{}(ret, i, 0) =
72 ::detray::algebra::cast_to<value_t>(element_getter_t{}(v, i, 0));
73 }
74
75 return ret;
76 }
77}
78
83template <concepts::value value_t, concepts::matrix matrix_t>
84DETRAY_HOST_DEVICE constexpr decltype(auto) cast_to(const matrix_t& m) {
85 using index_t = detray::traits::index_t<matrix_t>;
86 using element_getter_t = detray::traits::element_getter_t<matrix_t>;
87
88 constexpr index_t rows{detray::traits::rows<matrix_t>};
89 constexpr index_t columns{detray::traits::columns<matrix_t>};
90
91 using new_matrix_t =
92 detray::traits::get_matrix_t<matrix_t, rows, columns, value_t>;
93
94 static_assert(std::same_as<value_t, detray::traits::value_t<new_matrix_t>>);
95
96 if constexpr (std::same_as<new_matrix_t, matrix_t>) {
97 return m;
98 } else {
99 new_matrix_t ret;
100
101 for (index_t j = 0; j < columns; ++j) {
102 for (index_t i = 0; i < rows; ++i) {
103 element_getter_t{}(ret, i, j) =
104 ::detray::algebra::cast_to<value_t>(element_getter_t{}(m, i, j));
105 }
106 }
107
108 return ret;
109 }
110}
111
113template <concepts::scalar scalar_t, concepts::transform3D transform_t>
114 requires(!concepts::simd_scalar<scalar_t> &&
115 !concepts::simd_scalar<typename transform_t::scalar_type>)
116DETRAY_HOST_DEVICE constexpr decltype(auto) cast_to(const transform_t& trf) {
117 using new_trf3_t = typename transform_t::template other_type<scalar_t>;
118
119 if constexpr (std::same_as<new_trf3_t, transform_t>) {
120 return trf;
121 } else {
122 return new_trf3_t{
123 ::detray::algebra::cast_to<scalar_t>(trf.matrix()),
124 ::detray::algebra::cast_to<scalar_t>(trf.matrix_inverse())};
125 }
126}
127
128} // namespace detray::algebra
constexpr double m
Meter.
Definition Units.hpp:97
constexpr double s
Definition Units.hpp:120