Skip to content

Commit f543810

Browse files
acceleratedmfontanini
authored andcommitted
Allow metadata object to be non-owning (#73)
1 parent 841e632 commit f543810

File tree

3 files changed

+73
-3
lines changed

3 files changed

+73
-3
lines changed

Diff for: include/cppkafka/metadata.h

+32-1
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,24 @@ class CPPKAFKA_API BrokerMetadata {
140140
*/
141141
class CPPKAFKA_API Metadata {
142142
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);
144161

145162
/**
146163
* Gets the brokers' metadata
@@ -165,8 +182,22 @@ class CPPKAFKA_API Metadata {
165182
* \param prefix The prefix to be looked up
166183
*/
167184
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;
168195
private:
169196
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);
170201

171202
HandlePtr handle_;
172203
};

Diff for: include/cppkafka/topic.h

+7
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,13 @@ class CPPKAFKA_API Topic {
8282
* \param partition The partition to check
8383
*/
8484
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+
}
8592

8693
/**
8794
* Returns the rdkakfa handle

Diff for: src/metadata.cpp

+34-2
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
*
2828
*/
2929

30+
#include <assert.h>
3031
#include "metadata.h"
3132
#include "error.h"
3233

@@ -110,12 +111,31 @@ uint16_t BrokerMetadata::get_port() const {
110111

111112
// Metadata
112113

113-
Metadata::Metadata(const rd_kafka_metadata_t* ptr)
114-
: handle_(ptr, &rd_kafka_metadata_destroy) {
114+
void dummy_metadata_destroyer(const rd_kafka_metadata_t*) {
115+
116+
}
117+
118+
Metadata Metadata::make_non_owning(const rd_kafka_metadata_t* handle) {
119+
return Metadata(handle, NonOwningTag{});
120+
}
121+
122+
Metadata::Metadata()
123+
: handle_(nullptr, nullptr) {
124+
125+
}
126+
127+
Metadata::Metadata(const rd_kafka_metadata_t* handle)
128+
: handle_(handle, &rd_kafka_metadata_destroy) {
129+
130+
}
131+
132+
Metadata::Metadata(const rd_kafka_metadata_t* handle, NonOwningTag)
133+
: handle_(handle, &dummy_metadata_destroyer) {
115134

116135
}
117136

118137
vector<BrokerMetadata> Metadata::get_brokers() const {
138+
assert(handle_);
119139
vector<BrokerMetadata> output;
120140
for (int i = 0; i < handle_->broker_cnt; ++i) {
121141
const rd_kafka_metadata_broker_t& broker = handle_->brokers[i];
@@ -125,6 +145,7 @@ vector<BrokerMetadata> Metadata::get_brokers() const {
125145
}
126146

127147
vector<TopicMetadata> Metadata::get_topics() const {
148+
assert(handle_);
128149
vector<TopicMetadata> output;
129150
for (int i = 0; i < handle_->topic_cnt; ++i) {
130151
const rd_kafka_metadata_topic_t& topic = handle_->topics[i];
@@ -134,6 +155,7 @@ vector<TopicMetadata> Metadata::get_topics() const {
134155
}
135156

136157
vector<TopicMetadata> Metadata::get_topics(const unordered_set<string>& topics) const {
158+
assert(handle_);
137159
vector<TopicMetadata> output;
138160
for (int i = 0; i < handle_->topic_cnt; ++i) {
139161
const rd_kafka_metadata_topic_t& topic = handle_->topics[i];
@@ -145,6 +167,7 @@ vector<TopicMetadata> Metadata::get_topics(const unordered_set<string>& topics)
145167
}
146168

147169
vector<TopicMetadata> Metadata::get_topics_prefixed(const string& prefix) const {
170+
assert(handle_);
148171
vector<TopicMetadata> output;
149172
for (int i = 0; i < handle_->topic_cnt; ++i) {
150173
const rd_kafka_metadata_topic_t& topic = handle_->topics[i];
@@ -156,4 +179,13 @@ vector<TopicMetadata> Metadata::get_topics_prefixed(const string& prefix) const
156179
return output;
157180
}
158181

182+
183+
Metadata::operator bool() const {
184+
return handle_ != nullptr;
185+
}
186+
187+
const rd_kafka_metadata_t* Metadata::get_handle() const {
188+
return handle_.get();
189+
}
190+
159191
} // cppkafka

0 commit comments

Comments
 (0)