Zivid C++ API
2.9.0+4dbba385-1
Defining the Future of 3D Machine Vision
Zivid
Detail
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) \
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
Generated by
1.9.3