Commit 254e30c6 authored by Dominik Charousset's avatar Dominik Charousset

Add missing insert overload

parent 7085b6c6
...@@ -18,8 +18,9 @@ ...@@ -18,8 +18,9 @@
#pragma once #pragma once
#include <memory>
#include <cstddef> #include <cstddef>
#include <cstring>
#include <memory>
#include "caf/allowed_unsafe_message_type.hpp" #include "caf/allowed_unsafe_message_type.hpp"
...@@ -142,7 +143,7 @@ public: ...@@ -142,7 +143,7 @@ public:
return buffer_.get() + size_; return buffer_.get() + size_;
} }
/// Returns an iterator to the reverse beginning. /// Returns jan iterator to the reverse beginning.
inline reverse_iterator rbegin() noexcept { inline reverse_iterator rbegin() noexcept {
return reverse_iterator{buffer_.get() + size_}; return reverse_iterator{buffer_.get() + size_};
} }
...@@ -175,6 +176,22 @@ public: ...@@ -175,6 +176,22 @@ public:
/// Insert `value` before `pos`. /// Insert `value` before `pos`.
iterator insert(iterator pos, value_type value); iterator insert(iterator pos, value_type value);
/// Insert `value` before `pos`.
template <class InputIterator>
iterator insert(iterator pos, InputIterator first, InputIterator last) {
auto n = std::distance(first, last);
if (n == 0)
return pos;
auto offset = static_cast<size_t>(std::distance(begin(), pos));
auto old_size = size_;
resize(old_size + n);
pos = begin() + offset;
if (offset != old_size) {
memmove(pos + n, pos, old_size - offset);
}
return std::copy(first, last, pos);
}
/// Append `value`. /// Append `value`.
void push_back(value_type value); void push_back(value_type value);
......
...@@ -38,6 +38,13 @@ struct fixture { ...@@ -38,6 +38,13 @@ struct fixture {
fixture() : b(1024ul), vec{'h', 'a', 'l', 'l', 'o'} { fixture() : b(1024ul), vec{'h', 'a', 'l', 'l', 'o'} {
// nop // nop
} }
std::string as_string(const receive_buffer& xs) {
std::string result;
for (auto& x : xs)
result += static_cast<char>(x);
return result;
}
}; };
} // namespace <anonymous> } // namespace <anonymous>
...@@ -131,26 +138,17 @@ CAF_TEST(push_back) { ...@@ -131,26 +138,17 @@ CAF_TEST(push_back) {
CAF_TEST(insert) { CAF_TEST(insert) {
for (auto c: vec) for (auto c: vec)
a.insert(a.end(), c); a.insert(a.end(), c);
CAF_CHECK_EQUAL(*(a.data() + 0), 'h'); CAF_CHECK_EQUAL(as_string(a), "hallo");
CAF_CHECK_EQUAL(*(a.data() + 1), 'a');
CAF_CHECK_EQUAL(*(a.data() + 2), 'l');
CAF_CHECK_EQUAL(*(a.data() + 3), 'l');
CAF_CHECK_EQUAL(*(a.data() + 4), 'o');
a.insert(a.begin(), '!'); a.insert(a.begin(), '!');
CAF_CHECK_EQUAL(*(a.data() + 0), '!'); CAF_CHECK_EQUAL(as_string(a), "!hallo");
CAF_CHECK_EQUAL(*(a.data() + 1), 'h');
CAF_CHECK_EQUAL(*(a.data() + 2), 'a');
CAF_CHECK_EQUAL(*(a.data() + 3), 'l');
CAF_CHECK_EQUAL(*(a.data() + 4), 'l');
CAF_CHECK_EQUAL(*(a.data() + 5), 'o');
a.insert(a.begin() + 4, '-'); a.insert(a.begin() + 4, '-');
CAF_CHECK_EQUAL(*(a.data() + 0), '!'); CAF_CHECK_EQUAL(as_string(a), "!hal-lo");
CAF_CHECK_EQUAL(*(a.data() + 1), 'h'); std::string foo = "foo:";
CAF_CHECK_EQUAL(*(a.data() + 2), 'a'); a.insert(a.begin() + 1, foo.begin(), foo.end());
CAF_CHECK_EQUAL(*(a.data() + 3), 'l'); CAF_CHECK_EQUAL(as_string(a), "!foo:hal-lo");
CAF_CHECK_EQUAL(*(a.data() + 4), '-'); std::string bar = ":bar";
CAF_CHECK_EQUAL(*(a.data() + 5), 'l'); a.insert(a.end(), bar.begin(), bar.end());
CAF_CHECK_EQUAL(*(a.data() + 6), 'o'); CAF_CHECK_EQUAL(as_string(a), "!foo:hal-lo:bar");
} }
CAF_TEST(shrink_to_fit) { CAF_TEST(shrink_to_fit) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment