mem_copy.h 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #pragma once
  2. #include "typetraits.h"
  3. #include <util/system/types.h>
  4. #include <cstring>
  5. template <class T>
  6. using TIfPOD = std::enable_if_t<TTypeTraits<T>::IsPod, T*>;
  7. template <class T>
  8. using TIfNotPOD = std::enable_if_t<!TTypeTraits<T>::IsPod, T*>;
  9. template <class T>
  10. static inline TIfPOD<T> MemCopy(T* to, const T* from, size_t n) noexcept {
  11. if (n) {
  12. memcpy(to, from, n * sizeof(T));
  13. }
  14. return to;
  15. }
  16. template <class T>
  17. static inline TIfNotPOD<T> MemCopy(T* to, const T* from, size_t n) {
  18. for (size_t i = 0; i < n; ++i) {
  19. to[i] = from[i];
  20. }
  21. return to;
  22. }
  23. template <class T>
  24. static inline TIfPOD<T> MemMove(T* to, const T* from, size_t n) noexcept {
  25. if (n) {
  26. memmove(to, from, n * sizeof(T));
  27. }
  28. return to;
  29. }
  30. template <class T>
  31. static inline TIfNotPOD<T> MemMove(T* to, const T* from, size_t n) {
  32. if (to <= from || to >= from + n) {
  33. return MemCopy(to, from, n);
  34. }
  35. // copy backwards
  36. while (n) {
  37. to[n - 1] = from[n - 1];
  38. --n;
  39. }
  40. return to;
  41. }