IDS peak genericC++ v1.12.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
38class EnumerationNode : public Node
39{
40public:
41 static constexpr auto NodeType = nodes::NodeType::Enumeration;
42 using NodeDataType = std::string;
43 using NodeHasRange = std::false_type;
44
45 EnumerationNode() = delete;
46 ~EnumerationNode() override = default;
47 EnumerationNode(const EnumerationNode& other) = delete;
48 EnumerationNode& operator=(const EnumerationNode& other) = delete;
51
64 std::shared_ptr<EnumerationEntryNode> CurrentEntry(
66
78 void SetCurrentEntry(const std::shared_ptr<EnumerationEntryNode>& entry);
79
91 void SetCurrentEntry(const std::string& symbolicValue);
92
104 void SetCurrentEntry(int64_t value);
105
115 bool HasEntry(const std::string& symbolicValue) const;
116
126 bool HasEntry(int64_t value) const;
127
141 std::shared_ptr<EnumerationEntryNode> FindEntry(const std::string& symbolicValue) const;
142
156 std::shared_ptr<EnumerationEntryNode> FindEntry(int64_t value) const;
157
169 std::shared_ptr<EnumerationEntryNode> TryFindEntry(const std::string& symbolicValue) const;
170
182 std::shared_ptr<EnumerationEntryNode> TryFindEntry(const int64_t value) const;
183
193 std::vector<std::shared_ptr<EnumerationEntryNode>> Entries() const;
194
204 std::vector<std::shared_ptr<EnumerationEntryNode>> AvailableEntries() const;
205
206private:
207 friend ClassCreator<EnumerationNode>;
208 EnumerationNode(PEAK_ENUMERATION_NODE_HANDLE enumerationNodeHandle, const std::weak_ptr<NodeMap>& parentNodeMap);
209 PEAK_ENUMERATION_NODE_HANDLE m_backendHandle;
210};
211
212} /* namespace nodes */
213} /* namespace core */
214} /* namespace peak */
215
216/* Implementation */
217namespace peak
218{
219namespace core
220{
221namespace nodes
222{
223
225 PEAK_ENUMERATION_NODE_HANDLE enumerationNodeHandle, const std::weak_ptr<NodeMap>& parentNodeMap)
226 : Node(QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* nodeHandle) {
227 return PEAK_C_ABI_PREFIX PEAK_EnumerationNode_ToNode(enumerationNodeHandle, nodeHandle);
228 }),
229 parentNodeMap)
230 , m_backendHandle(enumerationNodeHandle)
231{}
232
233inline std::shared_ptr<EnumerationEntryNode> EnumerationNode::CurrentEntry(
234 NodeCacheUsePolicy cacheUsePolicy /* = NodeCacheUsePolicy::UseCache */) const
235{
236 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
237 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
239 static_cast<PEAK_NODE_CACHE_USE_POLICY>(cacheUsePolicy), _enumerationEntryNodeHandle);
240 });
241
242 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* _nodeHandle) {
243 return PEAK_C_ABI_PREFIX PEAK_EnumerationEntryNode_ToNode(enumerationEntryNodeHandle, _nodeHandle);
244 });
245
246 auto nodeName = GetNodeName(nodeHandle);
247
248 return std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName));
249}
250
251inline void EnumerationNode::SetCurrentEntry(const std::shared_ptr<EnumerationEntryNode>& entry)
252{
253 if (entry == nullptr)
254 {
255 throw InvalidArgumentException("The given entry is a nullptr!");
256 }
257
258 CallAndCheckCInterfaceFunction([&] {
259 return PEAK_C_ABI_PREFIX PEAK_EnumerationNode_SetCurrentEntry(m_backendHandle, entry->m_backendHandle);
260 });
261}
262
263inline void EnumerationNode::SetCurrentEntry(const std::string& symbolicValue)
264{
265 CallAndCheckCInterfaceFunction([&] {
267 m_backendHandle, symbolicValue.c_str(), symbolicValue.size() + 1);
268 });
269}
270
271inline void EnumerationNode::SetCurrentEntry(int64_t value)
272{
273 CallAndCheckCInterfaceFunction(
274 [&] { return PEAK_C_ABI_PREFIX PEAK_EnumerationNode_SetCurrentEntryByValue(m_backendHandle, value); });
275}
276
277inline bool EnumerationNode::HasEntry(const std::string& symbolicValue) const
278{
279 return QueryNumericFromCInterfaceFunction<PEAK_BOOL8>([&](PEAK_BOOL8* hasEntry) {
281 m_backendHandle, symbolicValue.c_str(), symbolicValue.size() + 1, hasEntry);
282 }) > 0;
283}
284
285inline bool EnumerationNode::HasEntry(int64_t value) const
286{
287 return QueryNumericFromCInterfaceFunction<PEAK_BOOL8>([&](PEAK_BOOL8* hasEntry) {
288 return PEAK_C_ABI_PREFIX PEAK_EnumerationNode_GetHasEntryByValue(m_backendHandle, value, hasEntry);
289 }) > 0;
290}
291
292inline std::shared_ptr<EnumerationEntryNode> EnumerationNode::FindEntry(const std::string& symbolicValue) const
293{
294 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
295 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
297 m_backendHandle, symbolicValue.c_str(), symbolicValue.size() + 1, _enumerationEntryNodeHandle);
298 });
299
300 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* _nodeHandle) {
301 return PEAK_C_ABI_PREFIX PEAK_EnumerationEntryNode_ToNode(enumerationEntryNodeHandle, _nodeHandle);
302 });
303
304 auto nodeName = GetNodeName(nodeHandle);
305
306 return std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName));
307}
308
309inline std::shared_ptr<EnumerationEntryNode> EnumerationNode::FindEntry(int64_t value) const
310{
311 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
312 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
314 m_backendHandle, value, _enumerationEntryNodeHandle);
315 });
316
317 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* _nodeHandle) {
318 return PEAK_C_ABI_PREFIX PEAK_EnumerationEntryNode_ToNode(enumerationEntryNodeHandle, _nodeHandle);
319 });
320
321 auto nodeName = GetNodeName(nodeHandle);
322
323 return std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName));
324}
325
326
327inline std::shared_ptr<EnumerationEntryNode> EnumerationNode::TryFindEntry(const std::string& symbolicValue) const
328{
329 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
330 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
332 m_backendHandle, symbolicValue.c_str(), symbolicValue.size() + 1, _enumerationEntryNodeHandle);
333 });
334
335 if(enumerationEntryNodeHandle == nullptr)
336 {
337 return nullptr;
338 }
339
340 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* _nodeHandle) {
341 return PEAK_C_ABI_PREFIX PEAK_EnumerationEntryNode_ToNode(enumerationEntryNodeHandle, _nodeHandle);
342 });
343
344 auto nodeName = GetNodeName(nodeHandle);
345
346 return std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName));
347}
348
349inline std::shared_ptr<EnumerationEntryNode> EnumerationNode::TryFindEntry(const int64_t value) const
350{
351 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
352 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
354 m_backendHandle, value, _enumerationEntryNodeHandle);
355 });
356
357 if(enumerationEntryNodeHandle == nullptr)
358 {
359 return nullptr;
360 }
361
362 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* _nodeHandle) {
363 return PEAK_C_ABI_PREFIX PEAK_EnumerationEntryNode_ToNode(enumerationEntryNodeHandle, _nodeHandle);
364 });
365
366 auto nodeName = GetNodeName(nodeHandle);
367
368 return std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName));
369}
370
371inline std::vector<std::shared_ptr<EnumerationEntryNode>> EnumerationNode::Entries() const
372{
373 auto numEntries = QueryNumericFromCInterfaceFunction<size_t>([&](size_t* _numEntries) {
374 return PEAK_C_ABI_PREFIX PEAK_EnumerationNode_GetNumEntries(m_backendHandle, _numEntries);
375 });
376
377 std::vector<std::shared_ptr<EnumerationEntryNode>> entries;
378 for (size_t x = 0; x < numEntries; ++x)
379 {
380 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
381 [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
383 m_backendHandle, x, _enumerationEntryNodeHandle);
384 });
385
386 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>(
387 [&](PEAK_NODE_HANDLE* _nodeHandle) {
389 enumerationEntryNodeHandle, _nodeHandle);
390 });
391
392 auto nodeName = GetNodeName(nodeHandle);
393
394 entries.emplace_back(std::dynamic_pointer_cast<EnumerationEntryNode>(ParentNodeMap()->FindNode(nodeName)));
395 }
396
397 return entries;
398}
399
400inline std::vector<std::shared_ptr<EnumerationEntryNode>> EnumerationNode::AvailableEntries() const
401{
402 const auto& entries = Entries();
403 std::vector<std::shared_ptr<EnumerationEntryNode>> availableEntries{};
404 std::copy_if(entries.begin(), entries.end(), std::back_inserter(availableEntries),
405 [](const std::shared_ptr<EnumerationEntryNode>& entry) { return entry->IsAvailable(); });
406 return availableEntries;
407}
408
409} /* namespace nodes */
410} /* namespace core */
411} /* namespace peak */
The exception thrown for passing an invalid argument to a function.
Definition peak_exception.hpp:109
EnumerationNode & operator=(const EnumerationNode &other)=delete
std::vector< std::shared_ptr< EnumerationEntryNode > > AvailableEntries() const
Returns the currently selectable entries.
Definition peak_enumeration_node.hpp:400
std::vector< std::shared_ptr< EnumerationEntryNode > > Entries() const
Returns the entries.
Definition peak_enumeration_node.hpp:371
void SetCurrentEntry(const std::shared_ptr< EnumerationEntryNode > &entry)
Sets the current entry.
Definition peak_enumeration_node.hpp:251
std::shared_ptr< EnumerationEntryNode > CurrentEntry(NodeCacheUsePolicy cacheUsePolicy=NodeCacheUsePolicy::UseCache) const
Returns the current entry.
Definition peak_enumeration_node.hpp:233
~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:292
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:277
static constexpr auto NodeType
Definition peak_enumeration_node.hpp:41
EnumerationNode(EnumerationNode &&other)=delete
std::string NodeDataType
Definition peak_enumeration_node.hpp:42
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:327
std::false_type NodeHasRange
Definition peak_enumeration_node.hpp:43
std::shared_ptr< NodeMap > ParentNodeMap() const
Returns the parent node map.
Definition peak_node.hpp:933
The "nodes" namespace contains all GenAPI node types.
Definition peak_boolean_node.hpp:26
@ Enumeration
Definition peak_node.hpp:95
NodeCacheUsePolicy
Definition peak_common_node_enums.hpp:25
@ UseCache
Definition peak_common_node_enums.hpp:26
std::string GetNodeName(PEAK_NODE_HANDLE nodeHandle)
Definition peak_node.hpp:620
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: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