Zivid C++ API 2.9.0+4dbba385-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-2023 (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) \
97public: \
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 \
109private: \
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) \
150public: \
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 \
161private: \
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) \
185public: \
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 \
199private: \
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