Path: blob/master/dep/rapidyaml/src/c4/memory_util.cpp
4260 views
#include "c4/memory_util.hpp"1#include "c4/error.hpp"23namespace c4 {456/** Fills 'dest' with the first 'pattern_size' bytes at 'pattern', 'num_times'. */7void mem_repeat(void* dest, void const* pattern, size_t pattern_size, size_t num_times)8{9if(C4_UNLIKELY(num_times == 0))10return;11C4_ASSERT( ! mem_overlaps(dest, pattern, num_times*pattern_size, pattern_size));12char *begin = static_cast<char*>(dest);13char *end = begin + num_times * pattern_size;14// copy the pattern once15::memcpy(begin, pattern, pattern_size);16// now copy from dest to itself, doubling up every time17size_t n = pattern_size;18while(begin + 2*n < end)19{20::memcpy(begin + n, begin, n);21n <<= 1; // double n22}23// copy the missing part24if(begin + n < end)25{26::memcpy(begin + n, begin, static_cast<size_t>(end - (begin + n)));27}28}293031} // namespace c4323334