OpenKalman
make_constant_diagonal_from_descriptors.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) 2024 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 
17 #ifndef OPENKALMAN_MAKE_CONSTANT_DIAGONAL_FROM_DESCRIPTORS_HPP
18 #define OPENKALMAN_MAKE_CONSTANT_DIAGONAL_FROM_DESCRIPTORS_HPP
19 
20 #include <vector>
23 
24 namespace OpenKalman::internal
25 {
30  template<typename T, typename C, typename Descriptors>
31  static constexpr decltype(auto)
32  make_constant_diagonal_from_descriptors(C&& c, Descriptors&& descriptors)
33  {
34  if constexpr (coordinates::pattern_collection<Descriptors>)
35  {
36  auto new_descriptors = std::tuple_cat(
37  std::tuple(internal::smallest_pattern<scalar_type_of_t<T>>(
38  std::get<0>(std::forward<Descriptors>(descriptors)), std::get<1>(std::forward<Descriptors>(descriptors)))),
39  internal::tuple_slice<2, collections::size_of_v<Descriptors>>(descriptors));
40  return make_constant<T>(std::forward<C>(c), new_descriptors);
41  }
42  else
43  {
44 #if __cpp_lib_containers_ranges >= 202202L and __cpp_lib_ranges_concat >= 202403L
45  auto new_indices = std::views::concat(
46  internal::smallest_pattern<scalar_type_of_t<T>>(std::ranges::views::take(indices, 2)),
47  indices | std::ranges::views::drop(2));
48 #else
49  auto it = stdex::ranges::begin(descriptors);
50  auto new_descriptors = std::vector<std::decay_t<decltype(*it)>>{};
51  auto i0 = it;
52  auto i1 = ++it;
53  if (i1 == end(descriptors))
54  {
55  new_descriptors.emplace_back(coordinates::Axis{});
56  }
57  else if (i0 != end(descriptors))
58  {
59  auto d0 = internal::smallest_pattern<scalar_type_of_t<T>>(*i0, *i1);
60  new_descriptors.emplace_back(d0);
61  std::copy(++it, stdex::ranges::end(descriptors), ++stdex::ranges::begin(new_descriptors));
62  }
63 #endif
64  return make_constant<T>(std::forward<C>(c), new_descriptors);
65  }
66  }
67 
68 }
69 
70 #endif
Definition for pattern_collection.
Definition for coordinates::pattern.
Dimensions< 1 > Axis
Alias for a 1D Euclidean coordinates::pattern object.
Definition: Dimensions.hpp:171
Definition: basics.hpp:48