12#include "detray/algebra/concepts.hpp"
13#include "detray/definitions/detail/qualifiers.hpp"
18namespace detray::algebra {
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);
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>;
35 constexpr index_t size{detray::traits::size<vector_t>};
37 using new_vector_t = detray::traits::get_vector_t<vector_t, size, value_t>;
39 static_assert(std::same_as<value_t, detray::traits::value_t<new_vector_t>>);
41 if constexpr (std::same_as<new_vector_t, vector_t>) {
46 for (index_t i = 0; i < size; ++i) {
47 ret[i] = ::detray::algebra::cast_to<value_t>(v[i]);
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>;
60 constexpr index_t rows{detray::traits::rows<vector_t>};
62 using new_vector_t = detray::traits::get_matrix_t<vector_t, rows, 1, value_t>;
64 static_assert(std::same_as<value_t, detray::traits::value_t<new_vector_t>>);
66 if constexpr (std::same_as<new_vector_t, vector_t>) {
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));
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>;
88 constexpr index_t rows{detray::traits::rows<matrix_t>};
89 constexpr index_t columns{detray::traits::columns<matrix_t>};
92 detray::traits::get_matrix_t<matrix_t, rows, columns, value_t>;
94 static_assert(std::same_as<value_t, detray::traits::value_t<new_matrix_t>>);
96 if constexpr (std::same_as<new_matrix_t, matrix_t>) {
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));
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>;
119 if constexpr (std::same_as<new_trf3_t, transform_t>) {
123 ::detray::algebra::cast_to<scalar_t>(trf.matrix()),
124 ::detray::algebra::cast_to<scalar_t>(trf.matrix_inverse())};
constexpr double m
Meter.
Definition Units.hpp:97
constexpr double s
Definition Units.hpp:120