12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- #pragma once
- #include "typetraits.h"
- #include <util/system/types.h>
- #include <cstring>
- template <class T>
- using TIfPOD = std::enable_if_t<TTypeTraits<T>::IsPod, T*>;
- template <class T>
- using TIfNotPOD = std::enable_if_t<!TTypeTraits<T>::IsPod, T*>;
- template <class T>
- static inline TIfPOD<T> MemCopy(T* to, const T* from, size_t n) noexcept {
- if (n) {
- memcpy(to, from, n * sizeof(T));
- }
- return to;
- }
- template <class T>
- static inline TIfNotPOD<T> MemCopy(T* to, const T* from, size_t n) {
- for (size_t i = 0; i < n; ++i) {
- to[i] = from[i];
- }
- return to;
- }
- template <class T>
- static inline TIfPOD<T> MemMove(T* to, const T* from, size_t n) noexcept {
- if (n) {
- memmove(to, from, n * sizeof(T));
- }
- return to;
- }
- template <class T>
- static inline TIfNotPOD<T> MemMove(T* to, const T* from, size_t n) {
- if (to <= from || to >= from + n) {
- return MemCopy(to, from, n);
- }
- // copy backwards
- while (n) {
- to[n - 1] = from[n - 1];
- --n;
- }
- return to;
- }
|