//
// Created by yudw on 2017/8/6.
//
#pragma once
#include <iostream>
#define debug_
namespace yudw
{
// 注意当内存有重叠时,src部分会被覆盖
void* memcpy(
void *dst
, const void* src
, size_t size)
{
if(dst ==
nullptr || src ==
nullptr)
{
return nullptr;
}
char *pdst =
static_cast<
char*>(dst)
;
const char *psrc =
static_cast<
const char*>(src)
;
// 1.内存无重叠
// [dst + 0, dst + size -1] , [src + 0, src + size -1], [dst + 0, dst + size -1]
if(pdst + size <= src || pdst >= psrc + size)
{
#ifdef debug_
std::cout<<
"no cover:";
#endif
while(size--)
{
*pdst++ = *psrc++
;
}
}
else // 2.内存有重叠
{
if(pdst < psrc)
// 2.1 dst 在左,有部分重叠,从前往后直接拷贝就行
{
#ifdef debug_
std::cout<<
"left cover:";
#endif
while(size--)
{
*pdst++ = *psrc++
;
}
}
else // 2.2 dst 在右侧, 有部分重叠,从后向前拷贝,src重复部分会被dst覆盖
{
#ifdef debug_
std::cout<<
"right cover:";
#endif
while(size--)
{
*(pdst + size) = *(psrc + size)
;
}
}
}
return dst
;
}
}