]> git.sesse.net Git - casparcg/blobdiff - common/memory/memcpy.h
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
[casparcg] / common / memory / memcpy.h
index a793b60e6f5a66389dd2eba028c6ae975a13dc48..68323039a5a52fbeeb5ed823df0a211ec162be7e 100644 (file)
@@ -29,7 +29,6 @@ namespace internal {
 \r
 static void* fast_memcpy(void* dest, const void* source, size_t count)\r
 {\r
-       assert(count % 128 == 0);\r
        assert(dest != nullptr);\r
        assert(source != nullptr);\r
 \r
@@ -72,14 +71,21 @@ static void* fast_memcpy(void* dest, const void* source, size_t count)
 \r
 }\r
 \r
-static void* fast_memcpy(void* dest, const void* source, size_t num)\r
+static void* fast_memcpy(void* dest, const void* source, size_t count)\r
 {   \r
+       if(count < 2048)\r
+               return memcpy(dest, source, count);\r
+\r
+       size_t rest = count % 128;\r
+       count -= rest;\r
+\r
        tbb::affinity_partitioner ap;\r
-       tbb::parallel_for(tbb::blocked_range<size_t>(0, num/128), [&](const tbb::blocked_range<size_t>& r)\r
+       tbb::parallel_for(tbb::blocked_range<size_t>(0, count/128), [&](const tbb::blocked_range<size_t>& r)\r
        {       \r
                internal::fast_memcpy(reinterpret_cast<char*>(dest) + r.begin()*128, reinterpret_cast<const char*>(source) + r.begin()*128, r.size()*128);   \r
-       }, ap);   \r
-       return dest;\r
+       }, ap);\r
+\r
+       return memcpy(reinterpret_cast<char*>(dest)+count,  reinterpret_cast<const char*>(source)+count, rest);\r
 }\r
 \r
 \r