Zivid C++ API  2.4.2+1a2e8cfb-1
Defining the Future of 3D Machine Vision
Pimpl.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 <memory>
92 
93 // Todo(ZIVID-983): Make doxygen skip most content in this file, but not regular functions. Possibly by using NO_DOC
94 
95 // ------------------------------------------------------------------------------------------------------------------ //
96 #define ZIVID_PIMPL_VALUE_SEMANTICS(ClassName, Attributes) \
97 public: \
98  Attributes ~ClassName(); \
99  Attributes ClassName(const ClassName &other); \
100  Attributes ClassName &operator=(const ClassName &other); \
101  Attributes ClassName(ClassName &&other) noexcept; \
102  Attributes ClassName &operator=(ClassName &&other) noexcept; \
103  \
104  Attributes explicit ClassName(std::unique_ptr<class ClassName##Impl> &&impl); \
105  Attributes explicit ClassName(class ClassName##Impl &&impl); \
106  Attributes class ClassName##Impl &getImpl(); \
107  Attributes const class ClassName##Impl &getImpl() const; \
108  \
109 private: \
110  std::unique_ptr<class ClassName##Impl> m_impl
111 
112 #define ZIVID_PIMPL_VALUE_SEMANTICS_CPP(ClassName) \
113  ClassName::ClassName(std::unique_ptr<ClassName##Impl> &&impl) \
114  : m_impl{ std::move(impl) } \
115  {} \
116  \
117  ClassName::ClassName(ClassName##Impl &&impl) \
118  : ClassName{ std::make_unique<ClassName##Impl>(std::move(impl)) } \
119  {} \
120  \
121  ClassName::ClassName(const ClassName &other) \
122  : ClassName{ ClassName##Impl{ other.getImpl() } } \
123  {} \
124  \
125  ClassName &ClassName::operator=(const ClassName &other) \
126  { \
127  if(this != &other) \
128  { \
129  *m_impl = other.getImpl(); \
130  } \
131  return *this; \
132  } \
133  \
134  ClassName##Impl &ClassName::getImpl() \
135  { \
136  return *m_impl; \
137  } \
138  \
139  const ClassName##Impl &ClassName::getImpl() const \
140  { \
141  return *m_impl; \
142  } \
143  \
144  ClassName::~ClassName() = default; \
145  ClassName::ClassName(ClassName &&other) noexcept = default; \
146  ClassName &ClassName::operator=(ClassName &&other) noexcept = default
147 
148 // ------------------------------------------------------------------------------------------------------------------ //
149 #define ZIVID_PIMPL_MOVE_ONLY(ClassName, Attributes) \
150 public: \
151  Attributes ~ClassName(); \
152  Attributes ClassName(const ClassName &other) = delete; \
153  Attributes ClassName &operator=(const ClassName &other) = delete; \
154  Attributes ClassName(ClassName &&other) noexcept; \
155  Attributes ClassName &operator=(ClassName &&other) noexcept; \
156  \
157  Attributes explicit ClassName(std::unique_ptr<class ClassName##Impl> &&impl); \
158  Attributes class ClassName##Impl &getImpl(); \
159  Attributes const class ClassName##Impl &getImpl() const; \
160  \
161 private: \
162  std::unique_ptr<class ClassName##Impl> m_impl
163 
164 #define ZIVID_PIMPL_MOVE_ONLY_CPP(ClassName) \
165  ClassName::ClassName(std::unique_ptr<ClassName##Impl> &&impl) \
166  : m_impl{ std::move(impl) } \
167  {} \
168  \
169  ClassName##Impl &ClassName::getImpl() \
170  { \
171  return *m_impl; \
172  } \
173  \
174  const ClassName##Impl &ClassName::getImpl() const \
175  { \
176  return *m_impl; \
177  } \
178  \
179  ClassName::~ClassName() = default; \
180  ClassName::ClassName(ClassName &&other) noexcept = default; \
181  ClassName &ClassName::operator=(ClassName &&other) noexcept = default
182 
183 // ------------------------------------------------------------------------------------------------------------------ //
184 #define ZIVID_PIMPL_REFERENCE_SEMANTICS(ClassName, Attributes) \
185 public: \
186  \
187  Attributes ClassName clone() const; \
188  \
189  Attributes ~ClassName(); \
190  Attributes ClassName(const ClassName &other); \
191  Attributes ClassName &operator=(const ClassName &other); \
192  Attributes ClassName(ClassName &&other) noexcept; \
193  Attributes ClassName &operator=(ClassName &&other) noexcept; \
194  \
195  Attributes explicit ClassName(class ClassName##Impl &&impl); \
196  Attributes class ClassName##Impl &getImpl(); \
197  Attributes const class ClassName##Impl &getImpl() const; \
198  \
199 private: \
200  std::shared_ptr<class ClassName##Impl> m_impl
201 
202 #define ZIVID_PIMPL_REFERENCE_SEMANTICS_CPP(ClassName) \
203  ClassName::ClassName(ClassName##Impl &&impl) \
204  : m_impl{ std::make_shared<ClassName##Impl>(std::move(impl)) } \
205  {} \
206  \
207  ClassName##Impl &ClassName::getImpl() \
208  { \
209  return *m_impl; \
210  } \
211  \
212  const ClassName##Impl &ClassName::getImpl() const \
213  { \
214  return *m_impl; \
215  } \
216  \
217  ClassName ClassName::clone() const \
218  { \
219  return ClassName{ ClassName##Impl{ *m_impl } }; \
220  } \
221  \
222  ClassName::~ClassName() = default; \
223  ClassName::ClassName(const ClassName &other) = default; \
224  ClassName &ClassName::operator=(const ClassName &other) = default; \
225  ClassName::ClassName(ClassName &&other) noexcept = default; \
226  ClassName &ClassName::operator=(ClassName &&other) noexcept = default