IDS peak genericC++  v1.6.0
peak_module.hpp
Go to the documentation of this file.
1 
11 #pragma once
12 
13 
16 
17 #include <cstddef>
18 #include <memory>
19 #include <vector>
20 
21 
22 namespace peak
23 {
24 namespace core
25 {
26 
27 class NodeMap;
28 class Port;
29 
37 class Module : public InitOnce
38 {
39 public:
40  Module() = default;
41  virtual ~Module() = default;
42  Module(const Module& other) = delete;
43  Module& operator=(const Module& other) = delete;
44  Module(Module&& other) = delete;
45  Module& operator=(Module&& other) = delete;
46 
56  std::vector<std::shared_ptr<NodeMap>> NodeMaps() const;
66  std::shared_ptr<class Port> Port() const;
67 
68 protected:
69  virtual PEAK_MODULE_HANDLE ModuleHandle() const = 0;
70 
72  void Initialize() const override;
74 
75 private:
76  mutable std::vector<std::shared_ptr<NodeMap>> m_nodeMaps;
77  mutable std::shared_ptr<class Port> m_port;
78 };
79 
80 } /* namespace core */
81 } /* namespace peak */
82 
84 #include <peak/port/peak_port.hpp>
85 
86 
87 /* Implementation */
88 namespace peak
89 {
90 namespace core
91 {
92 
93 inline std::vector<std::shared_ptr<NodeMap>> Module::NodeMaps() const
94 {
95  InitializeIfNecessary();
96  return m_nodeMaps;
97 }
98 
99 inline std::shared_ptr<class Port> Module::Port() const
100 {
101  InitializeIfNecessary();
102  return m_port;
103 }
104 
106 inline void Module::Initialize() const
107 {
108  auto moduleHandle = ModuleHandle();
109 
110  auto numNodeMaps = QueryNumericFromCInterfaceFunction<size_t>([&](size_t* _numNodeMaps) {
111  return PEAK_C_ABI_PREFIX PEAK_Module_GetNumNodeMaps(moduleHandle, _numNodeMaps);
112  });
113 
114  std::vector<std::shared_ptr<NodeMap>> nodeMaps;
115  for (size_t x = 0; x < numNodeMaps; ++x)
116  {
117  auto nodeMapHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_MAP_HANDLE>(
118  [&](PEAK_NODE_MAP_HANDLE* _nodeMapHandle) {
119  return PEAK_C_ABI_PREFIX PEAK_Module_GetNodeMap(moduleHandle, x, _nodeMapHandle);
120  });
121 
122  nodeMaps.emplace_back(std::make_shared<ClassCreator<NodeMap>>(nodeMapHandle));
123  }
124 
125  m_nodeMaps = nodeMaps;
126 
127  auto portHandle = QueryNumericFromCInterfaceFunction<PEAK_PORT_HANDLE>([&](PEAK_PORT_HANDLE* _portHandle) {
128  return PEAK_C_ABI_PREFIX PEAK_Module_GetPort(moduleHandle, _portHandle);
129  });
130 
131  m_port = std::make_shared<ClassCreator<peak::core::Port>>(portHandle);
132 }
134 
135 } /* namespace core */
136 } /* namespace peak */
PEAK_C_API PEAK_Module_GetNodeMap(PEAK_MODULE_HANDLE moduleHandle, size_t index, PEAK_NODE_MAP_HANDLE *nodeMapHandle)
Asks the given module for the node map with the given index.
The "peak" namespace directly contains convenience functionality like the DeviceManager as well as th...
Definition: peak_dynamic_loader.h:32
virtual PEAK_MODULE_HANDLE ModuleHandle() const =0
std::shared_ptr< class Port > Port() const
Returns the module&#39;s port.
Definition: peak_module.hpp:99
struct PEAK_NODE_MAP * PEAK_NODE_MAP_HANDLE
Definition: peak_backend.h:405
Module & operator=(const Module &other)=delete
std::vector< std::shared_ptr< NodeMap > > NodeMaps() const
Returns the module&#39;s node maps.
Definition: peak_module.hpp:93
PEAK_C_API PEAK_Module_GetNumNodeMaps(PEAK_MODULE_HANDLE moduleHandle, size_t *numNodeMaps)
Asks the given module for its number of node maps.
struct PEAK_PORT * PEAK_PORT_HANDLE
Definition: peak_backend.h:449
Represents an extended GenTL port.
Definition: peak_module.hpp:37
#define PEAK_C_ABI_PREFIX
Definition: peak_dll_defines.h:16
PEAK_C_API PEAK_Module_GetPort(PEAK_MODULE_HANDLE moduleHandle, PEAK_PORT_HANDLE *portHandle)
Asks the given module for its port.
virtual ~Module()=default
struct PEAK_MODULE * PEAK_MODULE_HANDLE
Definition: peak_backend.h:401