memory_util.cpp (912B)
1 #include "c4/memory_util.hpp" 2 #include "c4/error.hpp" 3 4 namespace c4 { 5 6 7 /** Fills 'dest' with the first 'pattern_size' bytes at 'pattern', 'num_times'. */ 8 void mem_repeat(void* dest, void const* pattern, size_t pattern_size, size_t num_times) 9 { 10 if(C4_UNLIKELY(num_times == 0)) 11 return; 12 C4_ASSERT( ! mem_overlaps(dest, pattern, num_times*pattern_size, pattern_size)); 13 char *begin = static_cast<char*>(dest); 14 char *end = begin + num_times * pattern_size; 15 // copy the pattern once 16 ::memcpy(begin, pattern, pattern_size); 17 // now copy from dest to itself, doubling up every time 18 size_t n = pattern_size; 19 while(begin + 2*n < end) 20 { 21 ::memcpy(begin + n, begin, n); 22 n <<= 1; // double n 23 } 24 // copy the missing part 25 if(begin + n < end) 26 { 27 ::memcpy(begin + n, begin, static_cast<size_t>(end - (begin + n))); 28 } 29 } 30 31 32 } // namespace c4