IDS peak genericC++  v1.7.2
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;
57 
67  std::shared_ptr<class Port> Port() const;
68 
69 protected:
70  virtual PEAK_MODULE_HANDLE ModuleHandle() const = 0;
71 
73  void Initialize() const override;
75 
76 private:
77  mutable std::vector<std::shared_ptr<NodeMap>> m_nodeMaps;
78  mutable std::shared_ptr<class Port> m_port;
79 };
80 
81 } /* namespace core */
82 } /* namespace peak */
83 
85 #include <peak/port/peak_port.hpp>
86 
87 
88 /* Implementation */
89 namespace peak
90 {
91 namespace core
92 {
93 
94 inline std::vector<std::shared_ptr<NodeMap>> Module::NodeMaps() const
95 {
96  InitializeIfNecessary();
97  return m_nodeMaps;
98 }
99 
100 inline std::shared_ptr<class Port> Module::Port() const
101 {
102  InitializeIfNecessary();
103  return m_port;
104 }
105 
107 inline void Module::Initialize() const
108 {
109  auto moduleHandle = ModuleHandle();
110 
111  auto numNodeMaps = QueryNumericFromCInterfaceFunction<size_t>([&](size_t* _numNodeMaps) {
112  return PEAK_C_ABI_PREFIX PEAK_Module_GetNumNodeMaps(moduleHandle, _numNodeMaps);
113  });
114 
115  std::vector<std::shared_ptr<NodeMap>> nodeMaps;
116  for (size_t x = 0; x < numNodeMaps; ++x)
117  {
118  auto nodeMapHandle = QueryNumericFromCInterfaceFunction<PEAK_NODE_MAP_HANDLE>(
119  [&](PEAK_NODE_MAP_HANDLE* _nodeMapHandle) {
120  return PEAK_C_ABI_PREFIX PEAK_Module_GetNodeMap(moduleHandle, x, _nodeMapHandle);
121  });
122 
123  nodeMaps.emplace_back(std::make_shared<ClassCreator<NodeMap>>(nodeMapHandle));
124  }
125 
126  m_nodeMaps = nodeMaps;
127 
128  auto portHandle = QueryNumericFromCInterfaceFunction<PEAK_PORT_HANDLE>([&](PEAK_PORT_HANDLE* _portHandle) {
129  return PEAK_C_ABI_PREFIX PEAK_Module_GetPort(moduleHandle, _portHandle);
130  });
131 
132  m_port = std::make_shared<ClassCreator<peak::core::Port>>(portHandle);
133 }
135 
136 } /* namespace core */
137 } /* 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:100
struct PEAK_NODE_MAP * PEAK_NODE_MAP_HANDLE
Definition: peak_backend.h:407
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:94
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:451
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:403