diff --git a/types.cc b/types.cc index 882e23f0d9..757a490192 100644 --- a/types.cc +++ b/types.cc @@ -14,6 +14,8 @@ #include #include #include +#include +#include template struct simple_type_traits { @@ -964,14 +966,11 @@ template collection_mutation::one do_serialize_mutation_form( std::experimental::optional tomb, - Iterator begin, Iterator end) { - auto element_size = [] (auto&& e) -> size_t { - return 8 + e.first.size() + e.second.serialize().size(); + boost::iterator_range cells) { + auto element_size = [] (size_t c, auto&& e) -> size_t { + return c + 8 + e.first.size() + e.second.serialize().size(); }; - auto size = std::accumulate( - boost::make_transform_iterator(begin, element_size), - boost::make_transform_iterator(end, element_size), - 4); + auto size = accumulate(cells, (size_t)4, element_size); size += 1; if (tomb) { size += sizeof(tomb->timestamp) + sizeof(tomb->ttl); @@ -988,9 +987,8 @@ do_serialize_mutation_form( out = std::copy_n(v.begin(), v.size(), out); }; // FIXME: overflow? - serialize_int32(out, std::distance(begin, end)); - while (begin != end) { - auto&& kv = *begin++; + serialize_int32(out, boost::distance(cells)); + for (auto&& kv : cells) { auto&& k = kv.first; auto&& v = kv.second; writeb(k); @@ -1001,12 +999,19 @@ do_serialize_mutation_form( collection_mutation::one collection_type_impl::serialize_mutation_form(const mutation& mut) { - return do_serialize_mutation_form(mut.tomb, mut.cells.begin(), mut.cells.end()); + return do_serialize_mutation_form(mut.tomb, boost::make_iterator_range(mut.cells.begin(), mut.cells.end())); } collection_mutation::one collection_type_impl::serialize_mutation_form(mutation_view mut) { - return do_serialize_mutation_form(mut.tomb, mut.cells.begin(), mut.cells.end()); + return do_serialize_mutation_form(mut.tomb, boost::make_iterator_range(mut.cells.begin(), mut.cells.end())); +} + +collection_mutation::one +collection_type_impl::serialize_mutation_form_only_live(mutation_view mut) { + return do_serialize_mutation_form(mut.tomb, mut.cells | boost::adaptors::filtered([t = mut.tomb] (auto&& e) { + return e.second.is_live(t); + })); } collection_mutation::one diff --git a/types.hh b/types.hh index 72445eb99b..1f0135b581 100644 --- a/types.hh +++ b/types.hh @@ -339,6 +339,7 @@ public: // FIXME: use iterators? collection_mutation::one serialize_mutation_form(const mutation& mut); collection_mutation::one serialize_mutation_form(mutation_view mut); + collection_mutation::one serialize_mutation_form_only_live(mutation_view mut); collection_mutation::one merge(collection_mutation::view a, collection_mutation::view b); };