Sequoia
Loading...
Searching...
No Matches
HeterogeneousNodeStorage.hpp
Go to the documentation of this file.
1
2// Copyright Oliver J. Rosten 2018. //
3// Distributed under the GNU GENERAL PUBLIC LICENSE, Version 3.0. //
4// (See accompanying file LICENSE.md or copy at //
5// https://www.gnu.org/licenses/gpl-3.0.en.html) //
7
8#pragma once
9
15#include <tuple>
16
17namespace sequoia::maths
18{
24
25 template<class... Ts>
27 {
28 public:
29 using size_type = std::size_t;
30
31 using heterogeneous_nodes_type = std::tuple<Ts...>;
32
34
35 template<class... Args>
36 requires (!resolve_to_copy_v<heterogeneous_node_storage, Args...>)
37 constexpr explicit(sizeof...(Args) == 1) heterogeneous_node_storage(Args&&... args) : m_Weights{std::forward<Args>(args)...}
38 {}
39
40 [[nodiscard]]
41 constexpr std::size_t size() const noexcept
42 {
43 return std::tuple_size_v<std::tuple<Ts...>>;
44 }
45
46 template<std::size_t I>
47 [[nodiscard]]
48 constexpr const auto& get_node_weight() const noexcept
49 {
50 return std::get<I>(m_Weights);
51 }
52
53 template<class T>
54 [[nodiscard]]
55 constexpr const auto& get_node_weight() const noexcept
56 {
57 return std::get<T>(m_Weights);
58 }
59
60 template<std::size_t I, class W>
61 constexpr void set_node_weight(W w)
62 {
63 std::get<I>(m_Weights) = std::move(w);
64 }
65
66 template<class T, class W>
67 constexpr void set_node_weight(W w)
68 {
69 std::get<T>(m_Weights) = std::move(w);
70 }
71
72 template<std::size_t I, class Fn>
73 constexpr decltype(auto) mutate_node_weight(Fn fn)
74 {
75 return fn(std::get<I>(m_Weights));
76 }
77
78 template<class T, class Fn>
79 constexpr decltype(auto) mutate_node_weight(Fn fn)
80 {
81 return fn(std::get<T>(m_Weights));
82 }
83
84 [[nodiscard]]
85 friend constexpr bool operator==(const heterogeneous_node_storage&, const heterogeneous_node_storage&) noexcept = default;
86
87 protected:
89
91
92 constexpr heterogeneous_node_storage(heterogeneous_node_storage&&) noexcept = default;
93
95
96 constexpr heterogeneous_node_storage& operator=(const heterogeneous_node_storage&) = default;
97
98 constexpr heterogeneous_node_storage& operator=(heterogeneous_node_storage&&) noexcept = default;
99 private:
100 std::tuple<Ts...> m_Weights;
101 };
102}
Definition: HeterogeneousNodeStorage.hpp:27
Storage for heterogeneous node weights.
Definition: HeterogeneousNodeStorage.hpp:23