File tree 3 files changed +68
-3
lines changed
3 files changed +68
-3
lines changed Original file line number Diff line number Diff line change @@ -140,7 +140,24 @@ class CPPKAFKA_API BrokerMetadata {
140
140
*/
141
141
class CPPKAFKA_API Metadata {
142
142
public:
143
- Metadata (const rd_kafka_metadata_t * ptr);
143
+ /* *
144
+ * \brief Creates a Metadata object that doesn't take ownership of the handle
145
+ *
146
+ * \param handle The handle to be used
147
+ */
148
+ static Metadata make_non_owning (const rd_kafka_metadata_t * handle);
149
+
150
+ /* *
151
+ * \brief Constructs an empty metadata object
152
+ *
153
+ * \remark Using any methods except Metadata::get_handle on an empty metadata is undefined behavior
154
+ */
155
+ Metadata ();
156
+
157
+ /* *
158
+ * Constructor
159
+ */
160
+ Metadata (const rd_kafka_metadata_t * handle);
144
161
145
162
/* *
146
163
* Gets the brokers' metadata
@@ -165,8 +182,22 @@ class CPPKAFKA_API Metadata {
165
182
* \param prefix The prefix to be looked up
166
183
*/
167
184
std::vector<TopicMetadata> get_topics_prefixed (const std::string& prefix) const ;
185
+
186
+ /* *
187
+ * Indicates whether this metadata is valid (not null)
188
+ */
189
+ explicit operator bool () const ;
190
+
191
+ /* *
192
+ * Returns the rdkakfa handle
193
+ */
194
+ const rd_kafka_metadata_t * get_handle () const ;
168
195
private:
169
196
using HandlePtr = std::unique_ptr<const rd_kafka_metadata_t , decltype(&rd_kafka_metadata_destroy)>;
197
+
198
+ struct NonOwningTag { };
199
+
200
+ Metadata (const rd_kafka_metadata_t * handle, NonOwningTag);
170
201
171
202
HandlePtr handle_;
172
203
};
Original file line number Diff line number Diff line change @@ -82,6 +82,13 @@ class CPPKAFKA_API Topic {
82
82
* \param partition The partition to check
83
83
*/
84
84
bool is_partition_available (int partition) const ;
85
+
86
+ /* *
87
+ * Indicates whether this topic is valid (not null)
88
+ */
89
+ explicit operator bool () const {
90
+ return handle_ != nullptr ;
91
+ }
85
92
86
93
/* *
87
94
* Returns the rdkakfa handle
Original file line number Diff line number Diff line change @@ -110,8 +110,26 @@ uint16_t BrokerMetadata::get_port() const {
110
110
111
111
// Metadata
112
112
113
- Metadata::Metadata (const rd_kafka_metadata_t * ptr)
114
- : handle_(ptr, &rd_kafka_metadata_destroy) {
113
+ void dummy_metadata_destroyer (const rd_kafka_metadata_t *) {
114
+
115
+ }
116
+
117
+ Metadata Metadata::make_non_owning (const rd_kafka_metadata_t * handle) {
118
+ return Metadata (handle, NonOwningTag{});
119
+ }
120
+
121
+ Metadata::Metadata ()
122
+ : handle_(nullptr , nullptr ) {
123
+
124
+ }
125
+
126
+ Metadata::Metadata (const rd_kafka_metadata_t * handle)
127
+ : handle_(handle, &rd_kafka_metadata_destroy) {
128
+
129
+ }
130
+
131
+ Metadata::Metadata (const rd_kafka_metadata_t * handle, NonOwningTag)
132
+ : handle_(handle, &dummy_metadata_destroyer) {
115
133
116
134
}
117
135
@@ -156,4 +174,13 @@ vector<TopicMetadata> Metadata::get_topics_prefixed(const string& prefix) const
156
174
return output;
157
175
}
158
176
177
+
178
+ Metadata::operator bool () const {
179
+ return handle_ != nullptr ;
180
+ }
181
+
182
+ const rd_kafka_metadata_t * Metadata::get_handle () const {
183
+ return handle_.get ();
184
+ }
185
+
159
186
} // cppkafka
You can’t perform that action at this time.
0 commit comments