| 667 | unsigned Legacy::n_decode = 0; |
| 668 | |
| 669 | bufferlist Legacy::encode_n(unsigned n, const vector<unsigned>& segments) { |
| 670 | vector<Legacy> v; |
| 671 | for (unsigned i = 0; i < n; i++) { |
| 672 | v.push_back(Legacy()); |
| 673 | } |
| 674 | bufferlist bl(n * sizeof(uint8_t)); |
| 675 | using ceph::encode; |
| 676 | encode(v, bl); |
| 677 | bufferlist segmented; |
| 678 | auto p = bl.begin(); |
| 679 | |
| 680 | auto sum = std::accumulate(segments.begin(), segments.end(), 0u); |
| 681 | ceph_assert(sum != 0u); |
| 682 | for (auto i : segments) { |
| 683 | buffer::ptr seg; |
| 684 | p.copy_deep(bl.length() * i / sum, seg); |
| 685 | segmented.push_back(seg); |
| 686 | } |
| 687 | p.copy_all(segmented); |
| 688 | return segmented; |
| 689 | } |
| 690 | |
| 691 | TEST(denc, no_copy_if_segmented_and_lengthy) |
| 692 | { |