mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 10:52:44 +00:00 
			
		
		
		
	 1682f0b760
			
		
	
	
		1682f0b760
		
	
	
	
	
		
			
			SPDX License Identifiers are a more compact / standardized way of representing file license information. See: https://spdx.dev/resources/use/#identifiers This was done with the `ambr` search and replace tool. ambr --no-parent-ignore --key-from-file --rep-from-file key.txt rep.txt *
		
			
				
	
	
		
			73 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2020, the SerenityOS developers.
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <AK/Traits.h>
 | |
| 
 | |
| namespace AK {
 | |
| 
 | |
| template<typename T>
 | |
| class TypedTransfer {
 | |
| public:
 | |
|     static void move(T* destination, T* source, size_t count)
 | |
|     {
 | |
|         if (!count)
 | |
|             return;
 | |
| 
 | |
|         if constexpr (Traits<T>::is_trivial()) {
 | |
|             __builtin_memmove(destination, source, count * sizeof(T));
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         for (size_t i = 0; i < count; ++i) {
 | |
|             if (destination <= source)
 | |
|                 new (&destination[i]) T(std::move(source[i]));
 | |
|             else
 | |
|                 new (&destination[count - i - 1]) T(std::move(source[count - i - 1]));
 | |
|         }
 | |
| 
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     static size_t copy(T* destination, const T* source, size_t count)
 | |
|     {
 | |
|         if (!count)
 | |
|             return 0;
 | |
| 
 | |
|         if constexpr (Traits<T>::is_trivial()) {
 | |
|             __builtin_memmove(destination, source, count * sizeof(T));
 | |
|             return count;
 | |
|         }
 | |
| 
 | |
|         for (size_t i = 0; i < count; ++i) {
 | |
|             if (destination <= source)
 | |
|                 new (&destination[i]) T(source[i]);
 | |
|             else
 | |
|                 new (&destination[count - i - 1]) T(source[count - i - 1]);
 | |
|         }
 | |
| 
 | |
|         return count;
 | |
|     }
 | |
| 
 | |
|     static bool compare(const T* a, const T* b, size_t count)
 | |
|     {
 | |
|         if (!count)
 | |
|             return true;
 | |
| 
 | |
|         if constexpr (Traits<T>::is_trivial())
 | |
|             return !__builtin_memcmp(a, b, count * sizeof(T));
 | |
| 
 | |
|         for (size_t i = 0; i < count; ++i) {
 | |
|             if (a[i] != b[i])
 | |
|                 return false;
 | |
|         }
 | |
| 
 | |
|         return true;
 | |
|     }
 | |
| };
 | |
| 
 | |
| }
 |