Commit | Line | Data |
---|---|---|
40ed8b01 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_FIELD_PATH_HPP | |
8 | #define BABELTRACE_CPP_COMMON_BT2_FIELD_PATH_HPP | |
9 | ||
10 | #include <cstdint> | |
c802cacb | 11 | |
40ed8b01 PP |
12 | #include <babeltrace2/babeltrace.h> |
13 | ||
14 | #include "common/assert.h" | |
c802cacb | 15 | |
b3a04931 | 16 | #include "common-iter.hpp" |
40ed8b01 | 17 | #include "internal/borrowed-obj.hpp" |
80175950 | 18 | #include "internal/shared-obj.hpp" |
40ed8b01 PP |
19 | |
20 | namespace bt2 { | |
21 | ||
22 | class ConstIndexFieldPathItem; | |
23 | ||
24 | enum class FieldPathItemType | |
25 | { | |
26 | INDEX = BT_FIELD_PATH_ITEM_TYPE_INDEX, | |
27 | CURRENT_ARRAY_ELEMENT = BT_FIELD_PATH_ITEM_TYPE_CURRENT_ARRAY_ELEMENT, | |
28 | CURRENT_OPTION_CONTENT = BT_FIELD_PATH_ITEM_TYPE_CURRENT_OPTION_CONTENT, | |
29 | }; | |
30 | ||
31 | class ConstFieldPathItem : public internal::BorrowedObj<const bt_field_path_item> | |
32 | { | |
33 | public: | |
34 | explicit ConstFieldPathItem(const _LibObjPtr libObjPtr) noexcept : _ThisBorrowedObj {libObjPtr} | |
35 | { | |
36 | } | |
37 | ||
38 | ConstFieldPathItem(const ConstFieldPathItem& fpItem) noexcept : _ThisBorrowedObj {fpItem} | |
39 | { | |
40 | } | |
41 | ||
42 | ConstFieldPathItem& operator=(const ConstFieldPathItem& fpItem) noexcept | |
43 | { | |
44 | _ThisBorrowedObj::operator=(fpItem); | |
45 | return *this; | |
46 | } | |
47 | ||
48 | FieldPathItemType type() const noexcept | |
49 | { | |
50 | return static_cast<FieldPathItemType>(this->_libType()); | |
51 | } | |
52 | ||
53 | bool isIndex() const noexcept | |
54 | { | |
55 | return this->_libType() == BT_FIELD_PATH_ITEM_TYPE_INDEX; | |
56 | } | |
57 | ||
58 | bool isCurrentArrayElement() const noexcept | |
59 | { | |
60 | return this->_libType() == BT_FIELD_PATH_ITEM_TYPE_CURRENT_ARRAY_ELEMENT; | |
61 | } | |
62 | ||
63 | bool isCurrentOptionContent() const noexcept | |
64 | { | |
65 | return this->_libType() == BT_FIELD_PATH_ITEM_TYPE_CURRENT_OPTION_CONTENT; | |
66 | } | |
67 | ||
68 | ConstIndexFieldPathItem asIndex() const noexcept; | |
69 | ||
70 | private: | |
71 | bt_field_path_item_type _libType() const noexcept | |
72 | { | |
341a67c4 | 73 | return bt_field_path_item_get_type(this->libObjPtr()); |
40ed8b01 PP |
74 | } |
75 | }; | |
76 | ||
77 | class ConstIndexFieldPathItem final : public ConstFieldPathItem | |
78 | { | |
79 | public: | |
80 | explicit ConstIndexFieldPathItem(const _LibObjPtr libObjPtr) noexcept : | |
81 | ConstFieldPathItem {libObjPtr} | |
82 | { | |
83 | BT_ASSERT_DBG(this->isIndex()); | |
84 | } | |
85 | ||
86 | ConstIndexFieldPathItem(const ConstIndexFieldPathItem& fpItem) noexcept : | |
87 | ConstFieldPathItem {fpItem} | |
88 | { | |
89 | } | |
90 | ||
91 | ConstIndexFieldPathItem& operator=(const ConstIndexFieldPathItem& fpItem) noexcept | |
92 | { | |
93 | ConstFieldPathItem::operator=(fpItem); | |
94 | return *this; | |
95 | } | |
96 | ||
97 | std::uint64_t index() const noexcept | |
98 | { | |
341a67c4 | 99 | return bt_field_path_item_index_get_index(this->libObjPtr()); |
40ed8b01 PP |
100 | } |
101 | }; | |
102 | ||
103 | inline ConstIndexFieldPathItem ConstFieldPathItem::asIndex() const noexcept | |
104 | { | |
105 | BT_ASSERT_DBG(this->isIndex()); | |
341a67c4 | 106 | return ConstIndexFieldPathItem {this->libObjPtr()}; |
40ed8b01 PP |
107 | } |
108 | ||
109 | namespace internal { | |
110 | ||
111 | struct FieldPathRefFuncs final | |
112 | { | |
113 | static void get(const bt_field_path * const libObjPtr) | |
114 | { | |
115 | bt_field_path_get_ref(libObjPtr); | |
116 | } | |
117 | ||
118 | static void put(const bt_field_path * const libObjPtr) | |
119 | { | |
120 | bt_field_path_put_ref(libObjPtr); | |
121 | } | |
122 | }; | |
123 | ||
b5f55e9f | 124 | } /* namespace internal */ |
40ed8b01 PP |
125 | |
126 | class ConstFieldPath final : public internal::BorrowedObj<const bt_field_path> | |
127 | { | |
128 | public: | |
129 | using Shared = | |
130 | internal::SharedObj<ConstFieldPath, const bt_field_path, internal::FieldPathRefFuncs>; | |
131 | ||
b3a04931 FD |
132 | using Iterator = CommonIterator<ConstFieldPath, ConstFieldPathItem>; |
133 | ||
40ed8b01 PP |
134 | enum class Scope |
135 | { | |
136 | PACKET_CONTEXT = BT_FIELD_PATH_SCOPE_PACKET_CONTEXT, | |
137 | EVENT_COMMON_CONTEXT = BT_FIELD_PATH_SCOPE_EVENT_COMMON_CONTEXT, | |
138 | EVENT_SPECIFIC_CONTEXT = BT_FIELD_PATH_SCOPE_EVENT_SPECIFIC_CONTEXT, | |
139 | EVENT_PAYLOAD = BT_FIELD_PATH_SCOPE_EVENT_PAYLOAD, | |
140 | }; | |
141 | ||
142 | explicit ConstFieldPath(const _LibObjPtr libObjPtr) noexcept : _ThisBorrowedObj {libObjPtr} | |
143 | { | |
144 | } | |
145 | ||
151c78ca | 146 | ConstFieldPath(const ConstFieldPath& fieldPath) noexcept : _ThisBorrowedObj {fieldPath} |
40ed8b01 PP |
147 | { |
148 | } | |
149 | ||
151c78ca | 150 | ConstFieldPath& operator=(const ConstFieldPath& fieldPath) noexcept |
40ed8b01 | 151 | { |
151c78ca | 152 | _ThisBorrowedObj::operator=(fieldPath); |
40ed8b01 PP |
153 | return *this; |
154 | } | |
155 | ||
156 | Scope rootScope() const noexcept | |
157 | { | |
341a67c4 | 158 | return static_cast<Scope>(bt_field_path_get_root_scope(this->libObjPtr())); |
40ed8b01 PP |
159 | } |
160 | ||
161 | std::uint64_t size() const noexcept | |
162 | { | |
341a67c4 | 163 | return bt_field_path_get_item_count(this->libObjPtr()); |
40ed8b01 PP |
164 | } |
165 | ||
166 | ConstFieldPathItem operator[](const std::uint64_t index) const noexcept | |
167 | { | |
168 | return ConstFieldPathItem { | |
341a67c4 | 169 | bt_field_path_borrow_item_by_index_const(this->libObjPtr(), index)}; |
40ed8b01 PP |
170 | } |
171 | ||
b3a04931 FD |
172 | Iterator begin() const noexcept |
173 | { | |
174 | return Iterator {*this, 0}; | |
175 | } | |
176 | ||
177 | Iterator end() const noexcept | |
178 | { | |
179 | return Iterator {*this, this->size()}; | |
180 | } | |
181 | ||
40ed8b01 PP |
182 | Shared shared() const noexcept |
183 | { | |
c9c0b6e2 | 184 | return Shared::createWithRef(*this); |
40ed8b01 PP |
185 | } |
186 | }; | |
187 | ||
b5f55e9f | 188 | } /* namespace bt2 */ |
40ed8b01 | 189 | |
b5f55e9f | 190 | #endif /* BABELTRACE_CPP_COMMON_BT2_FIELD_PATH_HPP */ |