CVB++ 15.0
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
9namespace Cvb
10{
11
12 CVB_BEGIN_INLINE_NS
13
14 template <>
15 inline HandleGuard<GenApi::NodeMapEnumerator>::HandleGuard(void *handle) noexcept
16 : HandleGuard<GenApi::NodeMapEnumerator>(handle, [](void *handle) { CVB_CALL_CAPI(ReleaseObject(handle)); })
17 {
18 }
19
20 namespace GenApi
21 {
22
24
29 class NodeMapEnumerator final
30 {
31 struct PrivateTag
32 {
33 };
34
35 public:
36 using GuardType = HandleGuard<NodeMapEnumerator>;
37
38 template <class T>
39 static NodeMapEnumeratorPtr FromHandle(HandleGuard<NodeMapEnumerator> &&guard)
40 {
41 // no check for valid guard required!
42 return std::make_shared<NodeMapEnumerator>(std::move(guard), PrivateTag{});
43 }
44
45 NodeMapEnumerator() noexcept
46 : handle_(nullptr) // not an invalid object just no node maps to enumerate
47 {
48 }
49
50 NodeMapEnumerator(HandleGuard<NodeMapEnumerator> &&guard, PrivateTag) noexcept
51 : handle_(std::move(guard))
52 {
53 }
54
55 // we need only move
56 NodeMapEnumerator(const NodeMapEnumerator &other) = delete;
57 NodeMapEnumerator &operator=(const NodeMapEnumerator &other) = delete;
58
60
64 NodeMapEnumerator(NodeMapEnumerator &&other) noexcept
65 : nodeMaps_(std::move_if_noexcept(other.nodeMaps_))
66 , handle_(std::move(other.handle_))
67 {
68 }
69
71
76 NodeMapEnumerator &operator=(NodeMapEnumerator &&other) noexcept
77 {
78 if (this != &other)
79 {
80 nodeMaps_ = std::move_if_noexcept(other.nodeMaps_);
81 handle_ = std::move(other.handle_);
82 }
83 return *this;
84 }
85
86 ~NodeMapEnumerator() = default;
87
89
97 template <class T>
98 static NodeMapEnumerator FromObject(const T &object)
99 {
100 CVB_CALL_CAPI_CHECKED(ShareObject(object.Handle()));
101 return NodeMapEnumerator(HandleGuard<NodeMapEnumerator>(object.Handle()), PrivateTag{});
102 }
103
105
111 void *Handle() const noexcept
112 {
113 return handle_.Handle();
114 }
115
117
124 {
126 auto nodeMapCount = NodeMapCount();
127 names.reserve(nodeMapCount);
128 std::generate_n(std::back_inserter(names), nodeMapCount, [this, i = 0]() mutable { return NameAt(i++); });
129 return names;
130 }
131
133
140 NodeMapPtr operator[](const String &name) const
141 {
142 return NodeMap(name);
143 }
144
146
153 NodeMapPtr NodeMap(const String &name) const
154 {
155 auto iter = nodeMaps_.find(name);
156 if (iter != nodeMaps_.end())
157 {
158 if (auto nodeMap = iter->second.lock())
159 return nodeMap;
160 }
161
162 CExports::NODEMAP handle = nullptr;
163 std::string cname(Internal::CastToAscii(name));
164 CVB_CALL_CAPI_CHECKED(NMH2GetNodeMap(Handle(), cname.c_str(), handle));
165
166 auto nodeMap = NodeMap::FromHandle(HandleGuard<class NodeMap>(handle), name, Handle());
167 nodeMaps_[name] = nodeMap;
168 return nodeMap;
169 }
170
171 private:
172 int NodeMapCount() const noexcept
173 {
174 size_t numNodeMaps = 0;
175 CExports::NMH2GetNum(Handle(), numNodeMaps);
176 return static_cast<int>(numNodeMaps);
177 }
178
179 String NameAt(int index) const
180 {
181 size_t bufferSize = 0;
182 CVB_CALL_CAPI_CHECKED(NMH2GetID(Handle(), index, nullptr, bufferSize));
183
184 std::vector<char> buffer(bufferSize);
185 CVB_CALL_CAPI_CHECKED(NMH2GetID(Handle(), index, buffer.data(), bufferSize));
186
187 return String(buffer.begin(), buffer.end() - 1); // safe as we define the node map names
188 }
189
191
192 HandleGuard<NodeMapEnumerator> handle_;
193 };
194 } // namespace GenApi
195
196 CVB_END_INLINE_NS
197} // namespace Cvb
T back_inserter(T... args)
Lazy enumeration of node maps.
Definition node_map_enumerator.hpp:30
NodeMapPtr operator[](const String &name) const
Name based node map access.
Definition node_map_enumerator.hpp:140
NodeMapEnumerator & operator=(NodeMapEnumerator &&other) noexcept
Move operator.
Definition node_map_enumerator.hpp:76
static NodeMapEnumerator FromObject(const T &object)
Create a node map enumerator for a given object.
Definition node_map_enumerator.hpp:98
NodeMapEnumerator(NodeMapEnumerator &&other) noexcept
Move constructor.
Definition node_map_enumerator.hpp:64
NodeMapPtr NodeMap(const String &name) const
Name based node map access.
Definition node_map_enumerator.hpp:153
std::vector< String > Names() const
Get the names of all available node maps.
Definition node_map_enumerator.hpp:123
void * Handle() const noexcept
Classic API device handle.
Definition node_map_enumerator.hpp:111
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:26
T generate_n(T... args)
cvbbool_t ShareObject(OBJ Object)
cvbbool_t ReleaseObject(OBJ &Object)
T make_shared(T... args)
T move(T... args)
T move_if_noexcept(T... args)
Namespace for GenApi based device configuration.
Definition decl_fw_updater.hpp:29
std::shared_ptr< NodeMapEnumerator > NodeMapEnumeratorPtr
Convenience shared pointer for ValueNode.
Definition genapi.hpp:90
std::shared_ptr< NodeMap > NodeMapPtr
Convenience shared pointer for NodeMap.
Definition genapi.hpp:22
Root namespace for the Image Manager interface.
Definition c_bayer_to_rgb.h:17
std::string String
String for wide characters or unicode characters.
Definition string.hpp:49