IDS peak genericC++ v1.16.0
Loading...
Searching...
No Matches
peak_enumeration_node.hpp
Go to the documentation of this file.
1
10
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#include <type_traits>
25
26
27namespace peak
28{
29namespace core
30{
31namespace nodes
32{
33
39class EnumerationNode : public Node
40{
41public:
42 static constexpr auto NodeType = nodes::NodeType::Enumeration;
43 using NodeDataType = std::string;
44 using NodeHasRange = std::false_type;
45
46 EnumerationNode() = delete;
47 ~EnumerationNode() override = default;
48 EnumerationNode(const EnumerationNode& other) = delete;
49 EnumerationNode& operator=(const EnumerationNode& other) = delete;
52
66 std::shared_ptr<EnumerationEntryNode> CurrentEntry(
68
80 void SetCurrentEntry(const std::shared_ptr<EnumerationEntryNode>& entry);
81
93 void SetCurrentEntry(const std::string& symbolicValue);
94
106 void SetCurrentEntry(int64_t value);
107
121 bool HasEntry(const std::string& symbolicValue) const;
122
135 bool HasEntry(int64_t value) const;
136
150 std::shared_ptr<EnumerationEntryNode> FindEntry(const std::string& symbolicValue) const;
151
165 std::shared_ptr<EnumerationEntryNode> FindEntry(int64_t value) const;
166
178 std::shared_ptr<EnumerationEntryNode> TryFindEntry(const std::string& symbolicValue) const;
179
191 std::shared_ptr<EnumerationEntryNode> TryFindEntry(const int64_t value) const;
192
202 std::vector<std::shared_ptr<EnumerationEntryNode>> Entries() const;
203
213 std::vector<std::shared_ptr<EnumerationEntryNode>> AvailableEntries() const;
214
215private:
216 friend ClassCreator<EnumerationNode>;
217 EnumerationNode(PEAK_ENUMERATION_NODE_HANDLE enumerationNodeHandle, const std::weak_ptr<NodeMap>& parentNodeMap);
218 PEAK_ENUMERATION_NODE_HANDLE m_backendHandle;
219};
220
221} /* namespace nodes */
222} /* namespace core */
223} /* namespace peak */
224
225/* Implementation */
226namespace peak
227{
228namespace core
229{
230namespace nodes
231{
232
234 PEAK_ENUMERATION_NODE_HANDLE enumerationNodeHandle, const std::weak_ptr<NodeMap>& parentNodeMap)
235 : Node(QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* nodeHandle) {
236 return PEAK_C_ABI_PREFIX PEAK_EnumerationNode_ToNode(enumerationNodeHandle, nodeHandle);
237 }),
238 parentNodeMap)
239 , m_backendHandle(enumerationNodeHandle)
240{}
241
242inline std::shared_ptr<EnumerationEntryNode> EnumerationNode::CurrentEntry(
243 NodeCacheUsePolicy cacheUsePolicy /* = NodeCacheUsePolicy::UseCache */) const
244{
245 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
246 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
248 static_cast<PEAK_NODE_CACHE_USE_POLICY>(cacheUsePolicy), _enumerationEntryNodeHandle);
249 });
250
251 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* _nodeHandle) {
252 return PEAK_C_ABI_PREFIX PEAK_EnumerationEntryNode_ToNode(enumerationEntryNodeHandle, _nodeHandle);
253 });
254
255 auto nodeName = GetNodeName(nodeHandle);
256
257 return std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName));
258}
259
260inline void EnumerationNode::SetCurrentEntry(const std::shared_ptr<EnumerationEntryNode>& entry)
261{
262 if (entry == nullptr)
263 {
264 throw InvalidArgumentException("The given entry is a nullptr!");
265 }
266
267 CallAndCheckCInterfaceFunction([&] {
268 return PEAK_C_ABI_PREFIX PEAK_EnumerationNode_SetCurrentEntry(m_backendHandle, entry->m_backendHandle);
269 });
270}
271
272inline void EnumerationNode::SetCurrentEntry(const std::string& symbolicValue)
273{
274 CallAndCheckCInterfaceFunction([&] {
276 m_backendHandle, symbolicValue.c_str(), symbolicValue.size() + 1);
277 });
278}
279
280inline void EnumerationNode::SetCurrentEntry(int64_t value)
281{
282 CallAndCheckCInterfaceFunction(
283 [&] { return PEAK_C_ABI_PREFIX PEAK_EnumerationNode_SetCurrentEntryByValue(m_backendHandle, value); });
284}
285
286inline bool EnumerationNode::HasEntry(const std::string& symbolicValue) const
287{
288 return QueryNumericFromCInterfaceFunction<PEAK_BOOL8>([&](PEAK_BOOL8* hasEntry) {
290 m_backendHandle, symbolicValue.c_str(), symbolicValue.size() + 1, hasEntry);
291 }) > 0;
292}
293
294inline bool EnumerationNode::HasEntry(int64_t value) const
295{
296 return QueryNumericFromCInterfaceFunction<PEAK_BOOL8>([&](PEAK_BOOL8* hasEntry) {
297 return PEAK_C_ABI_PREFIX PEAK_EnumerationNode_GetHasEntryByValue(m_backendHandle, value, hasEntry);
298 }) > 0;
299}
300
301inline std::shared_ptr<EnumerationEntryNode> EnumerationNode::FindEntry(const std::string& symbolicValue) const
302{
303 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
304 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
306 m_backendHandle, symbolicValue.c_str(), symbolicValue.size() + 1, _enumerationEntryNodeHandle);
307 });
308
309 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* _nodeHandle) {
310 return PEAK_C_ABI_PREFIX PEAK_EnumerationEntryNode_ToNode(enumerationEntryNodeHandle, _nodeHandle);
311 });
312
313 auto nodeName = GetNodeName(nodeHandle);
314
315 return std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName));
316}
317
318inline std::shared_ptr<EnumerationEntryNode> EnumerationNode::FindEntry(int64_t value) const
319{
320 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
321 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
323 m_backendHandle, value, _enumerationEntryNodeHandle);
324 });
325
326 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* _nodeHandle) {
327 return PEAK_C_ABI_PREFIX PEAK_EnumerationEntryNode_ToNode(enumerationEntryNodeHandle, _nodeHandle);
328 });
329
330 auto nodeName = GetNodeName(nodeHandle);
331
332 return std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName));
333}
334
335
336inline std::shared_ptr<EnumerationEntryNode> EnumerationNode::TryFindEntry(const std::string& symbolicValue) const
337{
338 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
339 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
341 m_backendHandle, symbolicValue.c_str(), symbolicValue.size() + 1, _enumerationEntryNodeHandle);
342 });
343
344 if(enumerationEntryNodeHandle == nullptr)
345 {
346 return nullptr;
347 }
348
349 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* _nodeHandle) {
350 return PEAK_C_ABI_PREFIX PEAK_EnumerationEntryNode_ToNode(enumerationEntryNodeHandle, _nodeHandle);
351 });
352
353 auto nodeName = GetNodeName(nodeHandle);
354
355 return std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName));
356}
357
358inline std::shared_ptr<EnumerationEntryNode> EnumerationNode::TryFindEntry(const int64_t value) const
359{
360 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
361 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
363 m_backendHandle, value, _enumerationEntryNodeHandle);
364 });
365
366 if(enumerationEntryNodeHandle == nullptr)
367 {
368 return nullptr;
369 }
370
371 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* _nodeHandle) {
372 return PEAK_C_ABI_PREFIX PEAK_EnumerationEntryNode_ToNode(enumerationEntryNodeHandle, _nodeHandle);
373 });
374
375 auto nodeName = GetNodeName(nodeHandle);
376
377 return std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName));
378}
379
380inline std::vector<std::shared_ptr<EnumerationEntryNode>> EnumerationNode::Entries() const
381{
382 auto numEntries = QueryNumericFromCInterfaceFunction<size_t>([&](size_t* _numEntries) {
383 return PEAK_C_ABI_PREFIX PEAK_EnumerationNode_GetNumEntries(m_backendHandle, _numEntries);
384 });
385
386 std::vector<std::shared_ptr<EnumerationEntryNode>> entries;
387 for (size_t x = 0; x < numEntries; ++x)
388 {
389 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
390 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
392 m_backendHandle, x, _enumerationEntryNodeHandle);
393 });
394
395 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>(
396 [&](PEAK_NODE_HANDLE* _nodeHandle) {
398 enumerationEntryNodeHandle, _nodeHandle);
399 });
400
401 auto nodeName = GetNodeName(nodeHandle);
402
403 entries.emplace_back(std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName)));
404 }
405
406 return entries;
407}
408
409inline std::vector<std::shared_ptr<EnumerationEntryNode>> EnumerationNode::AvailableEntries() const
410{
411 const auto& entries = Entries();
412 std::vector<std::shared_ptr<EnumerationEntryNode>> availableEntries{};
413 std::copy_if(entries.begin(), entries.end(), std::back_inserter(availableEntries),
414 [](const std::shared_ptr<EnumerationEntryNode>& entry) { return entry->IsAvailable(); });
415 return availableEntries;
416}
417
418} /* namespace nodes */
419} /* namespace core */
420} /* namespace peak */
The exception thrown for passing an invalid argument to a function.
Definition peak_exception.hpp:116
EnumerationNode & operator=(const EnumerationNode &other)=delete
std::vector< std::shared_ptr< EnumerationEntryNode > > AvailableEntries() const
Returns the currently selectable entries.
Definition peak_enumeration_node.hpp:409
std::vector< std::shared_ptr< EnumerationEntryNode > > Entries() const
Returns the entries.
Definition peak_enumeration_node.hpp:380
void SetCurrentEntry(const std::shared_ptr< EnumerationEntryNode > &entry)
Sets the current entry.
Definition peak_enumeration_node.hpp:260
std::shared_ptr< EnumerationEntryNode > CurrentEntry(NodeCacheUsePolicy cacheUsePolicy=NodeCacheUsePolicy::UseCache) const
Returns the current entry.
Definition peak_enumeration_node.hpp:242
~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:301
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:286
static constexpr auto NodeType
Definition peak_enumeration_node.hpp:42
EnumerationNode(EnumerationNode &&other)=delete
std::string NodeDataType
Definition peak_enumeration_node.hpp:43
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:336
std::false_type NodeHasRange
Definition peak_enumeration_node.hpp:44
std::shared_ptr< NodeMap > ParentNodeMap() const
Returns the parent node map.
Definition peak_node.hpp:973
NodeCacheUsePolicy
Defines how node value access should interact with the internal cache.
Definition peak_common_node_enums.hpp:37
@ Enumeration
Definition peak_node.hpp:99
@ UseCache
Definition peak_common_node_enums.hpp:39
The "nodes" namespace contains all GenAPI node types.
Definition peak_boolean_node.hpp:26
std::string GetNodeName(PEAK_NODE_HANDLE nodeHandle)
Definition peak_node.hpp:660
The "core" namespace contains the direct GenAPI and GenTL wrapper.
Definition peak_buffer.hpp:34
The "peak" namespace directly contains convenience functionality like the DeviceManager as well as th...
Definition peak_dynamic_loader.h:35
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