mirror of
https://github.com/scylladb/scylladb.git
synced 2026-05-12 19:02:12 +00:00
types: switch collection_type_impl::deserialize from bytes_view to FragmentedView
Devirtualizes collection_type_impl::deserialize (so it can be templated) and adds a FragmentedView overload. This will allow us to deserialize collections with explicit cql_serialization_format directly from fragmented buffers.
This commit is contained in:
26
types.cc
26
types.cc
@@ -1822,6 +1822,32 @@ static void serialize(const abstract_type& t, const void* value, bytes::iterator
|
||||
return ::serialize(t, value, out, cql_serialization_format::internal());
|
||||
}
|
||||
|
||||
template <FragmentedView View>
|
||||
data_value collection_type_impl::deserialize(View v, cql_serialization_format sf) const {
|
||||
struct visitor {
|
||||
View v;
|
||||
cql_serialization_format sf;
|
||||
data_value operator()(const abstract_type&) {
|
||||
on_internal_error(tlogger, "collection_type_impl::deserialize called on a non-collection type. This should be impossible.");
|
||||
}
|
||||
data_value operator()(const list_type_impl& t) {
|
||||
return t.deserialize(v, sf);
|
||||
}
|
||||
data_value operator()(const map_type_impl& t) {
|
||||
return t.deserialize(v, sf);
|
||||
}
|
||||
data_value operator()(const set_type_impl& t) {
|
||||
return t.deserialize(v, sf);
|
||||
}
|
||||
};
|
||||
return ::visit(*this, visitor{v, sf});
|
||||
}
|
||||
// Explicit instantiation.
|
||||
// This should be repeated for every View type passed to collection_type_impl::deserialize.
|
||||
template data_value collection_type_impl::deserialize<>(ser::buffer_view<bytes_ostream::fragment_iterator>, cql_serialization_format) const;
|
||||
template data_value collection_type_impl::deserialize<>(fragmented_temporary_buffer::view, cql_serialization_format) const;
|
||||
template data_value collection_type_impl::deserialize<>(single_fragmented_view, cql_serialization_format) const;
|
||||
|
||||
template <FragmentedView View>
|
||||
data_value deserialize_aux(const tuple_type_impl& t, View v) {
|
||||
tuple_type_impl::native_type ret;
|
||||
|
||||
@@ -54,10 +54,18 @@ public:
|
||||
virtual bool is_value_compatible_with_frozen(const collection_type_impl& previous) const = 0;
|
||||
template <typename BytesViewIterator>
|
||||
static bytes pack(BytesViewIterator start, BytesViewIterator finish, int elements, cql_serialization_format sf);
|
||||
virtual data_value deserialize(bytes_view v, cql_serialization_format sf) const = 0;
|
||||
data_value deserialize_value(bytes_view v, cql_serialization_format sf) const {
|
||||
|
||||
// Explicitly instantiated in types.cc
|
||||
template <FragmentedView View> data_value deserialize(View v, cql_serialization_format sf) const;
|
||||
template <FragmentedView View> data_value deserialize_value(View v, cql_serialization_format sf) const {
|
||||
return deserialize(v, sf);
|
||||
}
|
||||
data_value deserialize(bytes_view v, cql_serialization_format sf) const {
|
||||
return deserialize(single_fragmented_view(v), sf);
|
||||
}
|
||||
data_value deserialize_value(bytes_view v, cql_serialization_format sf) const {
|
||||
return deserialize(single_fragmented_view(v), sf);
|
||||
}
|
||||
bytes_opt reserialize(cql_serialization_format from, cql_serialization_format to, bytes_view_opt v) const;
|
||||
};
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ public:
|
||||
virtual bool is_compatible_with_frozen(const collection_type_impl& previous) const override;
|
||||
virtual bool is_value_compatible_with_frozen(const collection_type_impl& previous) const override;
|
||||
using abstract_type::deserialize;
|
||||
virtual data_value deserialize(bytes_view v, cql_serialization_format sf) const override;
|
||||
data_value deserialize(bytes_view v, cql_serialization_format sf) const;
|
||||
template <FragmentedView View> data_value deserialize(View v, cql_serialization_format sf) const;
|
||||
};
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ public:
|
||||
static int32_t compare_maps(data_type keys_comparator, data_type values_comparator,
|
||||
bytes_view o1, bytes_view o2);
|
||||
using abstract_type::deserialize;
|
||||
virtual data_value deserialize(bytes_view v, cql_serialization_format sf) const override;
|
||||
data_value deserialize(bytes_view v, cql_serialization_format sf) const;
|
||||
template <FragmentedView View> data_value deserialize(View v, cql_serialization_format sf) const;
|
||||
static bytes serialize_partially_deserialized_form(const std::vector<std::pair<bytes_view, bytes_view>>& v,
|
||||
cql_serialization_format sf);
|
||||
|
||||
@@ -47,7 +47,7 @@ public:
|
||||
virtual bool is_compatible_with_frozen(const collection_type_impl& previous) const override;
|
||||
virtual bool is_value_compatible_with_frozen(const collection_type_impl& previous) const override;
|
||||
using abstract_type::deserialize;
|
||||
virtual data_value deserialize(bytes_view v, cql_serialization_format sf) const override;
|
||||
data_value deserialize(bytes_view v, cql_serialization_format sf) const;
|
||||
template <FragmentedView View> data_value deserialize(View v, cql_serialization_format sf) const;
|
||||
static bytes serialize_partially_deserialized_form(
|
||||
const std::vector<bytes_view>& v, cql_serialization_format sf);
|
||||
|
||||
Reference in New Issue
Block a user