| 126 | |
| 127 | template <bool Atomic> |
| 128 | bool Ring_Buffer_Ex<Atomic>::putbytes_(const void *data, size_t len) |
| 129 | { |
| 130 | if (len == 0) |
| 131 | return true; |
| 132 | |
| 133 | if (size_free() < len) |
| 134 | return false; |
| 135 | |
| 136 | const size_t wp = atomic_load_maybe(wp_, std::memory_order_relaxed); |
| 137 | const size_t cap = cap_; |
| 138 | const uint8_t *src = (const uint8_t *)data; |
| 139 | uint8_t *dst = rbdata_.get(); |
| 140 | |
| 141 | const size_t taillen = std::min(len, cap - wp); |
| 142 | std::copy_n(src, taillen, &dst[wp]); |
| 143 | std::copy_n(src + taillen, len - taillen, dst); |
| 144 | |
| 145 | atomic_store_maybe(wp_, (wp + len < cap) ? (wp + len) : (wp + len - cap), std::memory_order_release); |
| 146 | return true; |
| 147 | } |
| 148 | |
| 149 | template class Ring_Buffer_Ex<true>; |
| 150 | template class Ring_Buffer_Ex<false>; |
no test coverage detected