30#if defined(__cpp_lib_format)
149 return lhs.m_index == rhs.m_index;
165 SPARROW_API std::string_view extract_string_view();
181 const char* m_current;
182 std::string_view m_key;
183 std::string_view m_value;
276 int32_t m_num_pairs = 0;
278 friend key_value_view_iterator;
290 template <
typename T>
292 && std::same_as<std::ranges::range_value_t<T>,
metadata_pair>;
322 template <input_metadata_container T>
325 const auto number_of_key_values =
static_cast<int32_t
>(metadata.size());
326 const size_t metadata_size = std::accumulate(
330 [](
size_t acc,
const auto& pair)
332 return acc + sizeof(int32_t)
335 + pair.second.size();
338 const size_t total_size =
sizeof(int32_t) + metadata_size;
339 std::string metadata_buf(total_size,
'\0');
340 char* metadata_ptr = metadata_buf.data();
341 std::memcpy(metadata_ptr, &number_of_key_values,
sizeof(int32_t));
342 metadata_ptr +=
sizeof(int32_t);
343 for (
const auto& [key, value] : metadata)
348 const auto key_size =
static_cast<int32_t
>(key.size());
349 std::memcpy(metadata_ptr, &key_size,
sizeof(int32_t));
350 metadata_ptr +=
sizeof(int32_t);
353 metadata_ptr += key.size();
355 const auto value_size =
static_cast<int32_t
>(value.size());
356 std::memcpy(metadata_ptr, &value_size,
sizeof(int32_t));
357 metadata_ptr +=
sizeof(int32_t);
360 metadata_ptr += value.size();
366#if defined(__cpp_lib_format)
370struct std::formatter<
sparrow::key_value_view>
372 constexpr auto parse(std::format_parse_context& ctx)
377 auto format(
const sparrow::key_value_view& array, std::format_context& ctx)
const
379 auto out = ctx.out();
383 for (
const auto& elem : array)
390 out = std::format_to(out,
"({}:{})", elem.first, elem.second);
401 os << std::format(
"{}", value);
std::ptrdiff_t difference_type
SPARROW_API key_value_view_iterator & operator++()
Advances the iterator to the next key-value pair.
friend bool operator==(const key_value_view_iterator &lhs, const key_value_view_iterator &rhs)
Equality comparison operator for iterators.
SPARROW_API key_value_view_iterator(const key_value_view &parent, int32_t index)
Constructs an iterator for the given view at the specified index.
SPARROW_API value_type operator*() const
Dereferences the iterator to get the current key-value pair.
std::input_iterator_tag iterator_category
Custom view for lazily extracting key-value pairs from a binary buffer.
SPARROW_API key_value_view_iterator begin() const
Gets iterator to the beginning of the metadata pairs.
SPARROW_API size_t size() const
Gets the number of key-value pairs in the metadata.
SPARROW_API key_value_view_iterator end() const
Gets iterator to the end of the metadata pairs.
SPARROW_API key_value_view_iterator cend() const
Gets const iterator to the end of the metadata pairs.
SPARROW_API key_value_view(const char *ptr)
Constructs a view over the given binary metadata buffer.
SPARROW_API key_value_view_iterator cbegin() const
Gets const iterator to the beginning of the metadata pairs.
#define SPARROW_ASSERT_TRUE(expr__)
constexpr std::ranges::copy_result< std::ranges::borrowed_iterator_t< R >, O > copy(R &&r, O result)
SPARROW_API int32_t extract_int32(const char *&ptr)
Helper function to extract a 32-bit integer from a character buffer.
std::string get_metadata_from_key_values(const T &metadata)
Converts a container of key-value pairs to binary metadata format.
std::string_view metadata_value
Type alias for metadata values.
std::string_view metadata_key
Type alias for metadata keys.
std::pair< metadata_key, metadata_value > metadata_pair
Type alias for metadata key-value pairs.
std::ostream & operator<<(std::ostream &os, const sparrow::nullval_t &)