Zivid C++ API  2.4.2+1a2e8cfb-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 
94 namespace 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