2 #define _MINISKETCH_H_ 1
13 #ifndef MINISKETCH_API
15 # ifdef MINISKETCH_BUILD
16 # define MINISKETCH_API __declspec(dllexport)
18 # define MINISKETCH_API
20 # elif defined(__GNUC__) && (__GNUC__ >= 4) && defined(MINISKETCH_BUILD)
21 # define MINISKETCH_API __attribute__ ((visibility ("default")))
23 # define MINISKETCH_API
28 # if __cplusplus >= 201103L
32 # if __cplusplus >= 201703L
34 # endif // __cplusplus >= 201703L
35 # endif // __cplusplus >= 201103L
193 #if __cplusplus >= 201103L
205 std::unique_ptr<minisketch, Deleter> m_minisketch;
225 static size_t ComputeCapacity(uint32_t bits,
size_t max_elements, uint32_t fpbits) noexcept {
return minisketch_compute_capacity(bits, max_elements, fpbits); }
228 static size_t ComputeMaxElements(uint32_t bits,
size_t capacity, uint32_t fpbits) noexcept {
return minisketch_compute_max_elements(bits, capacity, fpbits); }
231 Minisketch(
const Minisketch& sketch) noexcept
233 if (sketch.m_minisketch) {
234 m_minisketch = std::unique_ptr<minisketch, Deleter>(
minisketch_clone(sketch.m_minisketch.get()));
239 Minisketch& operator=(
const Minisketch& sketch) noexcept
241 if (sketch.m_minisketch) {
242 m_minisketch = std::unique_ptr<minisketch, Deleter>(
minisketch_clone(sketch.m_minisketch.get()));
248 explicit operator bool() const noexcept {
return bool{m_minisketch}; }
251 Minisketch() noexcept = default;
254 Minisketch(Minisketch&&) noexcept = default;
257 Minisketch& operator=(Minisketch&&) noexcept = default;
265 Minisketch(uint32_t bits, uint32_t implementation,
size_t capacity) noexcept
267 m_minisketch = std::unique_ptr<minisketch, Deleter>(
minisketch_create(bits, implementation, capacity));
272 static Minisketch CreateFP(uint32_t bits, uint32_t implementation,
size_t max_elements, uint32_t fpbits) noexcept
274 return Minisketch(bits, implementation, ComputeCapacity(bits, max_elements, fpbits));
278 uint32_t GetBits() const noexcept {
return minisketch_bits(m_minisketch.get()); }
287 Minisketch& SetSeed(uint64_t seed) noexcept
295 Minisketch& Add(uint64_t element) noexcept
303 Minisketch&
Merge(
const Minisketch& sketch) noexcept
311 bool Decode(std::vector<uint64_t>& result)
const
313 ssize_t ret =
minisketch_decode(m_minisketch.get(), result.size(), result.data());
314 if (ret == -1)
return false;
323 std::vector<unsigned char>
Serialize()
const
325 std::vector<unsigned char> result(GetSerializedSize());
333 Minisketch& Deserialize(
335 typename std::enable_if<
336 std::is_convertible<
typename std::remove_pointer<decltype(obj.data())>::type (*)[],
const unsigned char (*)[]>::value &&
337 std::is_convertible<decltype(obj.size()), std::size_t>::value,
339 >::type =
nullptr) noexcept
341 assert(GetSerializedSize() == obj.size());
346 #if __cplusplus >= 201703L
348 std::optional<std::vector<uint64_t>>
Decode(
size_t max_elements)
const
350 std::vector<uint64_t> result(max_elements);
351 ssize_t ret =
minisketch_decode(m_minisketch.get(), max_elements, result.data());
352 if (ret == -1)
return {};
358 std::optional<std::vector<uint64_t>> DecodeFP(uint32_t fpbits)
const
360 return Decode(ComputeMaxElements(GetBits(), GetCapacity(), fpbits));
362 #endif // __cplusplus >= 201703L
364 #endif // __cplusplus >= 201103L
365 #endif // __cplusplus
367 #endif // _MINISKETCH_H_