IDS peak genericC++ v1.17.0
Loading...
Searching...
No Matches
peak_enumeration_node.hpp
Go to the documentation of this file.
1
6
7#pragma once
8
10
12#include <peak/dll_interface/peak_dll_interface_util.hpp>
15
16#include <type_traits>
17#include <algorithm>
18#include <cstddef>
19#include <cstdint>
20#include <string>
21#include <vector>
22
23
24namespace peak
25{
26namespace core
27{
28namespace nodes
29{
30
36class EnumerationNode : public Node
37{
38public:
39 static constexpr auto NodeType = nodes::NodeType::Enumeration;
40 using NodeDataType = std::string;
41 using NodeHasRange = std::false_type;
42
43 EnumerationNode() = delete;
44 ~EnumerationNode() override = default;
45 EnumerationNode(const EnumerationNode& other) = delete;
46 EnumerationNode& operator=(const EnumerationNode& other) = delete;
49
63 PEAK_COMMON_NO_DISCARD std::shared_ptr<EnumerationEntryNode> CurrentEntry(
65
77 void SetCurrentEntry(const std::shared_ptr<EnumerationEntryNode>& entry);
78
90 void SetCurrentEntry(const std::string& symbolicValue);
91
103 void SetCurrentEntry(int64_t value);
104
118 PEAK_COMMON_NO_DISCARD bool HasEntry(const std::string& symbolicValue) const;
119
132 PEAK_COMMON_NO_DISCARD bool HasEntry(int64_t value) const;
133
147 PEAK_COMMON_NO_DISCARD std::shared_ptr<EnumerationEntryNode> FindEntry(const std::string& symbolicValue) const;
148
162 PEAK_COMMON_NO_DISCARD std::shared_ptr<EnumerationEntryNode> FindEntry(int64_t value) const;
163
175 PEAK_COMMON_NO_DISCARD std::shared_ptr<EnumerationEntryNode> TryFindEntry(
176 const std::string& symbolicValue) const;
177
189 PEAK_COMMON_NO_DISCARD std::shared_ptr<EnumerationEntryNode> TryFindEntry(const int64_t value) const;
190
200 PEAK_COMMON_NO_DISCARD std::vector<std::shared_ptr<EnumerationEntryNode>> Entries() const;
201
211 PEAK_COMMON_NO_DISCARD std::vector<std::string> SymbolicValues() const;
212
222 PEAK_COMMON_NO_DISCARD std::vector<std::shared_ptr<EnumerationEntryNode>> AvailableEntries() const;
223
233 PEAK_COMMON_NO_DISCARD std::vector<std::string> AvailableSymbolicValues() const;
234
235private:
236 friend ClassCreator<EnumerationNode>;
237 EnumerationNode(PEAK_ENUMERATION_NODE_HANDLE enumerationNodeHandle, const std::weak_ptr<NodeMap>& parentNodeMap);
238 PEAK_ENUMERATION_NODE_HANDLE m_backendHandle;
239};
240
241} /* namespace nodes */
242} /* namespace core */
243} /* namespace peak */
244
245/* Implementation */
246namespace peak
247{
248namespace core
249{
250namespace nodes
251{
252
254 PEAK_ENUMERATION_NODE_HANDLE enumerationNodeHandle, const std::weak_ptr<NodeMap>& parentNodeMap)
255 : Node(QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* nodeHandle) {
256 return PEAK_C_ABI_PREFIX PEAK_EnumerationNode_ToNode(enumerationNodeHandle, nodeHandle);
257 }),
258 parentNodeMap)
259 , m_backendHandle(enumerationNodeHandle)
260{}
261
262inline std::shared_ptr<EnumerationEntryNode> EnumerationNode::CurrentEntry(
263 NodeCacheUsePolicy cacheUsePolicy /* = NodeCacheUsePolicy::UseCache */) const
264{
265 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
266 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
268 static_cast<PEAK_NODE_CACHE_USE_POLICY>(cacheUsePolicy), _enumerationEntryNodeHandle);
269 });
270
271 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* _nodeHandle) {
272 return PEAK_C_ABI_PREFIX PEAK_EnumerationEntryNode_ToNode(enumerationEntryNodeHandle, _nodeHandle);
273 });
274
275 auto nodeName = GetNodeName(nodeHandle);
276
277 return std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName));
278}
279
280inline void EnumerationNode::SetCurrentEntry(const std::shared_ptr<EnumerationEntryNode>& entry)
281{
282 if (entry == nullptr)
283 {
284 throw InvalidArgumentException("The given entry is a nullptr!");
285 }
286
287 CallAndCheckCInterfaceFunction([&] {
288 return PEAK_C_ABI_PREFIX PEAK_EnumerationNode_SetCurrentEntry(m_backendHandle, entry->m_backendHandle);
289 });
290}
291
292inline void EnumerationNode::SetCurrentEntry(const std::string& symbolicValue)
293{
294 CallAndCheckCInterfaceFunction([&] {
296 m_backendHandle, symbolicValue.c_str(), symbolicValue.size() + 1);
297 });
298}
299
300inline void EnumerationNode::SetCurrentEntry(int64_t value)
301{
302 CallAndCheckCInterfaceFunction(
303 [&] { return PEAK_C_ABI_PREFIX PEAK_EnumerationNode_SetCurrentEntryByValue(m_backendHandle, value); });
304}
305
306inline bool EnumerationNode::HasEntry(const std::string& symbolicValue) const
307{
308 return QueryNumericFromCInterfaceFunction<PEAK_BOOL8>([&](PEAK_BOOL8* hasEntry) {
310 m_backendHandle, symbolicValue.c_str(), symbolicValue.size() + 1, hasEntry);
311 }) > 0;
312}
313
314inline bool EnumerationNode::HasEntry(int64_t value) const
315{
316 return QueryNumericFromCInterfaceFunction<PEAK_BOOL8>([&](PEAK_BOOL8* hasEntry) {
317 return PEAK_C_ABI_PREFIX PEAK_EnumerationNode_GetHasEntryByValue(m_backendHandle, value, hasEntry);
318 }) > 0;
319}
320
321inline std::shared_ptr<EnumerationEntryNode> EnumerationNode::FindEntry(const std::string& symbolicValue) const
322{
323 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
324 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
326 m_backendHandle, symbolicValue.c_str(), symbolicValue.size() + 1, _enumerationEntryNodeHandle);
327 });
328
329 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* _nodeHandle) {
330 return PEAK_C_ABI_PREFIX PEAK_EnumerationEntryNode_ToNode(enumerationEntryNodeHandle, _nodeHandle);
331 });
332
333 auto nodeName = GetNodeName(nodeHandle);
334
335 return std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName));
336}
337
338inline std::shared_ptr<EnumerationEntryNode> EnumerationNode::FindEntry(int64_t value) const
339{
340 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
341 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
343 m_backendHandle, value, _enumerationEntryNodeHandle);
344 });
345
346 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* _nodeHandle) {
347 return PEAK_C_ABI_PREFIX PEAK_EnumerationEntryNode_ToNode(enumerationEntryNodeHandle, _nodeHandle);
348 });
349
350 auto nodeName = GetNodeName(nodeHandle);
351
352 return std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName));
353}
354
355
356inline std::shared_ptr<EnumerationEntryNode> EnumerationNode::TryFindEntry(const std::string& symbolicValue) const
357{
358 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
359 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
361 m_backendHandle, symbolicValue.c_str(), symbolicValue.size() + 1, _enumerationEntryNodeHandle);
362 });
363
364 if (enumerationEntryNodeHandle == nullptr)
365 {
366 return nullptr;
367 }
368
369 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* _nodeHandle) {
370 return PEAK_C_ABI_PREFIX PEAK_EnumerationEntryNode_ToNode(enumerationEntryNodeHandle, _nodeHandle);
371 });
372
373 auto nodeName = GetNodeName(nodeHandle);
374
375 return std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName));
376}
377
378inline std::shared_ptr<EnumerationEntryNode> EnumerationNode::TryFindEntry(const int64_t value) const
379{
380 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
381 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
383 m_backendHandle, value, _enumerationEntryNodeHandle);
384 });
385
386 if (enumerationEntryNodeHandle == nullptr)
387 {
388 return nullptr;
389 }
390
391 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* _nodeHandle) {
392 return PEAK_C_ABI_PREFIX PEAK_EnumerationEntryNode_ToNode(enumerationEntryNodeHandle, _nodeHandle);
393 });
394
395 auto nodeName = GetNodeName(nodeHandle);
396
397 return std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName));
398}
399
400inline std::vector<std::shared_ptr<EnumerationEntryNode>> EnumerationNode::Entries() const
401{
402 auto numEntries = QueryNumericFromCInterfaceFunction<size_t>([&](size_t* _numEntries) {
403 return PEAK_C_ABI_PREFIX PEAK_EnumerationNode_GetNumEntries(m_backendHandle, _numEntries);
404 });
405
406 std::vector<std::shared_ptr<EnumerationEntryNode>> entries;
407 for (size_t x = 0; x < numEntries; ++x)
408 {
409 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
410 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
412 m_backendHandle, x, _enumerationEntryNodeHandle);
413 });
414
415 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>(
416 [&](PEAK_NODE_HANDLE* _nodeHandle) {
418 enumerationEntryNodeHandle, _nodeHandle);
419 });
420
421 auto nodeName = GetNodeName(nodeHandle);
422
423 entries.emplace_back(std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName)));
424 }
425
426 return entries;
427}
428
429inline std::vector<std::string> EnumerationNode::SymbolicValues() const
430{
431 std::vector<std::string> result;
432 const auto& entries = Entries();
433 result.reserve(entries.size());
434 std::transform(entries.begin(), entries.end(), std::back_inserter(result),
435 [](const auto& entry) { return entry->SymbolicValue(); });
436 return result;
437}
438
439inline std::vector<std::shared_ptr<EnumerationEntryNode>> EnumerationNode::AvailableEntries() const
440{
441 const auto& entries = Entries();
442 std::vector<std::shared_ptr<EnumerationEntryNode>> availableEntries{};
443 std::copy_if(entries.begin(), entries.end(), std::back_inserter(availableEntries),
444 [](const std::shared_ptr<EnumerationEntryNode>& entry) { return entry->IsAvailable(); });
445 return availableEntries;
446}
447
448inline std::vector<std::string> EnumerationNode::AvailableSymbolicValues() const
449{
450 std::vector<std::string> result;
451 const auto& entries = AvailableEntries();
452 result.reserve(entries.size());
453 std::transform(entries.begin(), entries.end(), std::back_inserter(result),
454 [](const auto& entry) { return entry->SymbolicValue(); });
455 return result;
456}
457
458} /* namespace nodes */
459} /* namespace core */
460} /* namespace peak */
The exception thrown for passing an invalid argument to a function.
Definition peak_exception.hpp:118
EnumerationNode & operator=(const EnumerationNode &other)=delete
PEAK_COMMON_NO_DISCARD std::vector< std::shared_ptr< EnumerationEntryNode > > AvailableEntries() const
Returns the currently selectable entries.
Definition peak_enumeration_node.hpp:439
PEAK_COMMON_NO_DISCARD std::vector< std::shared_ptr< EnumerationEntryNode > > Entries() const
Returns the entries.
Definition peak_enumeration_node.hpp:400
void SetCurrentEntry(const std::shared_ptr< EnumerationEntryNode > &entry)
Sets the current entry.
Definition peak_enumeration_node.hpp:280
PEAK_COMMON_NO_DISCARD std::shared_ptr< EnumerationEntryNode > CurrentEntry(NodeCacheUsePolicy cacheUsePolicy=NodeCacheUsePolicy::UseCache) const
Returns the current entry.
Definition peak_enumeration_node.hpp:262
~EnumerationNode() override=default
EnumerationNode & operator=(EnumerationNode &&other)=delete
PEAK_COMMON_NO_DISCARD std::shared_ptr< EnumerationEntryNode > FindEntry(const std::string &symbolicValue) const
Finds an entry with the given symbolic value.
Definition peak_enumeration_node.hpp:321
PEAK_COMMON_NO_DISCARD std::vector< std::string > AvailableSymbolicValues() const
Returns the symbolic values of currently selectable entries.
Definition peak_enumeration_node.hpp:448
PEAK_COMMON_NO_DISCARD 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:306
static constexpr auto NodeType
Definition peak_enumeration_node.hpp:39
EnumerationNode(EnumerationNode &&other)=delete
std::string NodeDataType
Definition peak_enumeration_node.hpp:40
EnumerationNode(const EnumerationNode &other)=delete
PEAK_COMMON_NO_DISCARD std::vector< std::string > SymbolicValues() const
Returns the symbolic values of all entries.
Definition peak_enumeration_node.hpp:429
PEAK_COMMON_NO_DISCARD 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:356
std::false_type NodeHasRange
Definition peak_enumeration_node.hpp:41
PEAK_COMMON_NO_DISCARD std::shared_ptr< NodeMap > ParentNodeMap() const
Returns the parent node map.
Definition peak_node.hpp:969
NodeCacheUsePolicy
Defines how node value access should interact with the internal cache.
Definition peak_common_node_enums.hpp:36
@ Enumeration
Definition peak_node.hpp:96
@ UseCache
Definition peak_common_node_enums.hpp:38
The "nodes" namespace contains all GenAPI node types.
Definition peak_utils.hpp:31
std::string GetNodeName(PEAK_NODE_HANDLE nodeHandle)
Definition peak_node.hpp:657
The "core" namespace contains the direct GenAPI and GenTL wrapper.
Definition peak_buffer.hpp:32
The "peak" namespace directly contains convenience functionality like the DeviceManager as well as th...
Definition peak_buffer.hpp:29
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:459
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:427
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:240
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:41
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:463
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_COMMON_NO_DISCARD
Definition peak_common_defines.h:89
#define PEAK_C_ABI_PREFIX
Definition peak_dll_defines.h:13