cpp-common/bt2: add C++ component class bindings
[babeltrace.git] / src / cpp-common / bt2 / component-class.hpp
CommitLineData
cb036945
SM
1/*
2 * Copyright (c) 2024 EfficiOS, Inc.
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7#ifndef BABELTRACE_CPP_COMMON_BT2_COMPONENT_CLASS_HPP
8#define BABELTRACE_CPP_COMMON_BT2_COMPONENT_CLASS_HPP
9
10#include <babeltrace2/babeltrace.h>
11
12#include "cpp-common/bt2c/c-string-view.hpp"
13
14#include "borrowed-object.hpp"
15#include "shared-object.hpp"
16
17namespace bt2 {
18namespace internal {
19
20struct ComponentClassRefFuncs final
21{
22 static void get(const bt_component_class * const libObjPtr) noexcept
23 {
24 bt_component_class_get_ref(libObjPtr);
25 }
26
27 static void put(const bt_component_class * const libObjPtr) noexcept
28 {
29 bt_component_class_put_ref(libObjPtr);
30 }
31};
32
33} /* namespace internal */
34
35template <typename LibObjT>
36class CommonSourceComponentClass;
37
38template <typename LibObjT>
39class CommonFilterComponentClass;
40
41template <typename LibObjT>
42class CommonSinkComponentClass;
43
44template <typename LibObjT>
45class CommonComponentClass : public BorrowedObject<LibObjT>
46{
47private:
48 using _ThisBorrowedObject = BorrowedObject<LibObjT>;
49
50public:
51 using typename _ThisBorrowedObject::LibObjPtr;
52 using Shared = SharedObject<CommonComponentClass, LibObjT, internal::ComponentClassRefFuncs>;
53
54 explicit CommonComponentClass(const LibObjPtr libObjPtr) noexcept :
55 _ThisBorrowedObject {libObjPtr}
56 {
57 }
58
59 template <typename OtherLibObjT>
60 CommonComponentClass(const CommonComponentClass<OtherLibObjT> compCls) noexcept :
61 _ThisBorrowedObject {compCls}
62 {
63 }
64
65 template <typename OtherLibObjT>
66 CommonComponentClass operator=(const CommonComponentClass<OtherLibObjT> compCls) noexcept
67 {
68 _ThisBorrowedObject::operator=(compCls);
69 return *this;
70 }
71
72 /* Not `explicit` to make them behave like copy constructors */
73 CommonComponentClass(
74 const CommonSourceComponentClass<const bt_component_class_source> other) noexcept;
75 CommonComponentClass(
76 const CommonSourceComponentClass<bt_component_class_source> other) noexcept;
77 CommonComponentClass(
78 const CommonFilterComponentClass<const bt_component_class_filter> other) noexcept;
79 CommonComponentClass(
80 const CommonFilterComponentClass<bt_component_class_filter> other) noexcept;
81 CommonComponentClass(
82 const CommonSinkComponentClass<const bt_component_class_sink> other) noexcept;
83 CommonComponentClass(const CommonSinkComponentClass<bt_component_class_sink> other) noexcept;
84
85 CommonComponentClass
86 operator=(CommonSourceComponentClass<const bt_component_class_source> other) noexcept;
87 CommonComponentClass
88 operator=(CommonSourceComponentClass<bt_component_class_source> other) noexcept;
89 CommonComponentClass
90 operator=(CommonFilterComponentClass<const bt_component_class_filter> other) noexcept;
91 CommonComponentClass
92 operator=(CommonFilterComponentClass<bt_component_class_filter> other) noexcept;
93 CommonComponentClass
94 operator=(CommonSinkComponentClass<const bt_component_class_sink> other) noexcept;
95 CommonComponentClass
96 operator=(CommonSinkComponentClass<bt_component_class_sink> other) noexcept;
97
98 bool isSource() const noexcept
99 {
100 return static_cast<bool>(bt_component_class_is_source(this->libObjPtr()));
101 }
102
103 bool isFilter() const noexcept
104 {
105 return static_cast<bool>(bt_component_class_is_filter(this->libObjPtr()));
106 }
107
108 bool isSink() const noexcept
109 {
110 return static_cast<bool>(bt_component_class_is_sink(this->libObjPtr()));
111 }
112
113 bt2c::CStringView name() const noexcept
114 {
115 return bt_component_class_get_name(this->libObjPtr());
116 }
117
118 bt2c::CStringView description() const noexcept
119 {
120 return bt_component_class_get_description(this->libObjPtr());
121 }
122
123 bt2c::CStringView help() const noexcept
124 {
125 return bt_component_class_get_help(this->libObjPtr());
126 }
127};
128
129using ComponentClass = CommonComponentClass<bt_component_class>;
130using ConstComponentClass = CommonComponentClass<const bt_component_class>;
131
132namespace internal {
133
134struct SourceComponentClassRefFuncs final
135{
136 static void get(const bt_component_class_source * const libObjPtr) noexcept
137 {
138 bt_component_class_source_get_ref(libObjPtr);
139 }
140
141 static void put(const bt_component_class_source * const libObjPtr) noexcept
142 {
143 bt_component_class_source_put_ref(libObjPtr);
144 }
145};
146
147} /* namespace internal */
148
149template <typename LibObjT>
150class CommonSourceComponentClass final : public BorrowedObject<LibObjT>
151{
152private:
153 using _ThisBorrowedObject = BorrowedObject<LibObjT>;
154
155public:
156 using typename _ThisBorrowedObject::LibObjPtr;
157 using Shared =
158 SharedObject<CommonSourceComponentClass, LibObjT, internal::SourceComponentClassRefFuncs>;
159
160 CommonSourceComponentClass(const LibObjPtr libObjPtr) noexcept : _ThisBorrowedObject {libObjPtr}
161 {
162 }
163
164 template <typename OtherLibObjT>
165 CommonSourceComponentClass(const CommonSourceComponentClass<OtherLibObjT> compCls) noexcept :
166 _ThisBorrowedObject {compCls}
167 {
168 }
169
170 template <typename OtherLibObjT>
171 CommonSourceComponentClass
172 operator=(const CommonSourceComponentClass<OtherLibObjT> compCls) noexcept
173 {
174 _ThisBorrowedObject::operator=(compCls);
175 return *this;
176 }
177
178 bt2c::CStringView name() const noexcept
179 {
180 return this->_constComponentClass().name();
181 }
182
183 bt2c::CStringView description() const noexcept
184 {
185 return this->_constComponentClass().description();
186 }
187
188 bt2c::CStringView help() const noexcept
189 {
190 return this->_constComponentClass().help();
191 }
192
193private:
194 ConstComponentClass _constComponentClass() const noexcept
195 {
196 return ConstComponentClass {
197 bt_component_class_source_as_component_class_const(this->libObjPtr())};
198 }
199};
200
201template <typename LibObjT>
202CommonComponentClass<LibObjT>::CommonComponentClass(
203 const CommonSourceComponentClass<const bt_component_class_source> other) noexcept :
204 _ThisBorrowedObject {bt_component_class_source_as_component_class_const(other.libObjPtr())}
205{
206}
207
208template <typename LibObjT>
209CommonComponentClass<LibObjT>::CommonComponentClass(
210 const CommonSourceComponentClass<bt_component_class_source> other) noexcept :
211 _ThisBorrowedObject {bt_component_class_source_as_component_class(other.libObjPtr())}
212{
213}
214
215template <typename LibObjT>
216CommonComponentClass<LibObjT> CommonComponentClass<LibObjT>::operator=(
217 const CommonSourceComponentClass<const bt_component_class_source> other) noexcept
218{
219 BorrowedObject<LibObjT>::operator=(ConstComponentClass {
220 bt_component_class_source_as_component_class_const(other.libObjPtr())});
221 return *this;
222}
223
224template <typename LibObjT>
225CommonComponentClass<LibObjT> CommonComponentClass<LibObjT>::operator=(
226 const CommonSourceComponentClass<bt_component_class_source> other) noexcept
227{
228 BorrowedObject<LibObjT>::operator=(
229 ComponentClass {bt_component_class_source_as_component_class(other.libObjPtr())});
230 return *this;
231}
232
233using SourceComponentClass = CommonSourceComponentClass<bt_component_class_source>;
234using ConstSourceComponentClass = CommonSourceComponentClass<const bt_component_class_source>;
235
236namespace internal {
237
238struct FilterComponentClassRefFuncs final
239{
240 static void get(const bt_component_class_filter * const libObjPtr) noexcept
241 {
242 bt_component_class_filter_get_ref(libObjPtr);
243 }
244
245 static void put(const bt_component_class_filter * const libObjPtr) noexcept
246 {
247 bt_component_class_filter_put_ref(libObjPtr);
248 }
249};
250
251} /* namespace internal */
252
253template <typename LibObjT>
254class CommonFilterComponentClass final : public BorrowedObject<LibObjT>
255{
256private:
257 using _ThisBorrowedObject = BorrowedObject<LibObjT>;
258
259public:
260 using typename _ThisBorrowedObject::LibObjPtr;
261 using Shared =
262 SharedObject<CommonFilterComponentClass, LibObjT, internal::FilterComponentClassRefFuncs>;
263
264 CommonFilterComponentClass(const LibObjPtr libObjPtr) noexcept : _ThisBorrowedObject {libObjPtr}
265 {
266 }
267
268 template <typename OtherLibObjT>
269 CommonFilterComponentClass(const CommonFilterComponentClass<OtherLibObjT> compCls) noexcept :
270 _ThisBorrowedObject {compCls}
271 {
272 }
273
274 template <typename OtherLibObjT>
275 CommonFilterComponentClass
276 operator=(const CommonFilterComponentClass<OtherLibObjT> compCls) noexcept
277 {
278 _ThisBorrowedObject::operator=(compCls);
279 return *this;
280 }
281
282 bt2c::CStringView name() const noexcept
283 {
284 return this->_constComponentClass().name();
285 }
286
287 bt2c::CStringView description() const noexcept
288 {
289 return this->_constComponentClass().description();
290 }
291
292 bt2c::CStringView help() const noexcept
293 {
294 return this->_constComponentClass().help();
295 }
296
297private:
298 ConstComponentClass _constComponentClass() const noexcept
299 {
300 return ConstComponentClass {
301 bt_component_class_filter_as_component_class_const(this->libObjPtr())};
302 }
303};
304
305template <typename LibObjT>
306CommonComponentClass<LibObjT>::CommonComponentClass(
307 const CommonFilterComponentClass<const bt_component_class_filter> other) noexcept :
308 _ThisBorrowedObject {bt_component_class_filter_as_component_class_const(other.libObjPtr())}
309{
310}
311
312template <typename LibObjT>
313CommonComponentClass<LibObjT>::CommonComponentClass(
314 const CommonFilterComponentClass<bt_component_class_filter> other) noexcept :
315 _ThisBorrowedObject {bt_component_class_filter_as_component_class(other.libObjPtr())}
316{
317}
318
319template <typename LibObjT>
320CommonComponentClass<LibObjT> CommonComponentClass<LibObjT>::operator=(
321 const CommonFilterComponentClass<const bt_component_class_filter> other) noexcept
322{
323 BorrowedObject<LibObjT>::operator=(ConstComponentClass {
324 bt_component_class_filter_as_component_class_const(other.libObjPtr())});
325 return *this;
326}
327
328template <typename LibObjT>
329CommonComponentClass<LibObjT> CommonComponentClass<LibObjT>::operator=(
330 const CommonFilterComponentClass<bt_component_class_filter> other) noexcept
331{
332 BorrowedObject<LibObjT>::operator=(
333 ComponentClass {bt_component_class_filter_as_component_class(other.libObjPtr())});
334 return *this;
335}
336
337using FilterComponentClass = CommonFilterComponentClass<bt_component_class_filter>;
338using ConstFilterComponentClass = CommonFilterComponentClass<const bt_component_class_filter>;
339
340namespace internal {
341
342struct SinkComponentClassRefFuncs final
343{
344 static void get(const bt_component_class_sink * const libObjPtr) noexcept
345 {
346 bt_component_class_sink_get_ref(libObjPtr);
347 }
348
349 static void put(const bt_component_class_sink * const libObjPtr) noexcept
350 {
351 bt_component_class_sink_put_ref(libObjPtr);
352 }
353};
354
355} /* namespace internal */
356
357template <typename LibObjT>
358class CommonSinkComponentClass final : public BorrowedObject<LibObjT>
359{
360private:
361 using _ThisBorrowedObject = BorrowedObject<LibObjT>;
362
363public:
364 using typename _ThisBorrowedObject::LibObjPtr;
365 using Shared =
366 SharedObject<CommonSinkComponentClass, LibObjT, internal::SinkComponentClassRefFuncs>;
367
368 CommonSinkComponentClass(const LibObjPtr libObjPtr) noexcept : _ThisBorrowedObject {libObjPtr}
369 {
370 }
371
372 template <typename OtherLibObjT>
373 CommonSinkComponentClass(const CommonSinkComponentClass<OtherLibObjT> compCls) noexcept :
374 _ThisBorrowedObject {compCls}
375 {
376 }
377
378 template <typename OtherLibObjT>
379 CommonSinkComponentClass
380 operator=(const CommonSinkComponentClass<OtherLibObjT> compCls) noexcept
381 {
382 _ThisBorrowedObject::operator=(compCls);
383 return *this;
384 }
385
386 bt2c::CStringView name() const noexcept
387 {
388 return this->_constComponentClass().name();
389 }
390
391 bt2c::CStringView description() const noexcept
392 {
393 return this->_constComponentClass().description();
394 }
395
396 bt2c::CStringView help() const noexcept
397 {
398 return this->_constComponentClass().help();
399 }
400
401private:
402 ConstComponentClass _constComponentClass() const noexcept
403 {
404 return ConstComponentClass {
405 bt_component_class_sink_as_component_class_const(this->libObjPtr())};
406 }
407};
408
409template <typename LibObjT>
410CommonComponentClass<LibObjT>::CommonComponentClass(
411 const CommonSinkComponentClass<const bt_component_class_sink> other) noexcept :
412 _ThisBorrowedObject {bt_component_class_sink_as_component_class_const(other.libObjPtr())}
413{
414}
415
416template <typename LibObjT>
417CommonComponentClass<LibObjT>::CommonComponentClass(
418 const CommonSinkComponentClass<bt_component_class_sink> other) noexcept :
419 _ThisBorrowedObject {bt_component_class_sink_as_component_class(other.libObjPtr())}
420{
421}
422
423template <typename LibObjT>
424CommonComponentClass<LibObjT> CommonComponentClass<LibObjT>::operator=(
425 const CommonSinkComponentClass<const bt_component_class_sink> other) noexcept
426{
427 BorrowedObject<LibObjT>::operator=(
428 ConstComponentClass {bt_component_class_sink_as_component_class_const(other.libObjPtr())});
429 return *this;
430}
431
432template <typename LibObjT>
433CommonComponentClass<LibObjT> CommonComponentClass<LibObjT>::operator=(
434 const CommonSinkComponentClass<bt_component_class_sink> other) noexcept
435{
436 BorrowedObject<LibObjT>::operator=(
437 ComponentClass {bt_component_class_sink_as_component_class(other.libObjPtr())});
438 return *this;
439}
440
441using SinkComponentClass = CommonSinkComponentClass<bt_component_class_sink>;
442using ConstSinkComponentClass = CommonSinkComponentClass<const bt_component_class_sink>;
443
444} /* namespace bt2 */
445
446#endif /* BABELTRACE_CPP_COMMON_BT2_COMPONENT_CLASS_HPP */
This page took 0.040963 seconds and 4 git commands to generate.