IDS peak genericC++ v1.10.0
Loading...
Searching...
No Matches
peak_enumeration_node.hpp
Go to the documentation of this file.
1
11#pragma once
12
13
15#include <peak/dll_interface/peak_dll_interface_util.hpp>
18
19#include <algorithm>
20#include <cstddef>
21#include <cstdint>
22#include <string>
23#include <vector>
24
25
26namespace peak
27{
28namespace core
29{
30namespace nodes
31{
32
37class EnumerationNode : public Node
38{
39public:
40 EnumerationNode() = delete;
41 ~EnumerationNode() override = default;
42 EnumerationNode(const EnumerationNode& other) = delete;
43 EnumerationNode& operator=(const EnumerationNode& other) = delete;
46
59 std::shared_ptr<EnumerationEntryNode> CurrentEntry(
61
73 void SetCurrentEntry(const std::shared_ptr<EnumerationEntryNode>& entry);
74
86 void SetCurrentEntry(const std::string& symbolicValue);
87
99 void SetCurrentEntry(int64_t value);
100
110 bool HasEntry(const std::string& symbolicValue) const;
111
121 bool HasEntry(int64_t value) const;
122
136 std::shared_ptr<EnumerationEntryNode> FindEntry(const std::string& symbolicValue) const;
137
151 std::shared_ptr<EnumerationEntryNode> FindEntry(int64_t value) const;
152
164 std::shared_ptr<EnumerationEntryNode> TryFindEntry(const std::string& symbolicValue) const;
165
177 std::shared_ptr<EnumerationEntryNode> TryFindEntry(const int64_t value) const;
178
188 std::vector<std::shared_ptr<EnumerationEntryNode>> Entries() const;
189
199 std::vector<std::shared_ptr<EnumerationEntryNode>> AvailableEntries() const;
200
201private:
202 friend ClassCreator<EnumerationNode>;
203 EnumerationNode(PEAK_ENUMERATION_NODE_HANDLE enumerationNodeHandle, const std::weak_ptr<NodeMap>& parentNodeMap);
204 PEAK_ENUMERATION_NODE_HANDLE m_backendHandle;
205};
206
207} /* namespace nodes */
208} /* namespace core */
209} /* namespace peak */
210
211/* Implementation */
212namespace peak
213{
214namespace core
215{
216namespace nodes
217{
218
220 PEAK_ENUMERATION_NODE_HANDLE enumerationNodeHandle, const std::weak_ptr<NodeMap>& parentNodeMap)
221 : Node(QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* nodeHandle) {
222 return PEAK_C_ABI_PREFIX PEAK_EnumerationNode_ToNode(enumerationNodeHandle, nodeHandle);
223 }),
224 parentNodeMap)
225 , m_backendHandle(enumerationNodeHandle)
226{}
227
228inline std::shared_ptr<EnumerationEntryNode> EnumerationNode::CurrentEntry(
229 NodeCacheUsePolicy cacheUsePolicy /* = NodeCacheUsePolicy::UseCache */) const
230{
231 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
232 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
234 static_cast<PEAK_NODE_CACHE_USE_POLICY>(cacheUsePolicy), _enumerationEntryNodeHandle);
235 });
236
237 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* _nodeHandle) {
238 return PEAK_C_ABI_PREFIX PEAK_EnumerationEntryNode_ToNode(enumerationEntryNodeHandle, _nodeHandle);
239 });
240
241 auto nodeName = GetNodeName(nodeHandle);
242
243 return std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName));
244}
245
246inline void EnumerationNode::SetCurrentEntry(const std::shared_ptr<EnumerationEntryNode>& entry)
247{
248 if (entry == nullptr)
249 {
250 throw InvalidArgumentException("The given entry is a nullptr!");
251 }
252
253 CallAndCheckCInterfaceFunction([&] {
254 return PEAK_C_ABI_PREFIX PEAK_EnumerationNode_SetCurrentEntry(m_backendHandle, entry->m_backendHandle);
255 });
256}
257
258inline void EnumerationNode::SetCurrentEntry(const std::string& symbolicValue)
259{
260 CallAndCheckCInterfaceFunction([&] {
262 m_backendHandle, symbolicValue.c_str(), symbolicValue.size() + 1);
263 });
264}
265
266inline void EnumerationNode::SetCurrentEntry(int64_t value)
267{
268 CallAndCheckCInterfaceFunction(
269 [&] { return PEAK_C_ABI_PREFIX PEAK_EnumerationNode_SetCurrentEntryByValue(m_backendHandle, value); });
270}
271
272inline bool EnumerationNode::HasEntry(const std::string& symbolicValue) const
273{
274 return QueryNumericFromCInterfaceFunction<PEAK_BOOL8>([&](PEAK_BOOL8* hasEntry) {
276 m_backendHandle, symbolicValue.c_str(), symbolicValue.size() + 1, hasEntry);
277 }) > 0;
278}
279
280inline bool EnumerationNode::HasEntry(int64_t value) const
281{
282 return QueryNumericFromCInterfaceFunction<PEAK_BOOL8>([&](PEAK_BOOL8* hasEntry) {
283 return PEAK_C_ABI_PREFIX PEAK_EnumerationNode_GetHasEntryByValue(m_backendHandle, value, hasEntry);
284 }) > 0;
285}
286
287inline std::shared_ptr<EnumerationEntryNode> EnumerationNode::FindEntry(const std::string& symbolicValue) const
288{
289 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
290 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
292 m_backendHandle, symbolicValue.c_str(), symbolicValue.size() + 1, _enumerationEntryNodeHandle);
293 });
294
295 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* _nodeHandle) {
296 return PEAK_C_ABI_PREFIX PEAK_EnumerationEntryNode_ToNode(enumerationEntryNodeHandle, _nodeHandle);
297 });
298
299 auto nodeName = GetNodeName(nodeHandle);
300
301 return std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName));
302}
303
304inline std::shared_ptr<EnumerationEntryNode> EnumerationNode::FindEntry(int64_t value) const
305{
306 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
307 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
309 m_backendHandle, value, _enumerationEntryNodeHandle);
310 });
311
312 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* _nodeHandle) {
313 return PEAK_C_ABI_PREFIX PEAK_EnumerationEntryNode_ToNode(enumerationEntryNodeHandle, _nodeHandle);
314 });
315
316 auto nodeName = GetNodeName(nodeHandle);
317
318 return std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName));
319}
320
321
322inline std::shared_ptr<EnumerationEntryNode> EnumerationNode::TryFindEntry(const std::string& symbolicValue) const
323{
324 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
325 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
327 m_backendHandle, symbolicValue.c_str(), symbolicValue.size() + 1, _enumerationEntryNodeHandle);
328 });
329
330 if(enumerationEntryNodeHandle == nullptr)
331 {
332 return nullptr;
333 }
334
335 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* _nodeHandle) {
336 return PEAK_C_ABI_PREFIX PEAK_EnumerationEntryNode_ToNode(enumerationEntryNodeHandle, _nodeHandle);
337 });
338
339 auto nodeName = GetNodeName(nodeHandle);
340
341 return std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName));
342}
343
344inline std::shared_ptr<EnumerationEntryNode> EnumerationNode::TryFindEntry(const int64_t value) const
345{
346 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
347 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
349 m_backendHandle, value, _enumerationEntryNodeHandle);
350 });
351
352 if(enumerationEntryNodeHandle == nullptr)
353 {
354 return nullptr;
355 }
356
357 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* _nodeHandle) {
358 return PEAK_C_ABI_PREFIX PEAK_EnumerationEntryNode_ToNode(enumerationEntryNodeHandle, _nodeHandle);
359 });
360
361 auto nodeName = GetNodeName(nodeHandle);
362
363 return std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName));
364}
365
366inline std::vector<std::shared_ptr<EnumerationEntryNode>> EnumerationNode::Entries() const
367{
368 auto numEntries = QueryNumericFromCInterfaceFunction<size_t>([&](size_t* _numEntries) {
369 return PEAK_C_ABI_PREFIX PEAK_EnumerationNode_GetNumEntries(m_backendHandle, _numEntries);
370 });
371
372 std::vector<std::shared_ptr<EnumerationEntryNode>> entries;
373 for (size_t x = 0; x < numEntries; ++x)
374 {
375 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
376 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
378 m_backendHandle, x, _enumerationEntryNodeHandle);
379 });
380
381 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>(
382 [&](PEAK_NODE_HANDLE* _nodeHandle) {
384 enumerationEntryNodeHandle, _nodeHandle);
385 });
386
387 auto nodeName = GetNodeName(nodeHandle);
388
389 entries.emplace_back(std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName)));
390 }
391
392 return entries;
393}
394
395inline std::vector<std::shared_ptr<EnumerationEntryNode>> EnumerationNode::AvailableEntries() const
396{
397 const auto& entries = Entries();
398 std::vector<std::shared_ptr<EnumerationEntryNode>> availableEntries{};
399 std::copy_if(entries.begin(), entries.end(), std::back_inserter(availableEntries),
400 [](const std::shared_ptr<EnumerationEntryNode>& entry) { return entry->IsAvailable(); });
401 return availableEntries;
402}
403
404} /* namespace nodes */
405} /* namespace core */
406} /* namespace peak */
The exception thrown for passing an invalid argument to a function.
Definition peak_exception.hpp:74
Represents a GenAPI enumeration node.
Definition peak_enumeration_node.hpp:38
EnumerationNode & operator=(const EnumerationNode &other)=delete
std::vector< std::shared_ptr< EnumerationEntryNode > > AvailableEntries() const
Returns the currently selectable entries.
Definition peak_enumeration_node.hpp:395
std::vector< std::shared_ptr< EnumerationEntryNode > > Entries() const
Returns the entries.
Definition peak_enumeration_node.hpp:366
void SetCurrentEntry(const std::shared_ptr< EnumerationEntryNode > &entry)
Sets the current entry.
Definition peak_enumeration_node.hpp:246
std::shared_ptr< EnumerationEntryNode > CurrentEntry(NodeCacheUsePolicy cacheUsePolicy=NodeCacheUsePolicy::UseCache) const
Returns the current entry.
Definition peak_enumeration_node.hpp:228
~EnumerationNode() override=default
EnumerationNode & operator=(EnumerationNode &&other)=delete
std::shared_ptr< EnumerationEntryNode > FindEntry(const std::string &symbolicValue) const
Finds an entry with the given symbolic value.
Definition peak_enumeration_node.hpp:287
bool HasEntry(const std::string &symbolicValue) const
Checks whether the enumeration node contains an entry with the given symbolic value.
Definition peak_enumeration_node.hpp:272
EnumerationNode(EnumerationNode &&other)=delete
EnumerationNode(const EnumerationNode &other)=delete
std::shared_ptr< EnumerationEntryNode > TryFindEntry(const std::string &symbolicValue) const
Tries to find an entry with the given symbolic value.
Definition peak_enumeration_node.hpp:322
Represents a GenAPI node.
Definition peak_node.hpp:122
std::shared_ptr< NodeMap > ParentNodeMap() const
Returns the parent node map.
Definition peak_node.hpp:933
NodeCacheUsePolicy
Definition peak_common_node_enums.hpp:25
std::string GetNodeName(PEAK_NODE_HANDLE nodeHandle)
Definition peak_node.hpp:620
The "peak" namespace directly contains convenience functionality like the DeviceManager as well as th...
Definition peak_dynamic_loader.h:33
PEAK_C_API PEAK_EnumerationNode_FindEntryByValue(PEAK_ENUMERATION_NODE_HANDLE enumerationNodeHandle, int64_t value, PEAK_ENUMERATION_ENTRY_NODE_HANDLE *enumerationEntryNodeHandle)
Tells the given enumeration node to find an entry with the given value.
PEAK_C_API PEAK_EnumerationNode_GetHasEntryByValue(PEAK_ENUMERATION_NODE_HANDLE enumerationNodeHandle, int64_t value, PEAK_BOOL8 *hasEntry)
Asks the given enumeration node whether it has an entry with the given value.
PEAK_C_API PEAK_EnumerationNode_SetCurrentEntryByValue(PEAK_ENUMERATION_NODE_HANDLE enumerationNodeHandle, int64_t value)
Tells the given enumeration node to set its current entry by the given value.
PEAK_C_API PEAK_EnumerationNode_ToNode(PEAK_ENUMERATION_NODE_HANDLE enumerationNodeHandle, PEAK_NODE_HANDLE *nodeHandle)
Casts the given enumeration node to a node.
struct PEAK_ENUMERATION_NODE * PEAK_ENUMERATION_NODE_HANDLE
Definition peak_backend.h:461
PEAK_C_API PEAK_EnumerationEntryNode_ToNode(PEAK_ENUMERATION_ENTRY_NODE_HANDLE enumerationEntryNodeHandle, PEAK_NODE_HANDLE *nodeHandle)
Casts the given enumeration entry node to a node.
struct PEAK_NODE * PEAK_NODE_HANDLE
Definition peak_backend.h:429
PEAK_C_API PEAK_EnumerationNode_GetCurrentEntry(PEAK_ENUMERATION_NODE_HANDLE enumerationNodeHandle, PEAK_NODE_CACHE_USE_POLICY cacheUsePolicy, PEAK_ENUMERATION_ENTRY_NODE_HANDLE *enumerationEntryNodeHandle)
Asks the given enumeration node for its current entry.
int32_t PEAK_NODE_CACHE_USE_POLICY
Definition peak_backend.h:242
PEAK_C_API PEAK_EnumerationNode_TryFindEntryByValue(PEAK_ENUMERATION_NODE_HANDLE enumerationNodeHandle, int64_t value, PEAK_ENUMERATION_ENTRY_NODE_HANDLE *enumerationEntryNodeHandle)
Tells the given enumeration node to try to find an entry with the given value.
PEAK_C_API PEAK_EnumerationNode_GetHasEntryBySymbolicValue(PEAK_ENUMERATION_NODE_HANDLE enumerationNodeHandle, const char *symbolicValue, size_t symbolicValueSize, PEAK_BOOL8 *hasEntry)
Asks the given enumeration node whether it has an entry with the given symbolic value.
PEAK_C_API PEAK_EnumerationNode_SetCurrentEntry(PEAK_ENUMERATION_NODE_HANDLE enumerationNodeHandle, PEAK_ENUMERATION_ENTRY_NODE_HANDLE enumerationEntryNodeHandle)
Tells the given enumeration node to set its current entry to the given entry.
int8_t PEAK_BOOL8
Definition peak_backend.h:43
PEAK_C_API PEAK_EnumerationNode_GetEntry(PEAK_ENUMERATION_NODE_HANDLE enumerationNodeHandle, size_t index, PEAK_ENUMERATION_ENTRY_NODE_HANDLE *enumerationEntryNodeHandle)
Asks the given enumeration node for the entry with the given index.
struct PEAK_ENUMERATION_ENTRY_NODE * PEAK_ENUMERATION_ENTRY_NODE_HANDLE
Definition peak_backend.h:465
PEAK_C_API PEAK_EnumerationNode_FindEntryBySymbolicValue(PEAK_ENUMERATION_NODE_HANDLE enumerationNodeHandle, const char *symbolicValue, size_t symbolicValueSize, PEAK_ENUMERATION_ENTRY_NODE_HANDLE *enumerationEntryNodeHandle)
Tells the given enumeration node to find an entry with the given symbolic value.
PEAK_C_API PEAK_EnumerationNode_GetNumEntries(PEAK_ENUMERATION_NODE_HANDLE enumerationNodeHandle, size_t *numEntries)
Asks the given enumeration node for its number of entries.
PEAK_C_API PEAK_EnumerationNode_TryFindEntryBySymbolicValue(PEAK_ENUMERATION_NODE_HANDLE enumerationNodeHandle, const char *symbolicValue, size_t symbolicValueSize, PEAK_ENUMERATION_ENTRY_NODE_HANDLE *enumerationEntryNodeHandle)
Tells the given enumeration node to try to find an entry with the given symbolic value.
PEAK_C_API PEAK_EnumerationNode_SetCurrentEntryBySymbolicValue(PEAK_ENUMERATION_NODE_HANDLE enumerationNodeHandle, const char *symbolicValue, size_t symbolicValueSize)
Tells the given enumeration node to set its current entry by the given symbolic value.
#define PEAK_C_ABI_PREFIX
Definition peak_dll_defines.h:16