Compute Graph Framework SDK Reference  5.8
TypeBasedParameterProvider.hpp
Go to the documentation of this file.
1
2//
3// Notice
4// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES
5// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO
6// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT,
7// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8//
9// NVIDIA CORPORATION & AFFILIATES assumes no responsibility for the consequences of use of such
10// information or for any infringement of patents or other rights of third parties that may
11// result from its use. No license is granted by implication or otherwise under any patent
12// or patent rights of NVIDIA CORPORATION & AFFILIATES. No third party distribution is allowed unless
13// expressly authorized by NVIDIA. Details are subject to change without notice.
14// This code supersedes and replaces all information previously supplied.
15// NVIDIA CORPORATION & AFFILIATES products are not authorized for use as critical
16// components in life support devices or systems without express written approval of
17// NVIDIA CORPORATION & AFFILIATES.
18//
19// SPDX-FileCopyrightText: Copyright (c) 2021-2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
20// SPDX-License-Identifier: LicenseRef-NvidiaProprietary
21//
22// NVIDIA CORPORATION, its affiliates and licensors retain all intellectual
23// property and proprietary rights in and to this material, related
24// documentation and any modifications thereto. Any use, reproduction,
25// disclosure or distribution of this material and related documentation
26// without an express license agreement from NVIDIA CORPORATION or
27// its affiliates is strictly prohibited.
28//
30
31#ifndef DW_FRAMEWORK_TYPEBASEDPARAMETERPROVIDER_HPP_
32#define DW_FRAMEWORK_TYPEBASEDPARAMETERPROVIDER_HPP_
33
35
36#include <dw/core/container/VectorFixed.hpp>
37#include <dwcgf/Exception.hpp>
38
39#include <typeindex>
40#include <utility>
41
42namespace dw
43{
44namespace framework
45{
46
47class TypeBasedParameterProvider;
48
51{
52protected:
61
62public:
68 virtual void registerAt(TypeBasedParameterProvider& provider) const = 0;
69};
70
73{
74protected:
83
84public:
88 ~TypeBasedParameterProvider() override = default;
89
91 bool get(
92 ParameterProvider const* const parentProvider,
93 dw::core::StringView const& key,
94 const std::type_info& semanticTypeInfo,
95 const std::type_info& dataTypeInfo,
96 void* out) const override;
97
99 bool get(
100 ParameterProvider const* const parentProvider,
101 dw::core::StringView const& key,
102 size_t const index,
103 const std::type_info& semanticTypeInfo,
104 const std::type_info& dataTypeInfo,
105 void* out) const override;
106
110 template <typename T>
112 {
113 registerProvider(typeid(T), provider);
114 }
115
117 template <typename T>
119 {
120 return getProvider(typeid(T));
121 }
122
123protected:
125 void registerProvider(const std::type_info& typeInfo, const ParameterProvider* provider);
126
128 const ParameterProvider* getProvider(const std::type_info& typeInfo) const;
129
130private:
132 // Can't use std::type_index since on QNX two type_info/index of the same type
133 // might not compare equal to each other / have different hashes
134 dw::core::VectorFixed<std::pair<const std::type_info&, const ParameterProvider*>, 256> m_providers;
136
137public:
141 template <typename T>
142 void registerProviderChild(const T& providerChild)
143 {
144 registerProviderChild(typeid(T), providerChild);
145 }
146
148 template <typename T>
150 {
151 return getProviderChild(typeid(T));
152 }
153
155 void registerProviderChild(const std::type_info& typeInfo, const ITypeBasedParameterProviderChild& providerChild);
156
157protected:
159 const ITypeBasedParameterProviderChild* getProviderChild(const std::type_info& typeInfo) const;
160
161private:
163 // Can't use std::type_index since on QNX two type_info/index of the same type
164 // might not compare equal to each other / have different hashes
165 dw::core::VectorFixed<std::pair<const std::type_info&, const ITypeBasedParameterProviderChild&>, 256> m_providerChildren;
167
168public:
172 using ParameterByNameHandler = std::function<bool(dw::core::StringView const&, void*)>;
173
175 template <typename T>
177 {
178 registerByNameHandler<T, T>(std::move(handler));
179 }
180
182 template <typename T, typename S>
184 {
185 registerByNameHandler(typeid(T), typeid(S), std::move(handler));
186 }
187
188protected:
190 void registerByNameHandler(const std::type_info& dataTypeInfo, const std::type_info& semanticTypeInfo, ParameterByNameHandler&& handler);
191
193 ParameterByNameHandler const* getByNameHandler(const std::type_info& dataTypeInfo, const std::type_info& semanticTypeInfo) const;
194
195private:
197 // Can't use std::type_index since on QNX two type_info/index of the same type
198 // might not compare equal to each other / have different hashes
199 dw::core::VectorFixed<std::pair<std::pair<const std::type_info&, const std::type_info&>, ParameterByNameHandler>, 256> m_byNameHandlers;
201
202public:
206 using ParameterByNameAndIndexHandler = std::function<bool(dw::core::StringView const&, size_t, void*)>;
207
209 template <typename T>
211 {
212 registerByNameAndIndexHandler<T, T>(std::move(handler));
213 }
214
216 template <typename T, typename S>
218 {
219 registerByNameAndIndexHandler(typeid(T), typeid(S), std::move(handler));
220 }
221
222protected:
224 void registerByNameAndIndexHandler(const std::type_info& dataTypeInfo, const std::type_info& semanticTypeInfo, ParameterByNameAndIndexHandler&& handler);
225
227 ParameterByNameAndIndexHandler const* getByNameAndIndexHandler(const std::type_info& dataTypeInfo, const std::type_info& semanticTypeInfo) const;
228
229private:
231 // Can't use std::type_index since on QNX two type_info/index of the same type
232 // might not compare equal to each other / have different hashes
233 dw::core::VectorFixed<std::pair<std::pair<const std::type_info&, const std::type_info&>, ParameterByNameAndIndexHandler>, 256> m_byNameAndIndexHandlers;
235
236public:
240 using ParameterByIndexHandler = std::function<bool(size_t, void*)>;
241
243 template <typename T>
245 {
246 registerByIndexHandler<T, T>(std::move(handler));
247 }
248
250 template <typename T, typename S>
252 {
253 registerByIndexHandler(typeid(T), typeid(S), std::move(handler));
254 }
255
256protected:
258 void registerByIndexHandler(const std::type_info& dataTypeInfo, const std::type_info& semanticTypeInfo, ParameterByIndexHandler&& handler);
259
261 ParameterByIndexHandler const* getByIndexHandler(const std::type_info& dataTypeInfo, const std::type_info& semanticTypeInfo) const;
262
263private:
265 // Can't use std::type_index since on QNX two type_info/index of the same type
266 // might not compare equal to each other / have different hashes
267 dw::core::VectorFixed<std::pair<std::pair<const std::type_info&, const std::type_info&>, ParameterByIndexHandler>, 256> m_byIndexHandlers;
269
270public:
274 using ParameterByTypeHandler = std::function<bool(void*)>;
275
277 template <typename T>
279 {
280 registerByTypeHandler<T, T>(std::move(handler));
281 }
282
284 template <typename T, typename S>
286 {
287 registerByTypeHandler(typeid(T), typeid(S), std::move(handler));
288 }
289
290protected:
292 void registerByTypeHandler(const std::type_info& dataTypeInfo, const std::type_info& semanticTypeInfo, ParameterByTypeHandler&& handler);
293
295 ParameterByTypeHandler const* getByTypeHandler(const std::type_info& dataTypeInfo, const std::type_info& semanticTypeInfo) const;
296
297private:
299 // Can't use std::type_index since on QNX two type_info/index of the same type
300 // might not compare equal to each other / have different hashes
301 dw::core::VectorFixed<std::pair<std::pair<const std::type_info&, const std::type_info&>, ParameterByTypeHandler>, 256> m_byTypeHandlers;
303
304protected:
311 static bool isPairEqual(const std::pair<const std::type_info&, const std::type_info&>& lhs, const std::pair<const std::type_info&, const std::type_info&>& rhs);
312};
313
314} // namespace framework
315} // namespace dw
316
317#endif // DW_FRAMEWORK_TYPEBASEDPARAMETERPROVIDER_HPP_
The additional interface a ParameterProvider can implement so it can be registered at a TypeBasedPara...
ITypeBasedParameterProviderChild & operator=(ITypeBasedParameterProviderChild &&) &=default
Move assignment operator.
ITypeBasedParameterProviderChild & operator=(ITypeBasedParameterProviderChild const &) &=default
Copy assignment operator.
ITypeBasedParameterProviderChild(ITypeBasedParameterProviderChild &&)=default
Move constructor.
virtual ~ITypeBasedParameterProviderChild()=default
Destructor.
virtual void registerAt(TypeBasedParameterProvider &provider) const =0
Register handlers implemented in this parameter provider at the passed type base parameter provider.
ITypeBasedParameterProviderChild()=default
Default constructor.
ITypeBasedParameterProviderChild(ITypeBasedParameterProviderChild const &)=default
Copy constructor.
The interface to access parameter values identified by name and/or (semantic) type.
A parameter provider which dispatches the retrieval of the parameter value to registered handlers whi...
void registerByIndexHandler(const std::type_info &dataTypeInfo, const std::type_info &semanticTypeInfo, ParameterByIndexHandler &&handler)
Register the handler function.
void registerByIndexHandler(ParameterByIndexHandler &&handler)
Register the handler function for the template type T and the semantic template type S.
ParameterByNameAndIndexHandler const * getByNameAndIndexHandler(const std::type_info &dataTypeInfo, const std::type_info &semanticTypeInfo) const
Get the handler function.
void registerByNameAndIndexHandler(ParameterByNameAndIndexHandler &&handler)
Register the handler function for the template type T and the semantic template type S.
const ITypeBasedParameterProviderChild * getProviderChild() const
Get the provider child for the template type T.
std::function< bool(size_t, void *)> ParameterByIndexHandler
bool get(ParameterProvider const *const parentProvider, dw::core::StringView const &key, const std::type_info &semanticTypeInfo, const std::type_info &dataTypeInfo, void *out) const override
ParameterByTypeHandler const * getByTypeHandler(const std::type_info &dataTypeInfo, const std::type_info &semanticTypeInfo) const
Get the handler function.
void registerProviderChild(const std::type_info &typeInfo, const ITypeBasedParameterProviderChild &providerChild)
Register the parameter provider child .
TypeBasedParameterProvider & operator=(TypeBasedParameterProvider const &) &=default
Copy assignment operator.
void registerByTypeHandler(ParameterByTypeHandler &&handler)
Register the handler function for the template type T.
~TypeBasedParameterProvider() override=default
Destructor.
const ITypeBasedParameterProviderChild * getProviderChild(const std::type_info &typeInfo) const
Get the parameter provider child.
static bool isPairEqual(const std::pair< const std::type_info &, const std::type_info & > &lhs, const std::pair< const std::type_info &, const std::type_info & > &rhs)
TypeBasedParameterProvider(TypeBasedParameterProvider const &)=default
Copy constructor.
ParameterByNameHandler const * getByNameHandler(const std::type_info &dataTypeInfo, const std::type_info &semanticTypeInfo) const
Get the handler function.
TypeBasedParameterProvider(TypeBasedParameterProvider &&)=default
Move constructor.
const ParameterProvider * getProvider() const
Get the provider for the template type T.
ParameterByIndexHandler const * getByIndexHandler(const std::type_info &dataTypeInfo, const std::type_info &semanticTypeInfo) const
Get the handler function.
void registerByIndexHandler(ParameterByIndexHandler &&handler)
Register the handler function for the template type T.
void registerByNameAndIndexHandler(ParameterByNameAndIndexHandler &&handler)
Register the handler function for the template type T.
TypeBasedParameterProvider & operator=(TypeBasedParameterProvider &&) &=default
Move assignment operator.
void registerByTypeHandler(const std::type_info &dataTypeInfo, const std::type_info &semanticTypeInfo, ParameterByTypeHandler &&handler)
Register the handler function.
void registerByNameHandler(ParameterByNameHandler &&handler)
Register the handler function for the template type T.
std::function< bool(dw::core::StringView const &, size_t, void *)> ParameterByNameAndIndexHandler
void registerByTypeHandler(ParameterByTypeHandler &&handler)
Register the handler function for the template type T and the semantic template type S.
const ParameterProvider * getProvider(const std::type_info &typeInfo) const
Get the parameter provider.
TypeBasedParameterProvider()=default
Default constructor.
void registerByNameHandler(ParameterByNameHandler &&handler)
Register the handler function for the template type T and the semantic template type S.
bool get(ParameterProvider const *const parentProvider, dw::core::StringView const &key, size_t const index, const std::type_info &semanticTypeInfo, const std::type_info &dataTypeInfo, void *out) const override
void registerByNameAndIndexHandler(const std::type_info &dataTypeInfo, const std::type_info &semanticTypeInfo, ParameterByNameAndIndexHandler &&handler)
Register the handler function.
void registerByNameHandler(const std::type_info &dataTypeInfo, const std::type_info &semanticTypeInfo, ParameterByNameHandler &&handler)
Register the handler function.
std::function< bool(dw::core::StringView const &, void *)> ParameterByNameHandler
void registerProvider(const ParameterProvider *provider)
void registerProvider(const std::type_info &typeInfo, const ParameterProvider *provider)
Register the parameter provider.
Definition: Exception.hpp:47