tinyopt 700
Tinyopt, a lightweight, header only optimization library
Loading...
Searching...
No Matches
params_wrapper.h
1// Copyright 2026 Julien Michot.
2// SPDX-License-Identifier: Apache-2.0
3
4#pragma once
5
6#include <type_traits>
7#include <utility>
8
9#include <tinyopt/traits/parameter_traits.h>
10
11namespace tinyopt {
12
13template <typename Params>
14class ParamsWrapper {
15 public:
16 using WrappedParams = std::remove_cvref_t<Params>;
17 using Scalar = typename traits::params_trait<WrappedParams>::Scalar;
18 static constexpr Index Dims = Dynamic;
19
20 explicit ParamsWrapper(Params params) : params(std::forward<Params>(params)) {}
21
22 [[nodiscard]] Index dims() const {
23 if constexpr (traits::params_trait<WrappedParams>::Dims == Dynamic)
24 return traits::params_trait<WrappedParams>::dims(params);
25 else
26 return traits::params_trait<WrappedParams>::Dims;
27 }
28
29 template <typename T>
30 [[nodiscard]] auto cast() const {
31 auto casted = traits::params_trait<WrappedParams>::template cast<T>(params);
32 using CastParams = std::decay_t<decltype(casted)>;
33 return ParamsWrapper<CastParams>(std::move(casted));
34 }
35
36 ParamsWrapper& operator+=(const auto& delta) {
37 params += delta;
38 return *this;
39 }
40
41 Params params;
42};
43
44} // namespace tinyopt
Definition parameter_traits.h:15