Skip to content

Commit e4e89e6

Browse files
author
accelerated
committed
Allow metadata object to be non-owning
1 parent 46c396f commit e4e89e6

File tree

3 files changed

+68
-3
lines changed

3 files changed

+68
-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

+29-2
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,26 @@ uint16_t BrokerMetadata::get_port() const {
110110

111111
// Metadata
112112

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) {
115133

116134
}
117135

@@ -156,4 +174,13 @@ vector<TopicMetadata> Metadata::get_topics_prefixed(const string& prefix) const
156174
return output;
157175
}
158176

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+
159186
} // cppkafka

0 commit comments

Comments
 (0)