OpenKalman
make_eigen_matrix.hpp
Go to the documentation of this file.
1 /* This file is part of OpenKalman, a header-only C++ library for
2  * Kalman filters and other recursive filters.
3  *
4  * Copyright (c) 2019-2023 Christopher Lee Ogden <ogden@gatech.edu>
5  *
6  * This Source Code Form is subject to the terms of the Mozilla Public
7  * License, v. 2.0. If a copy of the MPL was not distributed with this
8  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
9  */
10 
16 #ifndef OPENKALMAN_MAKE_EIGEN_MATRIX_HPP
17 #define OPENKALMAN_MAKE_EIGEN_MATRIX_HPP
18 
19 
20 namespace OpenKalman::Eigen3
21 {
28 #ifdef __cpp_concepts
29  template<values::number Scalar, std::size_t rows, std::size_t columns = 1, std::convertible_to<Scalar> ... Args>
30  requires (rows != dynamic_size) and (columns != dynamic_size) and (sizeof...(Args) == rows * columns)
31 #else
32  template<typename Scalar, std::size_t rows, std::size_t columns = 1, typename ... Args, std::enable_if_t<
33  values::number<Scalar> and (std::is_convertible_v<Args, Scalar> and ...) and
34  (rows != dynamic_size) and (columns != dynamic_size) and (sizeof...(Args) == rows * columns), int> = 0>
35 #endif
36  inline auto
37  make_eigen_matrix(const Args...args)
38  {
40  std::tuple d_tup {Dimensions<rows>{}, Dimensions<columns>{}};
41  return make_dense_object_from<M>(std::move(d_tup), static_cast<const Scalar>(args)...);
42  }
43 
44 
49 #ifdef __cpp_concepts
50  template<std::size_t rows, std::size_t columns = 1, values::number...Args> requires
51  (rows != dynamic_size) and (columns != dynamic_size) and (sizeof...(Args) == rows * columns) and
52  requires { requires values::number<std::common_type_t<Args...>>; }
53 #else
54  template<std::size_t rows, std::size_t columns = 1, typename ... Args, std::enable_if_t<(values::number<Args> and ...) and
55  (rows != dynamic_size) and (columns != dynamic_size) and (sizeof...(Args) == rows * columns), int> = 0>
56 #endif
57  inline auto
58  make_eigen_matrix(const Args...args)
59  {
60  return make_eigen_matrix<std::common_type_t<Args...>, rows, columns>(args...);
61  }
62 
63 
68 #ifdef __cpp_concepts
69  template<values::number Scalar, std::convertible_to<Scalar>...Args> requires (not std::is_void_v<Scalar>)
70 #else
71  template<typename Scalar, typename ... Args, std::enable_if_t<
72  values::number<Scalar> and (std::is_convertible_v<Args, Scalar> and ...) and (not std::is_void_v<Scalar>), int> = 0>
73 #endif
74  inline auto
75  make_eigen_matrix(const Args ... args)
76  {
77  return make_eigen_matrix<Scalar, sizeof...(Args), 1>(args...);
78  }
79 
80 
85 #ifdef __cpp_concepts
86  template<typename Scalar = void, values::number ... Args> requires (std::is_void_v<Scalar>) and
87  requires { requires values::number<std::common_type_t<Args...>>; }
88 #else
89  template<typename Scalar = void, typename ... Args, std::enable_if_t<(values::number<Args> and ...) and std::is_void_v<Scalar>, int> = 0>
90 #endif
91  inline auto
92  make_eigen_matrix(const Args...args)
93  {
94  return make_eigen_matrix<std::common_type_t<Args...>>(args...);
95  }
96 
97 
98 } // namespace OpenKalman::Eigen3
99 
100 
101 #endif //OPENKALMAN_MAKE_EIGEN_MATRIX_HPP
auto make_eigen_matrix(const Args...args)
Make a native Eigen matrix from a list of coefficients in row-major order.
Definition: make_eigen_matrix.hpp:37
constexpr bool number
T is a numerical type.
Definition: number.hpp:33
std::conditional_t< sizeof...(dims)==1, Eigen::Matrix< Scalar, detail::eigen_index_convert< dims >..., detail::eigen_index_convert< 1 > >, Eigen::Matrix< Scalar, detail::eigen_index_convert< dims >... > > eigen_matrix_t
An alias for a self-contained, writable, native Eigen matrix.
Definition: eigen-forward-declarations.hpp:491
Definition: eigen-forward-declarations.hpp:22
constexpr std::size_t dynamic_size
A constant indicating that a size or index is dynamic.
Definition: global-definitions.hpp:33