CVB++ 14.1
node_map_enumerator.hpp
1#pragma once
2
3#include <map>
4#include <memory>
5
6#include "genapi.hpp"
7#include "node_map.hpp"
8
9
10namespace Cvb
11{
12
13 CVB_BEGIN_INLINE_NS
14
15 template <>
16 inline HandleGuard<GenApi::NodeMapEnumerator>::HandleGuard(void* handle) noexcept
17 : HandleGuard<GenApi::NodeMapEnumerator>(handle, [](void* handle) { CVB_CALL_CAPI(ReleaseObject(handle)); })
18 {
19 }
20
21 namespace GenApi
22 {
23
25
31 {
32 struct PrivateTag {};
33
34 public:
35
36 NodeMapEnumerator() noexcept
37 : handle_(nullptr) // not an invalid object just no node maps to enumerate
38 {
39 }
40
41 NodeMapEnumerator(HandleGuard<NodeMapEnumerator>&& guard, PrivateTag) noexcept
42 : handle_(std::move(guard))
43 {
44 }
45
46 // we need only move
47 NodeMapEnumerator(const NodeMapEnumerator& other) = delete;
48 NodeMapEnumerator& operator=(const NodeMapEnumerator& other) = delete;
49
51
56 : nodeMaps_(std::move_if_noexcept(other.nodeMaps_)),
57 handle_(std::move(other.handle_))
58 {
59 }
60
62
68 {
69 if (this != &other) {
70 nodeMaps_ = std::move_if_noexcept(other.nodeMaps_);
71 handle_ = std::move(other.handle_);
72 }
73 return *this;
74 }
75
76 ~NodeMapEnumerator() = default;
77
79
87 template<class T>
88 static NodeMapEnumerator FromObject(const T& object)
89 {
90 CVB_CALL_CAPI_CHECKED(ShareObject(object.Handle()));
91 return NodeMapEnumerator(HandleGuard<NodeMapEnumerator>(object.Handle()), PrivateTag{});
92 }
93
95
101 void* Handle() const noexcept
102 {
103 return handle_.Handle();
104 }
105
107
114 {
116 auto nodeMapCount = NodeMapCount();
117 names.reserve(nodeMapCount);
118 std::generate_n(std::back_inserter(names), nodeMapCount, [this, i = 0]() mutable {
119 return NameAt(i++); });
120 return names;
121 }
122
124
131 NodeMapPtr operator[](const String& name) const
132 {
133 return NodeMap(name);
134 }
135
137
144 NodeMapPtr NodeMap(const String& name) const
145 {
146 auto iter = nodeMaps_.find(name);
147 if (iter != nodeMaps_.end())
148 {
149 if (auto nodeMap = iter->second.lock())
150 return nodeMap;
151 }
152
153 CExports::NODEMAP handle = nullptr;
154 std::string cname(Internal::CastToAscii(name));
155 CVB_CALL_CAPI_CHECKED(NMH2GetNodeMap(Handle(), cname.c_str(), handle));
156
157 auto nodeMap = NodeMap::FromHandle(HandleGuard<class NodeMap>(handle), name, Handle());
158 nodeMaps_[name] = nodeMap;
159 return nodeMap;
160 }
161
162 private:
163
164 int NodeMapCount() const noexcept
165 {
166 size_t numNodeMaps = 0;
167 CExports::NMH2GetNum(Handle(), numNodeMaps);
168 return static_cast<int>(numNodeMaps);
169 }
170
171 String NameAt(int index) const
172 {
173 size_t bufferSize = 0;
174 CVB_CALL_CAPI_CHECKED(NMH2GetID(Handle(), index, nullptr, bufferSize));
175
176 std::vector<char> buffer(bufferSize);
177 CVB_CALL_CAPI_CHECKED(NMH2GetID(Handle(), index, buffer.data(), bufferSize));
178
179 return String(buffer.begin(), buffer.end() - 1); // safe as we define the node map names
180 }
181
183
184 HandleGuard<NodeMapEnumerator> handle_;
185
186
187
188 };
189 }
190
191 CVB_END_INLINE_NS
192}
Lazy enumeration of node maps.
Definition: node_map_enumerator.hpp:31
NodeMapPtr operator[](const String &name) const
Name based node map access.
Definition: node_map_enumerator.hpp:131
NodeMapEnumerator & operator=(NodeMapEnumerator &&other) noexcept
Move operator.
Definition: node_map_enumerator.hpp:67
static NodeMapEnumerator FromObject(const T &object)
Create a node map enumerator for a given object.
Definition: node_map_enumerator.hpp:88
NodeMapEnumerator(NodeMapEnumerator &&other) noexcept
Move constructor.
Definition: node_map_enumerator.hpp:55
NodeMapPtr NodeMap(const String &name) const
Name based node map access.
Definition: node_map_enumerator.hpp:144
std::vector< String > Names() const
Get the names of all available node maps.
Definition: node_map_enumerator.hpp:113
void * Handle() const noexcept
Classic API device handle.
Definition: node_map_enumerator.hpp:101
static NodeMapPtr FromHandle(HandleGuard< NodeMap > &&guard, const String &name, const Device &device)
Creates a node map from a classic API handle.
Definition: detail_node_map.hpp:27
Root namespace for the Image Manager interface.
Definition: c_barcode.h:24