15 #include <peak/dll_interface/peak_dll_interface_util.hpp> 19 #include <type_traits> 20 #include <unordered_map> 41 class EnumerationNode;
42 class EnumerationEntryNode;
61 ,
public std::enable_shared_from_this<NodeMap>
65 using NodeFilterFunction = std::function<bool(const std::shared_ptr<const nodes::Node>& nodeToFilter)>;
84 friend ClassCreator<ScopedNodeMapLock>;
86 std::shared_ptr<NodeMap> m_nodeMap;
105 bool HasNode(
const std::string& name)
const;
116 template <class NodeType, typename std::enable_if<std::is_base_of<nodes::Node, NodeType>::value,
int>::type = 0>
126 return std::dynamic_pointer_cast<
NodeType>(FindNode(name)) !=
nullptr;
142 std::shared_ptr<nodes::Node> FindNode(
const std::string& name);
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)
161 auto castedNode = std::dynamic_pointer_cast<
NodeType>(FindNode(name));
177 void InvalidateNodes();
188 void PollNodes(int64_t elapsedTime_ms);
199 std::vector<std::shared_ptr<nodes::Node>> Nodes()
const;
211 bool HasBufferSupportedChunks(
const std::shared_ptr<Buffer>& buffer)
const;
226 void UpdateChunkNodes(
const std::shared_ptr<Buffer>& buffer);
238 bool HasEventSupportedData(
const std::unique_ptr<Event>& event)
const;
253 void UpdateEventNodes(
const std::unique_ptr<Event>& event);
268 void StoreToFile(
const std::string& filePath)
const;
283 void LoadFromFile(
const std::string& filePath);
303 std::unique_ptr<ScopedNodeMapLock> Lock();
316 return m_backendHandle;
320 std::shared_ptr<nodes::Node> NodeFromHandle(
PEAK_NODE_HANDLE nodeHandle)
const;
322 friend ClassCreator<NodeMap>;
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;
353 : m_backendHandle(nodeMapHandle)
360 return QueryNumericFromCInterfaceFunction<PEAK_BOOL8>([&](
PEAK_BOOL8* hasNode) {
367 InitializeIfNecessary();
369 (void)QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>([&](
PEAK_NODE_HANDLE* nodeHandle) {
371 m_backendHandle, name.c_str(), name.size() + 1, nodeHandle);
374 return m_nodesByName.at(name);
379 CallAndCheckCInterfaceFunction(
385 CallAndCheckCInterfaceFunction(
391 InitializeIfNecessary();
398 if (event ==
nullptr)
403 return QueryNumericFromCInterfaceFunction<PEAK_BOOL8>([&](
PEAK_BOOL8* hasSupportedData) {
405 m_backendHandle, event->m_backendHandle, hasSupportedData);
411 if (event ==
nullptr)
416 CallAndCheckCInterfaceFunction(
422 CallAndCheckCInterfaceFunction([&] {
429 InitializeIfNecessary();
431 CallAndCheckCInterfaceFunction([&] {
433 m_backendHandle, filePath.c_str(), filePath.size() + 1);
440 CallAndCheckCInterfaceFunction(
445 CallAndCheckCInterfaceFunction(
451 return std::make_unique<ClassCreator<ScopedNodeMapLock>>(shared_from_this());
454 inline std::shared_ptr<nodes::Node> NodeMap::NodeFromHandle(
PEAK_NODE_HANDLE nodeHandle)
const 456 auto nodeType = QueryNumericFromCInterfaceFunction<PEAK_NODE_TYPE>(
462 auto integerNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_INTEGER_NODE_HANDLE>(
467 return std::make_shared<ClassCreator<nodes::IntegerNode>>(
468 integerNodeHandle, std::const_pointer_cast<
core::NodeMap>(shared_from_this()));
471 auto booleanNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_BOOLEAN_NODE_HANDLE>(
476 return std::make_shared<ClassCreator<nodes::BooleanNode>>(
477 booleanNodeHandle, std::const_pointer_cast<
core::NodeMap>(shared_from_this()));
480 auto commandNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_COMMAND_NODE_HANDLE>(
485 return std::make_shared<ClassCreator<nodes::CommandNode>>(
486 commandNodeHandle, std::const_pointer_cast<
core::NodeMap>(shared_from_this()));
489 auto floatNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_FLOAT_NODE_HANDLE>(
494 return std::make_shared<ClassCreator<nodes::FloatNode>>(
495 floatNodeHandle, std::const_pointer_cast<
core::NodeMap>(shared_from_this()));
498 auto stringNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_STRING_NODE_HANDLE>(
503 return std::make_shared<ClassCreator<nodes::StringNode>>(
504 stringNodeHandle, std::const_pointer_cast<
core::NodeMap>(shared_from_this()));
507 auto registerNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_REGISTER_NODE_HANDLE>(
512 return std::make_shared<ClassCreator<nodes::RegisterNode>>(
513 registerNodeHandle, std::const_pointer_cast<
core::NodeMap>(shared_from_this()));
516 auto categoryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_CATEGORY_NODE_HANDLE>(
521 return std::make_shared<ClassCreator<nodes::CategoryNode>>(
522 categoryNodeHandle, std::const_pointer_cast<
core::NodeMap>(shared_from_this()));
525 auto enumerationNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_NODE_HANDLE>(
530 return std::make_shared<ClassCreator<nodes::EnumerationNode>>(
531 enumerationNodeHandle, std::const_pointer_cast<
core::NodeMap>(shared_from_this()));
534 auto enumerationEntryNodeHandle = QueryNumericFromCInterfaceFunction<PEAK_ENUMERATION_ENTRY_NODE_HANDLE>(
537 nodeHandle, _enumerationEntryNodeHandle);
540 return std::make_shared<ClassCreator<nodes::EnumerationEntryNode>>(
541 enumerationEntryNodeHandle, std::const_pointer_cast<
core::NodeMap>(shared_from_this()));
544 return std::make_shared<ClassCreator<nodes::Node>>(
545 nodeHandle, std::const_pointer_cast<
core::NodeMap>(shared_from_this()));
550 inline void NodeMap::Initialize()
const 552 auto numNodes = QueryNumericFromCInterfaceFunction<size_t>([&](
size_t* _numNodes) {
556 for (
size_t x = 0; x < numNodes; ++x)
558 auto nodeHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_HANDLE>(
563 auto node = NodeFromHandle(nodeHandle);
565 m_nodes.emplace_back(node);
566 m_nodesByName.emplace(node->Name(), node);
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
ScopedNodeMapLock()=delete
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.