Zivid C++ API 2.5.0+19fa6891-1
Defining the Future of 3D Machine Vision
Detail.h
Go to the documentation of this file.
1
2
3/*******************************************************************************
4
5 * This file is part of the Zivid 3D Camera API
6
7 *
8
9 * Copyright 2015-2021 (C) Zivid AS
10
11 * All rights reserved.
12
13 *
14
15 * Zivid Software License, v1.0
16
17 *
18
19 * Redistribution and use in source and binary forms, with or without
20
21 * modification, are permitted provided that the following conditions are met:
22
23 *
24
25 * 1. Redistributions of source code must retain the above copyright notice,
26
27 * this list of conditions and the following disclaimer.
28
29 *
30
31 * 2. Redistributions in binary form must reproduce the above copyright notice,
32
33 * this list of conditions and the following disclaimer in the documentation
34
35 * and/or other materials provided with the distribution.
36
37 *
38
39 * 3. Neither the name of Zivid AS nor the names of its contributors may be used
40
41 * to endorse or promote products derived from this software without specific
42
43 * prior written permission.
44
45 *
46
47 * 4. This software, with or without modification, must not be used with any
48
49 * other 3D camera than from Zivid AS.
50
51 *
52
53 * 5. Any software provided in binary form under this license must not be
54
55 * reverse engineered, decompiled, modified and/or disassembled.
56
57 *
58
59 * THIS SOFTWARE IS PROVIDED BY ZIVID AS "AS IS" AND ANY EXPRESS OR IMPLIED
60
61 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
62
63 * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
64
65 * DISCLAIMED. IN NO EVENT SHALL ZIVID AS OR CONTRIBUTORS BE LIABLE FOR ANY
66
67 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
68
69 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
70
71 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
72
73 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
74
75 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
76
77 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
78
79 *
80
81 * Contact: Zivid Customer Success Team <customersuccess@zivid.com>
82
83 * Info: http://www.zivid.com
84
85 ******************************************************************************/
86
87
88
89#pragma once
90
91#include <type_traits>
92#include <utility>
93
94namespace Zivid
95{
96 namespace DataModel
97 {
98#ifndef NO_DOC
100 namespace Detail
101 {
102 template<typename DataModel>
103 void invokeSetWithEachArgument(DataModel && /*dm*/)
104 {
105 // Base case, do nothing
106 }
107
108 template<typename DataModel, typename Arg, typename... Args>
109 void invokeSetWithEachArgument(DataModel &&dm, Arg &&arg, Args &&...args)
110 {
111 dm.set(std::forward<Arg>(arg));
112 invokeSetWithEachArgument(std::forward<DataModel>(dm), std::forward<Args>(args)...);
113 }
114
115 // Note: This Optional class will default construct an object of the contained type when the
116 // optional is unset.
117 // This class should not be accessible directly via the public API.
118 template<typename T>
119 class Optional
120 {
121 static_assert(std::is_default_constructible<T>::value, "T needs to be default_constructible");
122
123 public:
124 constexpr Optional()
125 : m_hasValue{ false }
126 , m_value{}
127 {}
128
129 explicit constexpr Optional(const T &value)
130 : m_hasValue{ true }
131 , m_value{ value }
132 {}
133
134 explicit constexpr Optional(T &&value)
135 : m_hasValue{ true }
136 , m_value{ std::move(value) }
137 {}
138
139 const T &value() const
140 {
141 if(!hasValue())
142 {
143 throw std::runtime_error("value() called on unset optional");
144 }
145 return m_value;
146 }
147
148 bool hasValue() const
149 {
150 return m_hasValue;
151 }
152
153 void reset()
154 {
155 m_hasValue = false;
156 m_value = T{};
157 }
158
159 bool operator==(const Optional<T> &other) const
160 {
161 if(hasValue() != other.hasValue())
162 {
163 return false;
164 }
165 if(!hasValue())
166 {
167 return true;
168 }
169 return value() == other.value();
170 }
171
172 bool operator!=(const Optional<T> &other) const
173 {
174 return !operator==(other);
175 }
176
177 bool operator<(const Optional<T> &other) const
178 {
179 if(!hasValue() && !other.hasValue())
180 {
181 return false;
182 }
183 if(hasValue() && !other.hasValue())
184 {
185 return false;
186 }
187 if(!hasValue() && other.hasValue())
188 {
189 return true;
190 }
191 return m_value < other.m_value;
192 }
193
194 bool operator>(const Optional<T> &other) const
195 {
196 if(!hasValue() && !other.hasValue())
197 {
198 return false;
199 }
200 if(hasValue() && !other.hasValue())
201 {
202 return true;
203 }
204 if(!hasValue() && other.hasValue())
205 {
206 return false;
207 }
208 return m_value > other.m_value;
209 }
210
211 private:
212 bool m_hasValue;
213 T m_value;
214 };
215
216 template<typename T>
217 struct Befriend
218 {
219 static void setFromString(T &target, const std::string &value)
220 {
221 target.setFromString(value);
222 }
223
224 static void setFromString(T &target, const std::string &path, const std::string &value)
225 {
226 target.setFromString(path, value);
227 }
228
229 static std::string getString(const T &target, const std::string &path)
230 {
231 return target.getString(path);
232 }
233 };
234
235 template<typename T>
236 void setFromString(T &target, const std::string &value)
237 {
238 Befriend<T>::setFromString(target, value);
239 }
240
241 template<typename T>
242 void setFromString(T &target, const std::string &path, const std::string &value)
243 {
244 Befriend<T>::setFromString(target, path, value);
245 }
246
247 template<typename T>
248 std::string getString(const T &target, const std::string &path)
249 {
250 return Befriend<T>::getString(target, path);
251 }
252 } // namespace Detail
253#endif
254 } // namespace DataModel
255} // namespace Zivid
The main Zivid namespace. All Zivid code is found here
Definition: Application.h:99