IDS peak genericC++  v1.7.1
peak_node_map.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 <type_traits>
20 #include <unordered_map>
21 #include <algorithm>
22 #include <cstdint>
23 #include <functional>
24 #include <iterator>
25 #include <memory>
26 #include <mutex>
27 #include <string>
28 #include <vector>
29 
30 
31 namespace peak
32 {
33 namespace core
34 {
35 namespace nodes
36 {
37 
38 class BooleanNode;
39 class CategoryNode;
40 class CommandNode;
41 class EnumerationNode;
42 class EnumerationEntryNode;
43 class FloatNode;
44 class IntegerNode;
45 class Node;
46 class RegisterNode;
47 class StringNode;
48 
49 } // namespace nodes
50 
51 class Buffer;
52 
59 class NodeMap
60  : public InitOnce
61  , public std::enable_shared_from_this<NodeMap>
62 {
63 public:
65  using NodeFilterFunction = std::function<bool(const std::shared_ptr<const nodes::Node>& nodeToFilter)>;
66 
73  {
74  public:
75  ScopedNodeMapLock() = delete;
77  ScopedNodeMapLock(const ScopedNodeMapLock& other) = delete;
78  ScopedNodeMapLock& operator=(const ScopedNodeMapLock& other) = delete;
79  ScopedNodeMapLock(ScopedNodeMapLock&& other) = delete;
80  ScopedNodeMapLock& operator=(ScopedNodeMapLock&& other) = delete;
81 
82  private:
83  friend NodeMap;
84  friend ClassCreator<ScopedNodeMapLock>;
85  explicit ScopedNodeMapLock(const std::shared_ptr<NodeMap>& nodeMap);
86  std::shared_ptr<NodeMap> m_nodeMap;
87  };
88 
89  NodeMap() = delete;
90  ~NodeMap() = default;
91  NodeMap(const NodeMap& other) = delete;
92  NodeMap& operator=(const NodeMap& other) = delete;
93  NodeMap(NodeMap&& other) = delete;
94  NodeMap& operator=(NodeMap&& other) = delete;
95 
105  bool HasNode(const std::string& name) const;
106 
116  template <class NodeType, typename std::enable_if<std::is_base_of<nodes::Node, NodeType>::value, int>::type = 0>
117  bool HasNode(const std::string& name)
118  {
119  PEAK_NODE_HANDLE nodeHandle{ nullptr };
120  if (PEAK_C_ABI_PREFIX PEAK_NodeMap_FindNode(m_backendHandle, name.c_str(), name.size() + 1, &nodeHandle)
122  {
123  return false;
124  }
125 
126  return std::dynamic_pointer_cast<NodeType>(FindNode(name)) != nullptr;
127  }
128 
142  std::shared_ptr<nodes::Node> FindNode(const std::string& name);
143 
158  template <class NodeType, typename std::enable_if<std::is_base_of<nodes::Node, NodeType>::value, int>::type = 0>
159  std::shared_ptr<NodeType> FindNode(const std::string& name)
160  {
161  auto castedNode = std::dynamic_pointer_cast<NodeType>(FindNode(name));
162  if (!castedNode)
163  {
164  throw InvalidCastException("Invalid node cast!");
165  }
166 
167  return castedNode;
168  }
169 
177  void InvalidateNodes();
178 
188  void PollNodes(int64_t elapsedTime_ms);
189 
199  std::vector<std::shared_ptr<nodes::Node>> Nodes() const;
200 
211  bool HasBufferSupportedChunks(const std::shared_ptr<Buffer>& buffer) const;
212 
226  void UpdateChunkNodes(const std::shared_ptr<Buffer>& buffer);
227 
238  bool HasEventSupportedData(const std::unique_ptr<Event>& event) const;
239 
253  void UpdateEventNodes(const std::unique_ptr<Event>& event);
254 
268  void StoreToFile(const std::string& filePath) const;
269 
283  void LoadFromFile(const std::string& filePath);
284 
303  std::unique_ptr<ScopedNodeMapLock> Lock();
304 
315  {
316  return m_backendHandle;
317  }
318 
319 private:
320  std::shared_ptr<nodes::Node> NodeFromHandle(PEAK_NODE_HANDLE nodeHandle) const;
321 
322  friend ClassCreator<NodeMap>;
323  explicit NodeMap(PEAK_NODE_MAP_HANDLE nodeMapHandle);
324  PEAK_NODE_MAP_HANDLE m_backendHandle;
325 
326  void Initialize() const override;
327  mutable std::vector<std::shared_ptr<nodes::Node>> m_nodes;
328  mutable std::unordered_map<std::string, std::shared_ptr<nodes::Node>> m_nodesByName;
329 };
330 
331 } /* namespace core */
332 } /* namespace peak */
333 
344 
345 
346 /* Implementation */
347 namespace peak
348 {
349 namespace core
350 {
351 
352 inline NodeMap::NodeMap(PEAK_NODE_MAP_HANDLE nodeMapHandle)
353  : m_backendHandle(nodeMapHandle)
354  , m_nodes()
355  , m_nodesByName()
356 {}
357 
358 inline bool NodeMap::HasNode(const std::string& name) const
359 {
360  return QueryNumericFromCInterfaceFunction<PEAK_BOOL8>([&](PEAK_BOOL8* hasNode) {
361  return PEAK_C_ABI_PREFIX PEAK_NodeMap_GetHasNode(m_backendHandle, name.c_str(), name.size() + 1, hasNode);
362  }) > 0;
363 }
364 
365 inline std::shared_ptr<nodes::Node> NodeMap::FindNode(const std::string& name)
366 {
367  InitializeIfNecessary();
368 
369  (void)QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](PEAK_NODE_HANDLE* nodeHandle) {
371  m_backendHandle, name.c_str(), name.size() + 1, nodeHandle);
372  });
373 
374  return m_nodesByName.at(name);
375 }
376 
378 {
379  CallAndCheckCInterfaceFunction(
380  [&] { return PEAK_C_ABI_PREFIX PEAK_NodeMap_InvalidateNodes(m_backendHandle); });
381 }
382 
383 inline void NodeMap::PollNodes(int64_t elapsedTime_ms)
384 {
385  CallAndCheckCInterfaceFunction(
386  [&] { return PEAK_C_ABI_PREFIX PEAK_NodeMap_PollNodes(m_backendHandle, elapsedTime_ms); });
387 }
388 
389 inline std::vector<std::shared_ptr<nodes::Node>> NodeMap::Nodes() const
390 {
391  InitializeIfNecessary();
392 
393  return m_nodes;
394 }
395 
396 inline bool NodeMap::HasEventSupportedData(const std::unique_ptr<Event>& event) const
397 {
398  if (event == nullptr)
399  {
400  throw InvalidArgumentException("The given event is a nullptr!");
401  }
402 
403  return QueryNumericFromCInterfaceFunction<PEAK_BOOL8>([&](PEAK_BOOL8* hasSupportedData) {
405  m_backendHandle, event->m_backendHandle, hasSupportedData);
406  }) > 0;
407 }
408 
409 inline void NodeMap::UpdateEventNodes(const std::unique_ptr<Event>& event)
410 {
411  if (event == nullptr)
412  {
413  throw InvalidArgumentException("The given event is a nullptr!");
414  }
415 
416  CallAndCheckCInterfaceFunction(
417  [&] { return PEAK_C_ABI_PREFIX PEAK_NodeMap_UpdateEventNodes(m_backendHandle, event->m_backendHandle); });
418 }
419 
420 inline void NodeMap::StoreToFile(const std::string& filePath) const
421 {
422  CallAndCheckCInterfaceFunction([&] {
423  return PEAK_C_ABI_PREFIX PEAK_NodeMap_StoreToFile(m_backendHandle, filePath.c_str(), filePath.size() + 1);
424  });
425 }
426 
427 inline void NodeMap::LoadFromFile(const std::string& filePath)
428 {
429  InitializeIfNecessary();
430 
431  CallAndCheckCInterfaceFunction([&] {
433  m_backendHandle, filePath.c_str(), filePath.size() + 1);
434  });
435 }
436 
437 inline NodeMap::ScopedNodeMapLock::ScopedNodeMapLock(const std::shared_ptr<NodeMap>& nodeMap)
438  : m_nodeMap(nodeMap)
439 {
440  CallAndCheckCInterfaceFunction(
441  [&] { return PEAK_C_ABI_PREFIX PEAK_NodeMap_Lock(m_nodeMap->m_backendHandle); });
442 }
444 {
445  CallAndCheckCInterfaceFunction(
446  [&] { return PEAK_C_ABI_PREFIX PEAK_NodeMap_Unlock(m_nodeMap->m_backendHandle); });
447 }
448 
449 inline std::unique_ptr<NodeMap::ScopedNodeMapLock> NodeMap::Lock()
450 {
451  return std::make_unique<ClassCreator<ScopedNodeMapLock>>(shared_from_this());
452 }
453 
454 inline std::shared_ptr<nodes::Node> NodeMap::NodeFromHandle(PEAK_NODE_HANDLE nodeHandle) const
455 {
456  auto nodeType = QueryNumericFromCInterfaceFunction<PEAK_NODE_TYPE>(
457  [&](PEAK_NODE_TYPE* _nodeType) { return PEAK_C_ABI_PREFIX PEAK_Node_GetType(nodeHandle, _nodeType); });
458 
459  switch (nodeType)
460  {
461  case PEAK_NODE_TYPE_INTEGER: {
462  auto integerNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_INTEGER_NODE_HANDLE>(
463  [&](PEAK_INTEGER_NODE_HANDLE* _integerNodeHandle) {
464  return PEAK_C_ABI_PREFIX PEAK_Node_ToIntegerNode(nodeHandle, _integerNodeHandle);
465  });
466 
467  return std::make_shared<ClassCreator<nodes::IntegerNode>>(
468  integerNodeHandle, std::const_pointer_cast<core::NodeMap>(shared_from_this()));
469  }
470  case PEAK_NODE_TYPE_BOOLEAN: {
471  auto booleanNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_BOOLEAN_NODE_HANDLE>(
472  [&](PEAK_BOOLEAN_NODE_HANDLE* _booleanNodeHandle) {
473  return PEAK_C_ABI_PREFIX PEAK_Node_ToBooleanNode(nodeHandle, _booleanNodeHandle);
474  });
475 
476  return std::make_shared<ClassCreator<nodes::BooleanNode>>(
477  booleanNodeHandle, std::const_pointer_cast<core::NodeMap>(shared_from_this()));
478  }
479  case PEAK_NODE_TYPE_COMMAND: {
480  auto commandNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_COMMAND_NODE_HANDLE>(
481  [&](PEAK_COMMAND_NODE_HANDLE* _commandNodeHandle) {
482  return PEAK_C_ABI_PREFIX PEAK_Node_ToCommandNode(nodeHandle, _commandNodeHandle);
483  });
484 
485  return std::make_shared<ClassCreator<nodes::CommandNode>>(
486  commandNodeHandle, std::const_pointer_cast<core::NodeMap>(shared_from_this()));
487  }
488  case PEAK_NODE_TYPE_FLOAT: {
489  auto floatNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_FLOAT_NODE_HANDLE>(
490  [&](PEAK_FLOAT_NODE_HANDLE* _floatNodeHandle) {
491  return PEAK_C_ABI_PREFIX PEAK_Node_ToFloatNode(nodeHandle, _floatNodeHandle);
492  });
493 
494  return std::make_shared<ClassCreator<nodes::FloatNode>>(
495  floatNodeHandle, std::const_pointer_cast<core::NodeMap>(shared_from_this()));
496  }
497  case PEAK_NODE_TYPE_STRING: {
498  auto stringNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_STRING_NODE_HANDLE>(
499  [&](PEAK_STRING_NODE_HANDLE* _stringNodeHandle) {
500  return PEAK_C_ABI_PREFIX PEAK_Node_ToStringNode(nodeHandle, _stringNodeHandle);
501  });
502 
503  return std::make_shared<ClassCreator<nodes::StringNode>>(
504  stringNodeHandle, std::const_pointer_cast<core::NodeMap>(shared_from_this()));
505  }
507  auto registerNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_REGISTER_NODE_HANDLE>(
508  [&](PEAK_REGISTER_NODE_HANDLE* _registerNodeHandle) {
509  return PEAK_C_ABI_PREFIX PEAK_Node_ToRegisterNode(nodeHandle, _registerNodeHandle);
510  });
511 
512  return std::make_shared<ClassCreator<nodes::RegisterNode>>(
513  registerNodeHandle, std::const_pointer_cast<core::NodeMap>(shared_from_this()));
514  }
516  auto categoryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_CATEGORY_NODE_HANDLE>(
517  [&](PEAK_CATEGORY_NODE_HANDLE* _categoryNodeHandle) {
518  return PEAK_C_ABI_PREFIX PEAK_Node_ToCategoryNode(nodeHandle, _categoryNodeHandle);
519  });
520 
521  return std::make_shared<ClassCreator<nodes::CategoryNode>>(
522  categoryNodeHandle, std::const_pointer_cast<core::NodeMap>(shared_from_this()));
523  }
525  auto enumerationNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_NODE_HANDLE>(
526  [&](PEAK_ENUMERATION_NODE_HANDLE* _enumerationNodeHandle) {
527  return PEAK_C_ABI_PREFIX PEAK_Node_ToEnumerationNode(nodeHandle, _enumerationNodeHandle);
528  });
529 
530  return std::make_shared<ClassCreator<nodes::EnumerationNode>>(
531  enumerationNodeHandle, std::const_pointer_cast<core::NodeMap>(shared_from_this()));
532  }
534  auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
535  [&](PEAK_ENUMERATION_ENTRY_NODE_HANDLE* _enumerationEntryNodeHandle) {
537  nodeHandle, _enumerationEntryNodeHandle);
538  });
539 
540  return std::make_shared<ClassCreator<nodes::EnumerationEntryNode>>(
541  enumerationEntryNodeHandle, std::const_pointer_cast<core::NodeMap>(shared_from_this()));
542  }
543  default: {
544  return std::make_shared<ClassCreator<nodes::Node>>(
545  nodeHandle, std::const_pointer_cast<core::NodeMap>(shared_from_this()));
546  }
547  }
548 }
549 
550 inline void NodeMap::Initialize() const
551 {
552  auto numNodes = QueryNumericFromCInterfaceFunction<size_t>([&](size_t* _numNodes) {
553  return PEAK_C_ABI_PREFIX PEAK_NodeMap_GetNumNodes(m_backendHandle, _numNodes);
554  });
555 
556  for (size_t x = 0; x < numNodes; ++x)
557  {
558  auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>(
559  [&](PEAK_NODE_HANDLE* _nodeHandle) {
560  return PEAK_C_ABI_PREFIX PEAK_NodeMap_GetNode(m_backendHandle, x, _nodeHandle);
561  });
562 
563  auto node = NodeFromHandle(nodeHandle);
564 
565  m_nodes.emplace_back(node);
566  m_nodesByName.emplace(node->Name(), node);
567  }
568 }
569 
570 } /* namespace core */
571 } /* namespace peak */
Represents a GenAPI node map.
Definition: peak_node_map.hpp:59
Definition: peak_backend.h:272
bool HasEventSupportedData(const std::unique_ptr< Event > &event) const
Checks if the Event contains data corresponding to the NodeMap.
Definition: peak_node_map.hpp:396
std::vector< std::shared_ptr< nodes::Node > > Nodes() const
Returns the nodes.
Definition: peak_node_map.hpp:389
The exception thrown for pass an invalid argument to a function.
Definition: peak_exception.hpp:73
int8_t PEAK_BOOL8
Definition: peak_backend.h:26
std::unique_ptr< ScopedNodeMapLock > Lock()
Locks a recursive mutex on the NodeMap.
Definition: peak_node_map.hpp:449
Definition: peak_backend.h:277
Holds a recursive lock on the NodeMap.
Definition: peak_node_map.hpp:72
PEAK_C_API PEAK_Node_ToEnumerationEntryNode(PEAK_NODE_HANDLE nodeHandle, PEAK_ENUMERATION_ENTRY_NODE_HANDLE *enumerationEntryNodeHandle)
Casts the given node to an enumeration entry node.
int32_t PEAK_NODE_TYPE
Definition: peak_backend.h:279
The "peak" namespace directly contains convenience functionality like the DeviceManager as well as th...
Definition: peak_dynamic_loader.h:32
Definition: peak_backend.h:270
The exception thrown for trying to apply an invalid cast.
Definition: peak_exception.hpp:81
struct PEAK_INTEGER_NODE * PEAK_INTEGER_NODE_HANDLE
Definition: peak_backend.h:415
void InvalidateNodes()
Invalidates all nodes.
Definition: peak_node_map.hpp:377
struct PEAK_CATEGORY_NODE * PEAK_CATEGORY_NODE_HANDLE
Definition: peak_backend.h:439
PEAK_C_API PEAK_NodeMap_GetNumNodes(PEAK_NODE_MAP_HANDLE nodeMapHandle, size_t *numNodes)
Asks the given node map for its number of nodes.
PEAK_C_API PEAK_Node_ToRegisterNode(PEAK_NODE_HANDLE nodeHandle, PEAK_REGISTER_NODE_HANDLE *registerNodeHandle)
Casts the given node to a register node.
~ScopedNodeMapLock()
Definition: peak_node_map.hpp:443
PEAK_C_API PEAK_Node_ToCommandNode(PEAK_NODE_HANDLE nodeHandle, PEAK_COMMAND_NODE_HANDLE *commandNodeHandle)
Casts the given node to a command node.
PEAK_C_API PEAK_NodeMap_PollNodes(PEAK_NODE_MAP_HANDLE nodeMapHandle, int64_t elapsedTime_ms)
Tells the given node map to poll its nodes.
struct PEAK_NODE * PEAK_NODE_HANDLE
Definition: peak_backend.h:411
PEAK_C_API PEAK_NodeMap_UpdateEventNodes(PEAK_NODE_MAP_HANDLE nodeMapHandle, PEAK_EVENT_HANDLE eventHandle)
Updates event information in the node map.
PEAK_NODE_MAP_HANDLE Handle() const
Get the backend handle.
Definition: peak_node_map.hpp:314
void PollNodes(int64_t elapsedTime_ms)
Polls all nodes having a polling time.
Definition: peak_node_map.hpp:383
PEAK_C_API PEAK_Node_ToEnumerationNode(PEAK_NODE_HANDLE nodeHandle, PEAK_ENUMERATION_NODE_HANDLE *enumerationNodeHandle)
Casts the given node to an enumeration node.
struct PEAK_NODE_MAP * PEAK_NODE_MAP_HANDLE
Definition: peak_backend.h:407
std::shared_ptr< NodeType > FindNode(const std::string &name)
Tries to find a node with the given name and type.
Definition: peak_node_map.hpp:159
struct PEAK_ENUMERATION_ENTRY_NODE * PEAK_ENUMERATION_ENTRY_NODE_HANDLE
Definition: peak_backend.h:447
PEAK_C_API PEAK_NodeMap_LoadFromFile(PEAK_NODE_MAP_HANDLE nodeMapHandle, const char *filePath, size_t filePathSize)
Tells the given node map to load the values of its streamable nodes from a file at the given file pat...
Definition: peak_backend.h:274
PEAK_C_API PEAK_Node_ToIntegerNode(PEAK_NODE_HANDLE nodeHandle, PEAK_INTEGER_NODE_HANDLE *integerNodeHandle)
Casts the given node to an integer node.
struct PEAK_ENUMERATION_NODE * PEAK_ENUMERATION_NODE_HANDLE
Definition: peak_backend.h:443
Definition: peak_backend.h:275
PEAK_C_API PEAK_NodeMap_Lock(PEAK_NODE_MAP_HANDLE nodeMapHandle)
Locks a recursive mutex on the NodeMap.
Definition: peak_backend.h:271
struct PEAK_BOOLEAN_NODE * PEAK_BOOLEAN_NODE_HANDLE
Definition: peak_backend.h:419
PEAK_C_API PEAK_Node_GetType(PEAK_NODE_HANDLE nodeHandle, PEAK_NODE_TYPE *type)
Asks the given node for its type.
Definition: peak_backend.h:317
struct PEAK_STRING_NODE * PEAK_STRING_NODE_HANDLE
Definition: peak_backend.h:431
bool HasNode(const std::string &name) const
Checks whether the node map contains a node with the given name.
Definition: peak_node_map.hpp:358
Definition: peak_backend.h:269
Definition: peak_backend.h:273
NodeType
Definition: peak_node.hpp:86
PEAK_C_API PEAK_NodeMap_GetNode(PEAK_NODE_MAP_HANDLE nodeMapHandle, size_t index, PEAK_NODE_HANDLE *nodeHandle)
Asks the given node map for the node with the given index.
PEAK_C_API PEAK_NodeMap_GetHasNode(PEAK_NODE_MAP_HANDLE nodeMapHandle, const char *nodeName, size_t nodeNameSize, PEAK_BOOL8 *hasNode)
Checks whether the given node map contains a node with the given name.
struct PEAK_FLOAT_NODE * PEAK_FLOAT_NODE_HANDLE
Definition: peak_backend.h:427
bool HasNode(const std::string &name)
Checks whether the node map contains a node with the given name and type.
Definition: peak_node_map.hpp:117
#define PEAK_C_ABI_PREFIX
Definition: peak_dll_defines.h:16
PEAK_C_API PEAK_NodeMap_StoreToFile(PEAK_NODE_MAP_HANDLE nodeMapHandle, const char *filePath, size_t filePathSize)
Tells the given node map to store the values of its streamable nodes to a file at the given file path...
std::shared_ptr< nodes::Node > FindNode(const std::string &name)
Tries to find a node with the given name.
Definition: peak_node_map.hpp:365
PEAK_C_API PEAK_NodeMap_Unlock(PEAK_NODE_MAP_HANDLE nodeMapHandle)
Unlocks the recursive mutex on the NodeMap.
Definition: peak_backend.h:276
PEAK_C_API PEAK_Node_ToFloatNode(PEAK_NODE_HANDLE nodeHandle, PEAK_FLOAT_NODE_HANDLE *floatNodeHandle)
Casts the given node to a float node.
std::function< bool(const std::shared_ptr< const nodes::Node > &nodeToFilter)> NodeFilterFunction
Definition: peak_node_map.hpp:65
PEAK_C_API PEAK_Node_ToBooleanNode(PEAK_NODE_HANDLE nodeHandle, PEAK_BOOLEAN_NODE_HANDLE *booleanNodeHandle)
Casts the given node to a boolean node.
PEAK_C_API PEAK_NodeMap_InvalidateNodes(PEAK_NODE_MAP_HANDLE nodeMapHandle)
Tells the given node map to invalidate its nodes.
void UpdateEventNodes(const std::unique_ptr< Event > &event)
Updates event information in the NodeMap.
Definition: peak_node_map.hpp:409
void StoreToFile(const std::string &filePath) const
Stores the values of streamable nodes to the file at the given file path.
Definition: peak_node_map.hpp:420
PEAK_C_API PEAK_NodeMap_GetHasEventSupportedData(PEAK_NODE_MAP_HANDLE nodeMapHandle, PEAK_EVENT_HANDLE eventHandle, PEAK_BOOL8 *hasSupportedData)
Checks if the event contains data corresponding to the node map.
void LoadFromFile(const std::string &filePath)
Loads the values of streamable nodes from the file at the given file path.
Definition: peak_node_map.hpp:427
struct PEAK_COMMAND_NODE * PEAK_COMMAND_NODE_HANDLE
Definition: peak_backend.h:423
PEAK_C_API PEAK_NodeMap_FindNode(PEAK_NODE_MAP_HANDLE nodeMapHandle, const char *nodeName, size_t nodeNameSize, PEAK_NODE_HANDLE *nodeHandle)
Tells the given node map to find a node with the given name.
PEAK_C_API PEAK_Node_ToCategoryNode(PEAK_NODE_HANDLE nodeHandle, PEAK_CATEGORY_NODE_HANDLE *categoryNodeHandle)
Casts the given node to a category node.
struct PEAK_REGISTER_NODE * PEAK_REGISTER_NODE_HANDLE
Definition: peak_backend.h:435
PEAK_C_API PEAK_Node_ToStringNode(PEAK_NODE_HANDLE nodeHandle, PEAK_STRING_NODE_HANDLE *stringNodeHandle)
Casts the given node to a string node.