bt2::internal::BorrowedObj: add static assertions for generic copy ops.
[babeltrace.git] / src / cpp-common / bt2 / value.hpp
CommitLineData
33a17831
PP
1/*
2 * Copyright (c) 2020 Philippe Proulx <pproulx@efficios.com>
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7#ifndef BABELTRACE_CPP_COMMON_BT2_VALUE_HPP
8#define BABELTRACE_CPP_COMMON_BT2_VALUE_HPP
9
10#include <type_traits>
11#include <cstdint>
12#include <functional>
3a343611 13#include <iterator>
33a17831
PP
14#include <babeltrace2/babeltrace.h>
15
16#include "common/assert.h"
17#include "common/common.h"
9ded8453 18#include "common-iter.hpp"
33a17831
PP
19#include "internal/borrowed-obj.hpp"
20#include "internal/shared-obj.hpp"
21#include "internal/utils.hpp"
22#include "cpp-common/optional.hpp"
23#include "cpp-common/string_view.hpp"
24#include "lib-error.hpp"
25
26namespace bt2 {
33a17831
PP
27namespace internal {
28
29struct ValueRefFuncs final
30{
31 static void get(const bt_value * const libObjPtr)
32 {
33 bt_value_get_ref(libObjPtr);
34 }
35
36 static void put(const bt_value * const libObjPtr)
37 {
38 bt_value_put_ref(libObjPtr);
39 }
40};
41
42template <typename ObjT, typename LibObjT>
43using SharedValue = internal::SharedObj<ObjT, LibObjT, internal::ValueRefFuncs>;
44
b5f55e9f 45} /* namespace internal */
33a17831
PP
46
47template <typename LibObjT>
48class CommonNullValue;
49
50template <typename LibObjT>
51class CommonBoolValue;
52
53template <typename LibObjT>
54class CommonUnsignedIntegerValue;
55
56template <typename LibObjT>
57class CommonSignedIntegerValue;
58
59template <typename LibObjT>
60class CommonRealValue;
61
62template <typename LibObjT>
63class CommonStringValue;
64
65template <typename LibObjT>
66class CommonArrayValue;
67
68template <typename LibObjT>
69class CommonMapValue;
70
71enum class ValueType
72{
73 NUL = BT_VALUE_TYPE_NULL,
74 BOOL = BT_VALUE_TYPE_BOOL,
75 UNSIGNED_INTEGER = BT_VALUE_TYPE_UNSIGNED_INTEGER,
76 SIGNED_INTEGER = BT_VALUE_TYPE_SIGNED_INTEGER,
77 REAL = BT_VALUE_TYPE_REAL,
78 STRING = BT_VALUE_TYPE_STRING,
79 ARRAY = BT_VALUE_TYPE_ARRAY,
80 MAP = BT_VALUE_TYPE_MAP,
81};
82
cfc44919
PP
83template <typename LibObjT>
84class CommonClockClass;
85
12435a68
PP
86template <typename LibObjT>
87class CommonFieldClass;
88
74fc764d
PP
89template <typename LibObjT>
90class CommonTraceClass;
91
92template <typename LibObjT>
93class CommonStreamClass;
94
95template <typename LibObjT>
96class CommonEventClass;
97
98template <typename LibObjT>
99class CommonStream;
100
33a17831
PP
101template <typename LibObjT>
102class CommonValue : public internal::BorrowedObj<LibObjT>
103{
341a67c4 104 /* Allow append() to call `val.libObjPtr()` */
33a17831
PP
105 friend class CommonArrayValue<bt_value>;
106
341a67c4 107 /* Allow insert() to call `val.libObjPtr()` */
33a17831
PP
108 friend class CommonMapValue<bt_value>;
109
341a67c4 110 /* Allow userAttributes() to call `val.libObjPtr()` */
cfc44919 111 friend class CommonClockClass<bt_clock_class>;
12435a68 112 friend class CommonFieldClass<bt_field_class>;
74fc764d
PP
113 friend class CommonTraceClass<bt_trace_class>;
114 friend class CommonStreamClass<bt_stream_class>;
115 friend class CommonEventClass<bt_event_class>;
116 friend class CommonStream<bt_stream>;
cfc44919 117
341a67c4 118 /* Allow operator==() to call `other.libObjPtr()` */
33a17831
PP
119 friend class CommonValue<bt_value>;
120 friend class CommonValue<const bt_value>;
121
122private:
123 using typename internal::BorrowedObj<LibObjT>::_ThisBorrowedObj;
124
125protected:
126 using typename internal::BorrowedObj<LibObjT>::_LibObjPtr;
127 using _ThisCommonValue = CommonValue<LibObjT>;
128
129public:
130 using Shared = internal::SharedValue<CommonValue<LibObjT>, LibObjT>;
131
132 explicit CommonValue(const _LibObjPtr libObjPtr) noexcept : _ThisBorrowedObj {libObjPtr}
133 {
134 }
135
136 template <typename OtherLibObjT>
137 CommonValue(const CommonValue<OtherLibObjT>& val) noexcept : _ThisBorrowedObj {val}
138 {
139 }
140
141 template <typename OtherLibObjT>
142 _ThisCommonValue& operator=(const CommonValue<OtherLibObjT>& val) noexcept
143 {
144 _ThisBorrowedObj::operator=(val);
145 return *this;
146 }
147
148 ValueType type() const noexcept
149 {
341a67c4 150 return static_cast<ValueType>(bt_value_get_type(this->libObjPtr()));
33a17831
PP
151 }
152
153 bool isNull() const noexcept
154 {
155 return this->_libTypeIs(BT_VALUE_TYPE_NULL);
156 }
157
158 bool isBool() const noexcept
159 {
160 return this->_libTypeIs(BT_VALUE_TYPE_BOOL);
161 }
162
163 bool isInteger() const noexcept
164 {
165 return this->_libTypeIs(BT_VALUE_TYPE_INTEGER);
166 }
167
168 bool isUnsignedInteger() const noexcept
169 {
170 return this->_libTypeIs(BT_VALUE_TYPE_UNSIGNED_INTEGER);
171 }
172
173 bool isSignedInteger() const noexcept
174 {
175 return this->_libTypeIs(BT_VALUE_TYPE_SIGNED_INTEGER);
176 }
177
178 bool isReal() const noexcept
179 {
180 return this->_libTypeIs(BT_VALUE_TYPE_REAL);
181 }
182
183 bool isString() const noexcept
184 {
185 return this->_libTypeIs(BT_VALUE_TYPE_STRING);
186 }
187
188 bool isArray() const noexcept
189 {
190 return this->_libTypeIs(BT_VALUE_TYPE_ARRAY);
191 }
192
193 bool isMap() const noexcept
194 {
195 return this->_libTypeIs(BT_VALUE_TYPE_MAP);
196 }
197
198 template <typename OtherLibObjT>
199 bool operator==(const CommonValue<OtherLibObjT>& other) const noexcept
200 {
341a67c4 201 return static_cast<bool>(bt_value_is_equal(this->libObjPtr(), other.libObjPtr()));
33a17831
PP
202 }
203
204 template <typename OtherLibObjT>
205 bool operator!=(const CommonValue<OtherLibObjT>& other) const noexcept
206 {
207 return !(*this == other);
208 }
209
210 Shared shared() const noexcept
211 {
c9c0b6e2 212 return Shared::createWithRef(*this);
33a17831
PP
213 }
214
215 CommonNullValue<LibObjT> asNull() const noexcept;
216 CommonBoolValue<LibObjT> asBool() const noexcept;
217 CommonSignedIntegerValue<LibObjT> asSignedInteger() const noexcept;
218 CommonUnsignedIntegerValue<LibObjT> asUnsignedInteger() const noexcept;
219 CommonRealValue<LibObjT> asReal() const noexcept;
220 CommonStringValue<LibObjT> asString() const noexcept;
221 CommonArrayValue<LibObjT> asArray() const noexcept;
222 CommonMapValue<LibObjT> asMap() const noexcept;
223
224protected:
225 bool _libTypeIs(const bt_value_type type) const noexcept
226 {
341a67c4 227 return bt_value_type_is(bt_value_get_type(this->libObjPtr()), type);
33a17831
PP
228 }
229};
230
231using Value = CommonValue<bt_value>;
232using ConstValue = CommonValue<const bt_value>;
233
4927bae7
PP
234namespace internal {
235
236struct ValueTypeDescr
237{
238 using Const = ConstValue;
239 using NonConst = Value;
240};
241
242template <>
243struct TypeDescr<Value> : public ValueTypeDescr
244{
245};
246
247template <>
248struct TypeDescr<ConstValue> : public ValueTypeDescr
249{
250};
251
252} /* namespace internal */
253
33a17831
PP
254template <typename LibObjT>
255class CommonNullValue final : public CommonValue<LibObjT>
256{
257private:
258 using typename CommonValue<LibObjT>::_ThisCommonValue;
259
260public:
261 using Shared = internal::SharedValue<CommonNullValue<LibObjT>, LibObjT>;
262
263 CommonNullValue() noexcept : _ThisCommonValue {bt_value_null}
264 {
265 }
266
267 template <typename OtherLibObjT>
268 CommonNullValue(const CommonNullValue<OtherLibObjT>& val) noexcept : _ThisCommonValue {val}
269 {
270 }
271
272 template <typename OtherLibObjT>
273 CommonNullValue<LibObjT>& operator=(const CommonNullValue<OtherLibObjT>& val) noexcept
274 {
275 _ThisCommonValue::operator=(val);
276 return *this;
277 }
278
279 Shared shared() const noexcept
280 {
c9c0b6e2 281 return Shared::createWithRef(*this);
33a17831
PP
282 }
283};
284
285using NullValue = CommonNullValue<bt_value>;
286using ConstNullValue = CommonNullValue<const bt_value>;
287
4927bae7
PP
288namespace internal {
289
290struct NullValueTypeDescr
291{
292 using Const = ConstNullValue;
293 using NonConst = NullValue;
294};
295
296template <>
297struct TypeDescr<NullValue> : public NullValueTypeDescr
298{
299};
300
301template <>
302struct TypeDescr<ConstNullValue> : public NullValueTypeDescr
303{
304};
305
306} /* namespace internal */
307
33a17831
PP
308template <typename LibObjT>
309class CommonBoolValue final : public CommonValue<LibObjT>
310{
311private:
312 using typename CommonValue<LibObjT>::_LibObjPtr;
313 using typename CommonValue<LibObjT>::_ThisCommonValue;
314
315public:
316 using Shared = internal::SharedValue<CommonBoolValue<LibObjT>, LibObjT>;
317 using Value = bool;
318
319 explicit CommonBoolValue(const _LibObjPtr libObjPtr) noexcept : _ThisCommonValue {libObjPtr}
320 {
321 BT_ASSERT_DBG(this->isBool());
322 }
323
324 template <typename OtherLibObjT>
325 CommonBoolValue(const CommonBoolValue<OtherLibObjT>& val) noexcept : _ThisCommonValue {val}
326 {
327 }
328
329 static Shared create(const Value rawVal = false)
330 {
331 const auto libObjPtr = bt_value_bool_create_init(static_cast<bt_bool>(rawVal));
332
333 internal::validateCreatedObjPtr(libObjPtr);
c9c0b6e2 334 return CommonBoolValue::Shared::createWithoutRef(libObjPtr);
33a17831
PP
335 }
336
337 template <typename OtherLibObjT>
338 CommonBoolValue<LibObjT>& operator=(const CommonBoolValue<OtherLibObjT>& val) noexcept
339 {
340 _ThisCommonValue::operator=(val);
341 return *this;
342 }
343
344 CommonBoolValue<LibObjT>& operator=(const Value rawVal) noexcept
345 {
346 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
347
341a67c4 348 bt_value_bool_set(this->libObjPtr(), static_cast<bt_bool>(rawVal));
33a17831
PP
349 return *this;
350 }
351
352 Value value() const noexcept
353 {
341a67c4 354 return static_cast<Value>(bt_value_bool_get(this->libObjPtr()));
33a17831
PP
355 }
356
357 operator Value() const noexcept
358 {
359 return this->value();
360 }
361
362 Shared shared() const noexcept
363 {
c9c0b6e2 364 return Shared::createWithRef(*this);
33a17831
PP
365 }
366};
367
368using BoolValue = CommonBoolValue<bt_value>;
369using ConstBoolValue = CommonBoolValue<const bt_value>;
370
4927bae7
PP
371namespace internal {
372
373struct BoolValueTypeDescr
374{
375 using Const = ConstBoolValue;
376 using NonConst = BoolValue;
377};
378
379template <>
380struct TypeDescr<BoolValue> : public BoolValueTypeDescr
381{
382};
383
384template <>
385struct TypeDescr<ConstBoolValue> : public BoolValueTypeDescr
386{
387};
388
389} /* namespace internal */
390
33a17831
PP
391template <typename LibObjT>
392class CommonUnsignedIntegerValue final : public CommonValue<LibObjT>
393{
394private:
395 using typename CommonValue<LibObjT>::_LibObjPtr;
396 using typename CommonValue<LibObjT>::_ThisCommonValue;
397
398public:
399 using Shared = internal::SharedValue<CommonUnsignedIntegerValue<LibObjT>, LibObjT>;
400 using Value = std::uint64_t;
401
402 explicit CommonUnsignedIntegerValue(const _LibObjPtr libObjPtr) noexcept :
403 _ThisCommonValue {libObjPtr}
404 {
405 BT_ASSERT_DBG(this->isUnsignedInteger());
406 }
407
408 static Shared create(const Value rawVal = 0)
409 {
410 const auto libObjPtr = bt_value_integer_unsigned_create_init(rawVal);
411
412 internal::validateCreatedObjPtr(libObjPtr);
c9c0b6e2 413 return CommonUnsignedIntegerValue::Shared::createWithoutRef(libObjPtr);
33a17831
PP
414 }
415
416 template <typename OtherLibObjT>
417 CommonUnsignedIntegerValue(const CommonUnsignedIntegerValue<OtherLibObjT>& val) noexcept :
418 _ThisCommonValue {val}
419 {
420 }
421
422 template <typename OtherLibObjT>
423 CommonUnsignedIntegerValue<LibObjT>&
424 operator=(const CommonUnsignedIntegerValue<OtherLibObjT>& val) noexcept
425 {
426 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
427
428 _ThisCommonValue::operator=(val);
429 return *this;
430 }
431
432 CommonUnsignedIntegerValue<LibObjT>& operator=(const Value rawVal) noexcept
433 {
341a67c4 434 bt_value_integer_unsigned_set(this->libObjPtr(), rawVal);
33a17831
PP
435 return *this;
436 }
437
438 Value value() const noexcept
439 {
341a67c4 440 return bt_value_integer_unsigned_get(this->libObjPtr());
33a17831
PP
441 }
442
443 operator Value() const noexcept
444 {
445 return this->value();
446 }
447
448 Shared shared() const noexcept
449 {
c9c0b6e2 450 return Shared::createWithRef(*this);
33a17831
PP
451 }
452};
453
454using UnsignedIntegerValue = CommonUnsignedIntegerValue<bt_value>;
455using ConstUnsignedIntegerValue = CommonUnsignedIntegerValue<const bt_value>;
456
4927bae7
PP
457namespace internal {
458
459struct UnsignedIntegerValueTypeDescr
460{
461 using Const = ConstUnsignedIntegerValue;
462 using NonConst = UnsignedIntegerValue;
463};
464
465template <>
466struct TypeDescr<UnsignedIntegerValue> : public UnsignedIntegerValueTypeDescr
467{
468};
469
470template <>
471struct TypeDescr<ConstUnsignedIntegerValue> : public UnsignedIntegerValueTypeDescr
472{
473};
474
475} /* namespace internal */
476
33a17831
PP
477template <typename LibObjT>
478class CommonSignedIntegerValue final : public CommonValue<LibObjT>
479{
480private:
481 using typename CommonValue<LibObjT>::_LibObjPtr;
482 using typename CommonValue<LibObjT>::_ThisCommonValue;
483
484public:
485 using Shared = internal::SharedValue<CommonSignedIntegerValue<LibObjT>, LibObjT>;
486 using Value = std::int64_t;
487
488 explicit CommonSignedIntegerValue(const _LibObjPtr libObjPtr) noexcept :
489 _ThisCommonValue {libObjPtr}
490 {
491 BT_ASSERT_DBG(this->isSignedInteger());
492 }
493
494 static Shared create(const Value rawVal = 0)
495 {
496 const auto libObjPtr = bt_value_integer_signed_create_init(rawVal);
497
498 internal::validateCreatedObjPtr(libObjPtr);
c9c0b6e2 499 return CommonSignedIntegerValue::Shared::createWithoutRef(libObjPtr);
33a17831
PP
500 }
501
502 template <typename OtherLibObjT>
503 CommonSignedIntegerValue(const CommonSignedIntegerValue<OtherLibObjT>& val) noexcept :
504 _ThisCommonValue {val}
505 {
506 }
507
508 template <typename OtherLibObjT>
509 CommonSignedIntegerValue<LibObjT>&
510 operator=(const CommonSignedIntegerValue<OtherLibObjT>& val) noexcept
511 {
512 _ThisCommonValue::operator=(val);
513 return *this;
514 }
515
516 CommonSignedIntegerValue<LibObjT>& operator=(const Value rawVal) noexcept
517 {
518 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
519
341a67c4 520 bt_value_integer_signed_set(this->libObjPtr(), rawVal);
33a17831
PP
521 return *this;
522 }
523
524 Value value() const noexcept
525 {
341a67c4 526 return bt_value_integer_signed_get(this->libObjPtr());
33a17831
PP
527 }
528
529 operator Value() const noexcept
530 {
531 return this->value();
532 }
533
534 Shared shared() const noexcept
535 {
c9c0b6e2 536 return Shared::createWithRef(*this);
33a17831
PP
537 }
538};
539
540using SignedIntegerValue = CommonSignedIntegerValue<bt_value>;
541using ConstSignedIntegerValue = CommonSignedIntegerValue<const bt_value>;
542
4927bae7
PP
543namespace internal {
544
545struct SignedIntegerValueTypeDescr
546{
547 using Const = ConstSignedIntegerValue;
548 using NonConst = SignedIntegerValue;
549};
550
551template <>
552struct TypeDescr<SignedIntegerValue> : public SignedIntegerValueTypeDescr
553{
554};
555
556template <>
557struct TypeDescr<ConstSignedIntegerValue> : public SignedIntegerValueTypeDescr
558{
559};
560
561} /* namespace internal */
562
33a17831
PP
563template <typename LibObjT>
564class CommonRealValue final : public CommonValue<LibObjT>
565{
566private:
567 using typename CommonValue<LibObjT>::_LibObjPtr;
568 using typename CommonValue<LibObjT>::_ThisCommonValue;
569
570public:
571 using Shared = internal::SharedValue<CommonRealValue<LibObjT>, LibObjT>;
572 using Value = double;
573
574 explicit CommonRealValue(const _LibObjPtr libObjPtr) noexcept : _ThisCommonValue {libObjPtr}
575 {
576 BT_ASSERT_DBG(this->isReal());
577 }
578
579 static Shared create(const Value rawVal = 0)
580 {
581 const auto libObjPtr = bt_value_real_create_init(rawVal);
582
583 internal::validateCreatedObjPtr(libObjPtr);
c9c0b6e2 584 return CommonRealValue::Shared::createWithoutRef(libObjPtr);
33a17831
PP
585 }
586
587 template <typename OtherLibObjT>
588 CommonRealValue(const CommonRealValue<OtherLibObjT>& val) noexcept : _ThisCommonValue {val}
589 {
590 }
591
592 template <typename OtherLibObjT>
593 CommonRealValue<LibObjT>& operator=(const CommonRealValue<OtherLibObjT>& val) noexcept
594 {
595 _ThisCommonValue::operator=(val);
596 return *this;
597 }
598
599 CommonRealValue<LibObjT>& operator=(const Value rawVal) noexcept
600 {
601 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
602
341a67c4 603 bt_value_real_set(this->libObjPtr(), rawVal);
33a17831
PP
604 return *this;
605 }
606
607 Value value() const noexcept
608 {
341a67c4 609 return bt_value_real_get(this->libObjPtr());
33a17831
PP
610 }
611
612 operator Value() const noexcept
613 {
614 return this->value();
615 }
616
617 Shared shared() const noexcept
618 {
c9c0b6e2 619 return Shared::createWithRef(*this);
33a17831
PP
620 }
621};
622
623using RealValue = CommonRealValue<bt_value>;
624using ConstRealValue = CommonRealValue<const bt_value>;
625
4927bae7
PP
626namespace internal {
627
628struct RealValueTypeDescr
629{
630 using Const = ConstRealValue;
631 using NonConst = RealValue;
632};
633
634template <>
635struct TypeDescr<RealValue> : public RealValueTypeDescr
636{
637};
638
639template <>
640struct TypeDescr<ConstRealValue> : public RealValueTypeDescr
641{
642};
643
644} /* namespace internal */
645
33a17831
PP
646template <typename LibObjT>
647class CommonStringValue final : public CommonValue<LibObjT>
648{
649private:
650 using typename CommonValue<LibObjT>::_LibObjPtr;
651 using typename CommonValue<LibObjT>::_ThisCommonValue;
652
653public:
654 using Shared = internal::SharedValue<CommonStringValue<LibObjT>, LibObjT>;
655
656 explicit CommonStringValue(const _LibObjPtr libObjPtr) noexcept : _ThisCommonValue {libObjPtr}
657 {
658 BT_ASSERT_DBG(this->isString());
659 }
660
661 static Shared create(const char * const rawVal = "")
662 {
663 const auto libObjPtr = bt_value_string_create_init(rawVal);
664
665 internal::validateCreatedObjPtr(libObjPtr);
c9c0b6e2 666 return CommonStringValue::Shared::createWithoutRef(libObjPtr);
33a17831
PP
667 }
668
669 static Shared create(const std::string& rawVal)
670 {
c9c0b6e2 671 return CommonStringValue::create(rawVal.data());
33a17831
PP
672 }
673
674 template <typename OtherLibObjT>
675 CommonStringValue(const CommonStringValue<OtherLibObjT>& val) noexcept : _ThisCommonValue {val}
676 {
677 }
678
679 template <typename OtherLibObjT>
680 CommonStringValue<LibObjT>& operator=(const CommonStringValue<OtherLibObjT>& val) noexcept
681 {
682 _ThisCommonValue::operator=(val);
683 return *this;
684 }
685
686 CommonStringValue<LibObjT>& operator=(const char * const rawVal)
687 {
688 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
689
341a67c4 690 const auto status = bt_value_string_set(this->libObjPtr(), rawVal);
33a17831
PP
691
692 if (status == BT_VALUE_STRING_SET_STATUS_MEMORY_ERROR) {
693 throw LibMemoryError {};
694 }
695
696 return *this;
697 }
698
699 CommonStringValue<LibObjT>& operator=(const std::string& rawVal) noexcept
700 {
701 return *this = rawVal.data();
702 }
703
704 bpstd::string_view value() const noexcept
705 {
341a67c4 706 return bt_value_string_get(this->libObjPtr());
33a17831
PP
707 }
708
709 Shared shared() const noexcept
710 {
c9c0b6e2 711 return Shared::createWithRef(*this);
33a17831
PP
712 }
713};
714
715using StringValue = CommonStringValue<bt_value>;
716using ConstStringValue = CommonStringValue<const bt_value>;
717
718namespace internal {
719
4927bae7
PP
720struct StringValueTypeDescr
721{
722 using Const = ConstStringValue;
723 using NonConst = StringValue;
724};
725
726template <>
727struct TypeDescr<StringValue> : public StringValueTypeDescr
728{
729};
730
731template <>
732struct TypeDescr<ConstStringValue> : public StringValueTypeDescr
733{
734};
735
33a17831
PP
736template <typename LibObjT>
737struct CommonArrayValueSpec;
738
b5f55e9f 739/* Functions specific to mutable array values */
33a17831
PP
740template <>
741struct CommonArrayValueSpec<bt_value> final
742{
743 static bt_value *elementByIndex(bt_value * const libValPtr, const std::uint64_t index) noexcept
744 {
745 return bt_value_array_borrow_element_by_index(libValPtr, index);
746 }
747};
748
b5f55e9f 749/* Functions specific to constant array values */
33a17831
PP
750template <>
751struct CommonArrayValueSpec<const bt_value> final
752{
753 static const bt_value *elementByIndex(const bt_value * const libValPtr,
754 const std::uint64_t index) noexcept
755 {
756 return bt_value_array_borrow_element_by_index_const(libValPtr, index);
757 }
758};
759
b5f55e9f 760} /* namespace internal */
33a17831
PP
761
762template <typename LibObjT>
763class CommonArrayValue final : public CommonValue<LibObjT>
764{
765private:
766 using typename CommonValue<LibObjT>::_LibObjPtr;
767 using typename CommonValue<LibObjT>::_ThisCommonValue;
768
769public:
770 using Shared = internal::SharedValue<CommonArrayValue<LibObjT>, LibObjT>;
9ded8453 771 using Iterator = CommonIterator<CommonArrayValue<LibObjT>, CommonValue<LibObjT>>;
33a17831
PP
772
773 explicit CommonArrayValue(const _LibObjPtr libObjPtr) noexcept : _ThisCommonValue {libObjPtr}
774 {
775 BT_ASSERT_DBG(this->isArray());
776 }
777
778 static Shared create()
779 {
780 const auto libObjPtr = bt_value_array_create();
781
782 internal::validateCreatedObjPtr(libObjPtr);
c9c0b6e2 783 return CommonArrayValue::Shared::createWithoutRef(libObjPtr);
33a17831
PP
784 }
785
786 template <typename OtherLibObjT>
787 CommonArrayValue(const CommonArrayValue<OtherLibObjT>& val) noexcept : _ThisCommonValue {val}
788 {
789 }
790
791 template <typename OtherLibObjT>
792 CommonArrayValue<LibObjT>& operator=(const CommonArrayValue<OtherLibObjT>& val) noexcept
793 {
794 _ThisCommonValue::operator=(val);
795 return *this;
796 }
797
798 std::uint64_t length() const noexcept
799 {
341a67c4 800 return bt_value_array_get_length(this->libObjPtr());
33a17831
PP
801 }
802
9ded8453
FD
803 /* Required by the `CommonIterator` template class */
804 std::uint64_t size() const noexcept
805 {
806 return this->length();
807 }
808
3a343611
FD
809 Iterator begin() const noexcept
810 {
811 return Iterator {*this, 0};
812 }
813
814 Iterator end() const noexcept
815 {
816 return Iterator {*this, this->length()};
817 }
818
33a17831
PP
819 bool isEmpty() const noexcept
820 {
821 return this->length() == 0;
822 }
823
824 ConstValue operator[](const std::uint64_t index) const noexcept
825 {
826 return ConstValue {internal::CommonArrayValueSpec<const bt_value>::elementByIndex(
341a67c4 827 this->libObjPtr(), index)};
33a17831
PP
828 }
829
830 CommonValue<LibObjT> operator[](const std::uint64_t index) noexcept
831 {
832 return CommonValue<LibObjT> {
341a67c4 833 internal::CommonArrayValueSpec<LibObjT>::elementByIndex(this->libObjPtr(), index)};
33a17831
PP
834 }
835
836 void append(const Value& val)
837 {
838 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
839
341a67c4 840 const auto status = bt_value_array_append_element(this->libObjPtr(), val.libObjPtr());
33a17831
PP
841
842 this->_handleAppendLibStatus(status);
843 }
844
845 void append(const bool rawVal)
846 {
847 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
848
849 const auto status =
341a67c4 850 bt_value_array_append_bool_element(this->libObjPtr(), static_cast<bt_bool>(rawVal));
33a17831
PP
851
852 this->_handleAppendLibStatus(status);
853 }
854
855 void append(const std::uint64_t rawVal)
856 {
857 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
858
859 const auto status =
341a67c4 860 bt_value_array_append_unsigned_integer_element(this->libObjPtr(), rawVal);
33a17831
PP
861
862 this->_handleAppendLibStatus(status);
863 }
864
865 void append(const std::int64_t rawVal)
866 {
867 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
868
341a67c4 869 const auto status = bt_value_array_append_signed_integer_element(this->libObjPtr(), rawVal);
33a17831
PP
870
871 this->_handleAppendLibStatus(status);
872 }
873
874 void append(const double rawVal)
875 {
876 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
877
341a67c4 878 const auto status = bt_value_array_append_real_element(this->libObjPtr(), rawVal);
33a17831
PP
879
880 this->_handleAppendLibStatus(status);
881 }
882
883 void append(const char * const rawVal)
884 {
885 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
886
341a67c4 887 const auto status = bt_value_array_append_string_element(this->libObjPtr(), rawVal);
33a17831
PP
888
889 this->_handleAppendLibStatus(status);
890 }
891
892 void append(const std::string& rawVal)
893 {
894 this->append(rawVal.data());
895 }
896
897 CommonArrayValue<bt_value> appendEmptyArray();
898 CommonMapValue<bt_value> appendEmptyMap();
899
900 void operator+=(const Value& val)
901 {
902 this->append(val);
903 }
904
905 void operator+=(const bool rawVal)
906 {
907 this->append(rawVal);
908 }
909
910 void operator+=(const std::uint64_t rawVal)
911 {
912 this->append(rawVal);
913 }
914
915 void operator+=(const std::int64_t rawVal)
916 {
917 this->append(rawVal);
918 }
919
920 void operator+=(const double rawVal)
921 {
922 this->append(rawVal);
923 }
924
925 void operator+=(const char * const rawVal)
926 {
927 this->append(rawVal);
928 }
929
930 void operator+=(const std::string& rawVal)
931 {
932 this->append(rawVal);
933 }
934
935 Shared shared() const noexcept
936 {
c9c0b6e2 937 return Shared::createWithRef(*this);
33a17831
PP
938 }
939
940private:
941 void _handleAppendLibStatus(const bt_value_array_append_element_status status) const
942 {
943 if (status == BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_MEMORY_ERROR) {
944 throw LibMemoryError {};
945 }
946 }
947};
948
949using ArrayValue = CommonArrayValue<bt_value>;
950using ConstArrayValue = CommonArrayValue<const bt_value>;
951
952namespace internal {
953
4927bae7
PP
954struct ArrayValueTypeDescr
955{
956 using Const = ConstArrayValue;
957 using NonConst = ArrayValue;
958};
959
960template <>
961struct TypeDescr<ArrayValue> : public ArrayValueTypeDescr
962{
963};
964
965template <>
966struct TypeDescr<ConstArrayValue> : public ArrayValueTypeDescr
967{
968};
969
33a17831
PP
970/*
971 * Type of a user function passed to `CommonMapValue<ObjT>::forEach()`.
972 *
973 * First argument is the entry's key, second is its value.
974 */
975template <typename ObjT>
976using CommonMapValueForEachUserFunc = std::function<void(const bpstd::string_view&, ObjT)>;
977
978/*
979 * Template of a function to be passed to bt_value_map_foreach_entry()
980 * for bt_value_map_foreach_entry_const() which calls a user function.
981 *
982 * `userData` is casted to a `const` pointer to
983 * `CommonMapValueForEachUserFunc<ObjT>` (the user function to call).
984 *
985 * This function catches any exception which the user function throws
986 * and returns the `ErrorStatus` value. If there's no execption, this
987 * function returns the `OkStatus` value.
988 */
989template <typename ObjT, typename LibObjT, typename LibStatusT, int OkStatus, int ErrorStatus>
990LibStatusT mapValueForEachLibFunc(const char * const key, LibObjT * const libObjPtr,
991 void * const userData)
992{
993 const auto& userFunc = *reinterpret_cast<const CommonMapValueForEachUserFunc<ObjT> *>(userData);
994
995 try {
996 userFunc(key, ObjT {libObjPtr});
997 } catch (...) {
998 return static_cast<LibStatusT>(ErrorStatus);
999 }
1000
1001 return static_cast<LibStatusT>(OkStatus);
1002}
1003
1004template <typename LibObjT>
1005struct CommonMapValueSpec;
1006
b5f55e9f 1007/* Functions specific to mutable map values */
33a17831
PP
1008template <>
1009struct CommonMapValueSpec<bt_value> final
1010{
1011 static bt_value *entryByKey(bt_value * const libValPtr, const char * const key) noexcept
1012 {
1013 return bt_value_map_borrow_entry_value(libValPtr, key);
1014 }
1015
1016 static void forEach(bt_value * const libValPtr,
1017 const CommonMapValueForEachUserFunc<Value>& func)
1018 {
1019 const auto status = bt_value_map_foreach_entry(
1020 libValPtr,
1021 mapValueForEachLibFunc<Value, bt_value, bt_value_map_foreach_entry_func_status,
1022 BT_VALUE_MAP_FOREACH_ENTRY_FUNC_STATUS_OK,
1023 BT_VALUE_MAP_FOREACH_ENTRY_FUNC_STATUS_ERROR>,
1024 const_cast<void *>(reinterpret_cast<const void *>(&func)));
1025
1026 switch (status) {
1027 case BT_VALUE_MAP_FOREACH_ENTRY_STATUS_OK:
1028 return;
1029 case BT_VALUE_MAP_FOREACH_ENTRY_STATUS_USER_ERROR:
1030 case BT_VALUE_MAP_FOREACH_ENTRY_STATUS_ERROR:
1031 throw LibError {};
1032 default:
1033 bt_common_abort();
1034 }
1035 }
1036};
1037
b5f55e9f 1038/* Functions specific to constant map values */
33a17831
PP
1039template <>
1040struct CommonMapValueSpec<const bt_value> final
1041{
1042 static const bt_value *entryByKey(const bt_value * const libValPtr,
1043 const char * const key) noexcept
1044 {
1045 return bt_value_map_borrow_entry_value_const(libValPtr, key);
1046 }
1047
1048 static void forEach(const bt_value * const libValPtr,
1049 const CommonMapValueForEachUserFunc<ConstValue>& func)
1050 {
1051 const auto status = bt_value_map_foreach_entry_const(
1052 libValPtr,
1053 mapValueForEachLibFunc<ConstValue, const bt_value,
1054 bt_value_map_foreach_entry_const_func_status,
1055 BT_VALUE_MAP_FOREACH_ENTRY_CONST_FUNC_STATUS_OK,
1056 BT_VALUE_MAP_FOREACH_ENTRY_CONST_FUNC_STATUS_ERROR>,
1057 const_cast<void *>(reinterpret_cast<const void *>(&func)));
1058
1059 switch (status) {
1060 case BT_VALUE_MAP_FOREACH_ENTRY_CONST_STATUS_OK:
1061 return;
1062 case BT_VALUE_MAP_FOREACH_ENTRY_CONST_STATUS_USER_ERROR:
1063 case BT_VALUE_MAP_FOREACH_ENTRY_CONST_STATUS_ERROR:
1064 throw LibError {};
1065 default:
1066 bt_common_abort();
1067 }
1068 }
1069};
1070
b5f55e9f 1071} /* namespace internal */
33a17831
PP
1072
1073template <typename LibObjT>
1074class CommonMapValue final : public CommonValue<LibObjT>
1075{
1076private:
1077 using typename CommonValue<LibObjT>::_LibObjPtr;
1078 using typename CommonValue<LibObjT>::_ThisCommonValue;
1079
1080public:
1081 using Shared = internal::SharedValue<CommonMapValue<LibObjT>, LibObjT>;
1082
1083 explicit CommonMapValue(const _LibObjPtr libObjPtr) noexcept : _ThisCommonValue {libObjPtr}
1084 {
1085 BT_ASSERT_DBG(this->isMap());
1086 }
1087
1088 static Shared create()
1089 {
1090 const auto libObjPtr = bt_value_map_create();
1091
1092 internal::validateCreatedObjPtr(libObjPtr);
c9c0b6e2 1093 return CommonMapValue::Shared::createWithoutRef(libObjPtr);
33a17831
PP
1094 }
1095
1096 template <typename OtherLibObjT>
1097 CommonMapValue(const CommonMapValue<OtherLibObjT>& val) noexcept : _ThisCommonValue {val}
1098 {
1099 }
1100
1101 template <typename OtherLibObjT>
1102 CommonMapValue<LibObjT>& operator=(const CommonMapValue<OtherLibObjT>& val) noexcept
1103 {
1104 _ThisCommonValue::operator=(val);
1105 return *this;
1106 }
1107
1108 std::uint64_t size() const noexcept
1109 {
341a67c4 1110 return bt_value_map_get_size(this->libObjPtr());
33a17831
PP
1111 }
1112
1113 bool isEmpty() const noexcept
1114 {
1115 return this->size() == 0;
1116 }
1117
1118 nonstd::optional<ConstValue> operator[](const char * const key) const noexcept
1119 {
1120 const auto libObjPtr =
341a67c4 1121 internal::CommonMapValueSpec<const bt_value>::entryByKey(this->libObjPtr(), key);
33a17831
PP
1122
1123 if (!libObjPtr) {
1124 return nonstd::nullopt;
1125 }
1126
1127 return ConstValue {libObjPtr};
1128 }
1129
1130 nonstd::optional<ConstValue> operator[](const std::string& key) const noexcept
1131 {
1132 return (*this)[key.data()];
1133 }
1134
1135 nonstd::optional<CommonValue<LibObjT>> operator[](const char * const key) noexcept
1136 {
1137 const auto libObjPtr =
341a67c4 1138 internal::CommonMapValueSpec<LibObjT>::entryByKey(this->libObjPtr(), key);
33a17831
PP
1139
1140 if (!libObjPtr) {
1141 return nonstd::nullopt;
1142 }
1143
1144 return CommonValue<LibObjT> {libObjPtr};
1145 }
1146
1147 nonstd::optional<CommonValue<LibObjT>> operator[](const std::string& key) noexcept
1148 {
1149 return (*this)[key.data()];
1150 }
1151
1152 bool hasEntry(const char * const key) const noexcept
1153 {
341a67c4 1154 return static_cast<bool>(bt_value_map_has_entry(this->libObjPtr(), key));
33a17831
PP
1155 }
1156
1157 bool hasEntry(const std::string& key) const noexcept
1158 {
1159 return this->hasEntry(key.data());
1160 }
1161
1162 void insert(const char * const key, const Value& val)
1163 {
1164 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
1165
341a67c4 1166 const auto status = bt_value_map_insert_entry(this->libObjPtr(), key, val.libObjPtr());
33a17831
PP
1167
1168 this->_handleInsertLibStatus(status);
1169 }
1170
1171 void insert(const std::string& key, const Value& val)
1172 {
1173 this->insert(key.data(), val);
1174 }
1175
1176 void insert(const char * const key, const bool rawVal)
1177 {
1178 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
1179
1180 const auto status =
341a67c4 1181 bt_value_map_insert_bool_entry(this->libObjPtr(), key, static_cast<bt_bool>(rawVal));
33a17831
PP
1182
1183 this->_handleInsertLibStatus(status);
1184 }
1185
1186 void insert(const std::string& key, const bool rawVal)
1187 {
1188 this->insert(key.data(), rawVal);
1189 }
1190
1191 void insert(const char * const key, const std::uint64_t rawVal)
1192 {
1193 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
1194
1195 const auto status =
341a67c4 1196 bt_value_map_insert_unsigned_integer_entry(this->libObjPtr(), key, rawVal);
33a17831
PP
1197
1198 this->_handleInsertLibStatus(status);
1199 }
1200
1201 void insert(const std::string& key, const std::uint64_t rawVal)
1202 {
1203 this->insert(key.data(), rawVal);
1204 }
1205
1206 void insert(const char * const key, const std::int64_t rawVal)
1207 {
1208 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
1209
1210 const auto status =
341a67c4 1211 bt_value_map_insert_signed_integer_entry(this->libObjPtr(), key, rawVal);
33a17831
PP
1212
1213 this->_handleInsertLibStatus(status);
1214 }
1215
1216 void insert(const std::string& key, const std::int64_t rawVal)
1217 {
1218 this->insert(key.data(), rawVal);
1219 }
1220
1221 void insert(const char * const key, const double rawVal)
1222 {
1223 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
1224
341a67c4 1225 const auto status = bt_value_map_insert_real_entry(this->libObjPtr(), key, rawVal);
33a17831
PP
1226
1227 this->_handleInsertLibStatus(status);
1228 }
1229
1230 void insert(const std::string& key, const double rawVal)
1231 {
1232 this->insert(key.data(), rawVal);
1233 }
1234
1235 void insert(const char * const key, const char * const rawVal)
1236 {
1237 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
1238
341a67c4 1239 const auto status = bt_value_map_insert_string_entry(this->libObjPtr(), key, rawVal);
33a17831
PP
1240
1241 this->_handleInsertLibStatus(status);
1242 }
1243
1244 void insert(const char * const key, const std::string& rawVal)
1245 {
1246 this->insert(key, rawVal.data());
1247 }
1248
1249 void insert(const std::string& key, const char * const rawVal)
1250 {
1251 this->insert(key.data(), rawVal);
1252 }
1253
1254 void insert(const std::string& key, const std::string& rawVal)
1255 {
1256 this->insert(key.data(), rawVal.data());
1257 }
1258
1259 CommonArrayValue<bt_value> insertEmptyArray(const char *key);
1260 CommonArrayValue<bt_value> insertEmptyArray(const std::string& key);
1261 CommonMapValue<bt_value> insertEmptyMap(const char *key);
1262 CommonMapValue<bt_value> insertEmptyMap(const std::string& key);
1263
1264 void forEach(const internal::CommonMapValueForEachUserFunc<ConstValue>& func) const
1265 {
341a67c4 1266 internal::CommonMapValueSpec<const bt_value>::forEach(this->libObjPtr(), func);
33a17831
PP
1267 }
1268
1269 void forEach(const internal::CommonMapValueForEachUserFunc<CommonValue<LibObjT>>& func)
1270 {
341a67c4 1271 internal::CommonMapValueSpec<LibObjT>::forEach(this->libObjPtr(), func);
33a17831
PP
1272 }
1273
1274 Shared shared() const noexcept
1275 {
c9c0b6e2 1276 return Shared::createWithRef(*this);
33a17831
PP
1277 }
1278
1279private:
1280 void _handleInsertLibStatus(const bt_value_map_insert_entry_status status) const
1281 {
1282 if (status == BT_VALUE_MAP_INSERT_ENTRY_STATUS_MEMORY_ERROR) {
1283 throw LibMemoryError {};
1284 }
1285 }
1286};
1287
1288using MapValue = CommonMapValue<bt_value>;
1289using ConstMapValue = CommonMapValue<const bt_value>;
1290
4927bae7
PP
1291namespace internal {
1292
1293struct MapValueTypeDescr
1294{
1295 using Const = ConstMapValue;
1296 using NonConst = MapValue;
1297};
1298
1299template <>
1300struct TypeDescr<MapValue> : public MapValueTypeDescr
1301{
1302};
1303
1304template <>
1305struct TypeDescr<ConstMapValue> : public MapValueTypeDescr
1306{
1307};
1308
1309} /* namespace internal */
1310
33a17831
PP
1311template <typename LibObjT>
1312CommonNullValue<LibObjT> CommonValue<LibObjT>::asNull() const noexcept
1313{
1314 BT_ASSERT_DBG(this->isNull());
341a67c4 1315 return CommonNullValue<LibObjT> {this->libObjPtr()};
33a17831
PP
1316}
1317
1318template <typename LibObjT>
1319CommonBoolValue<LibObjT> CommonValue<LibObjT>::asBool() const noexcept
1320{
1321 BT_ASSERT_DBG(this->isBool());
341a67c4 1322 return CommonBoolValue<LibObjT> {this->libObjPtr()};
33a17831
PP
1323}
1324
1325template <typename LibObjT>
1326CommonSignedIntegerValue<LibObjT> CommonValue<LibObjT>::asSignedInteger() const noexcept
1327{
1328 BT_ASSERT_DBG(this->isSignedInteger());
341a67c4 1329 return CommonSignedIntegerValue<LibObjT> {this->libObjPtr()};
33a17831
PP
1330}
1331
1332template <typename LibObjT>
1333CommonUnsignedIntegerValue<LibObjT> CommonValue<LibObjT>::asUnsignedInteger() const noexcept
1334{
1335 BT_ASSERT_DBG(this->isUnsignedInteger());
341a67c4 1336 return CommonUnsignedIntegerValue<LibObjT> {this->libObjPtr()};
33a17831
PP
1337}
1338
1339template <typename LibObjT>
1340CommonRealValue<LibObjT> CommonValue<LibObjT>::asReal() const noexcept
1341{
1342 BT_ASSERT_DBG(this->isReal());
341a67c4 1343 return CommonRealValue<LibObjT> {this->libObjPtr()};
33a17831
PP
1344}
1345
1346template <typename LibObjT>
1347CommonStringValue<LibObjT> CommonValue<LibObjT>::asString() const noexcept
1348{
1349 BT_ASSERT_DBG(this->isString());
341a67c4 1350 return CommonStringValue<LibObjT> {this->libObjPtr()};
33a17831
PP
1351}
1352
1353template <typename LibObjT>
1354CommonArrayValue<LibObjT> CommonValue<LibObjT>::asArray() const noexcept
1355{
1356 BT_ASSERT_DBG(this->isArray());
341a67c4 1357 return CommonArrayValue<LibObjT> {this->libObjPtr()};
33a17831
PP
1358}
1359
1360template <typename LibObjT>
1361CommonMapValue<LibObjT> CommonValue<LibObjT>::asMap() const noexcept
1362{
1363 BT_ASSERT_DBG(this->isMap());
341a67c4 1364 return CommonMapValue<LibObjT> {this->libObjPtr()};
33a17831
PP
1365}
1366
1367template <typename LibObjT>
1368ArrayValue CommonArrayValue<LibObjT>::appendEmptyArray()
1369{
1370 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
1371
1372 bt_value *libElemPtr;
341a67c4 1373 const auto status = bt_value_array_append_empty_array_element(this->libObjPtr(), &libElemPtr);
33a17831
PP
1374
1375 this->_handleAppendLibStatus(status);
1376 return ArrayValue {libElemPtr};
1377}
1378
1379template <typename LibObjT>
1380MapValue CommonArrayValue<LibObjT>::appendEmptyMap()
1381{
1382 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
1383
1384 bt_value *libElemPtr;
341a67c4 1385 const auto status = bt_value_array_append_empty_map_element(this->libObjPtr(), &libElemPtr);
33a17831
PP
1386
1387 this->_handleAppendLibStatus(status);
1388 return MapValue {libElemPtr};
1389}
1390
1391template <typename LibObjT>
1392ArrayValue CommonMapValue<LibObjT>::insertEmptyArray(const char * const key)
1393{
1394 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
1395
1396 bt_value *libEntryPtr;
341a67c4 1397 const auto status = bt_value_map_insert_empty_array_entry(this->libObjPtr(), key, &libEntryPtr);
33a17831
PP
1398
1399 this->_handleInsertLibStatus(status);
1400 return ArrayValue {libEntryPtr};
1401}
1402
1403template <typename LibObjT>
1404ArrayValue CommonMapValue<LibObjT>::insertEmptyArray(const std::string& key)
1405{
1406 return this->insertEmptyArray(key.data());
1407}
1408
1409template <typename LibObjT>
1410MapValue CommonMapValue<LibObjT>::insertEmptyMap(const char * const key)
1411{
1412 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
1413
1414 bt_value *libEntryPtr;
341a67c4 1415 const auto status = bt_value_map_insert_empty_map_entry(this->libObjPtr(), key, &libEntryPtr);
33a17831
PP
1416
1417 this->_handleInsertLibStatus(status);
1418 return MapValue {libEntryPtr};
1419}
1420
1421template <typename LibObjT>
1422MapValue CommonMapValue<LibObjT>::insertEmptyMap(const std::string& key)
1423{
1424 return this->insertEmptyMap(key.data());
1425}
1426
1427inline BoolValue::Shared createValue(const bool rawVal)
1428{
1429 return BoolValue::create(rawVal);
1430}
1431
1432inline UnsignedIntegerValue::Shared createValue(const std::uint64_t rawVal)
1433{
1434 return UnsignedIntegerValue::create(rawVal);
1435}
1436
1437inline SignedIntegerValue::Shared createValue(const std::int64_t rawVal)
1438{
1439 return SignedIntegerValue::create(rawVal);
1440}
1441
1442inline RealValue::Shared createValue(const double rawVal)
1443{
1444 return RealValue::create(rawVal);
1445}
1446
1447inline StringValue::Shared createValue(const char * const rawVal)
1448{
1449 return StringValue::create(rawVal);
1450}
1451
1452inline StringValue::Shared createValue(const std::string& rawVal)
1453{
1454 return StringValue::create(rawVal);
1455}
1456
b5f55e9f 1457} /* namespace bt2 */
33a17831 1458
b5f55e9f 1459#endif /* BABELTRACE_CPP_COMMON_BT2_VALUE_HPP */
This page took 0.138026 seconds and 4 git commands to generate.