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:
Michał Chojnowski
2020-11-23 16:41:59 +01:00
parent d731b34d95
commit c08419e28d
5 changed files with 39 additions and 5 deletions

View File

@@ -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;

View File

@@ -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;
};

View File

@@ -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;
};

View File

@@ -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);

View File

@@ -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);