duckstation

duckstation, but archived from the revision just before upstream changed it to a proprietary software project, this version is the libre one
git clone https://git.neptards.moe/u3shit/duckstation.git
Log | Files | Refs | README | LICENSE

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