mirror of
				https://github.com/godotengine/godot.git
				synced 2025-10-31 05:31:01 +00:00 
			
		
		
		
	
		
			
	
	
		
			120 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			120 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*************************************************************************/ | ||
|  | /*  copymem.h                                                            */ | ||
|  | /*************************************************************************/ | ||
|  | /*                       This file is part of:                           */ | ||
|  | /*                           GODOT ENGINE                                */ | ||
|  | /*                    http://www.godotengine.org                         */ | ||
|  | /*************************************************************************/ | ||
|  | /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur.                 */ | ||
|  | /*                                                                       */ | ||
|  | /* Permission is hereby granted, free of charge, to any person obtaining */ | ||
|  | /* a copy of this software and associated documentation files (the       */ | ||
|  | /* "Software"), to deal in the Software without restriction, including   */ | ||
|  | /* without limitation the rights to use, copy, modify, merge, publish,   */ | ||
|  | /* distribute, sublicense, and/or sell copies of the Software, and to    */ | ||
|  | /* permit persons to whom the Software is furnished to do so, subject to */ | ||
|  | /* the following conditions:                                             */ | ||
|  | /*                                                                       */ | ||
|  | /* The above copyright notice and this permission notice shall be        */ | ||
|  | /* included in all copies or substantial portions of the Software.       */ | ||
|  | /*                                                                       */ | ||
|  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */ | ||
|  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */ | ||
|  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ | ||
|  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */ | ||
|  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */ | ||
|  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */ | ||
|  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */ | ||
|  | /*************************************************************************/ | ||
|  | #ifndef COPYMEM_H
 | ||
|  | #define COPYMEM_H
 | ||
|  | 
 | ||
|  | #include "typedefs.h"
 | ||
|  | 
 | ||
|  | ///@TODO use optimized routines for this, depending on platform. these are just the standard ones
 | ||
|  | 
 | ||
|  | #define copymem(m_to,m_from,m_count) \
 | ||
|  | 	do {			 	\ | ||
|  | 		unsigned char * _from=(unsigned char*)m_from;	\ | ||
|  | 		unsigned char * _to=(unsigned char*)m_to;	\ | ||
|  | 		int _count=m_count;		\ | ||
|  | 		for (int _i=0;_i<_count;_i++)	\ | ||
|  | 			_to[_i]=_from[_i];	\ | ||
|  | 	} while (0); | ||
|  | 	/*
 | ||
|  | 					case 0:	*_dto++ = *_dfrom++;	\ | ||
|  | 					case 7:	*_dto++ = *_dfrom++;	\ | ||
|  | 							case 6:	*_dto++ = *_dfrom++;	\ | ||
|  | 									case 5:	*_dto++ = *_dfrom++;	\ | ||
|  | 										case 4:	*_dto++ = *_dfrom++;	\ | ||
|  | 										case 3:	*_dto++ = *_dfrom++;	\ | ||
|  | 										case 2:	*_dto++ = *_dfrom++;	\ | ||
|  | 										case 1:	*_dto++ = *_dfrom++;	\ | ||
|  | 	*/ | ||
|  | #define movemem_duff(m_to, m_from, m_count) \
 | ||
|  | 	do { \ | ||
|  | 		if (m_to<m_from) {	\ | ||
|  | 			unsigned char* _dto = (unsigned char*)m_to;	\ | ||
|  | 			unsigned char* _dfrom = (unsigned char*)m_from;	\ | ||
|  | 			int n = (m_count + 7) / 8;	\ | ||
|  | 			switch (m_count % 8) {	\ | ||
|  | 				do {					\ | ||
|  | 					case 0:	*_dto++ = *_dfrom++;	\ | ||
|  | 					case 7:	*_dto++ = *_dfrom++;	\ | ||
|  | 					case 6:	*_dto++ = *_dfrom++;	\ | ||
|  | 					case 5:	*_dto++ = *_dfrom++;	\ | ||
|  | 					case 4:	*_dto++ = *_dfrom++;	\ | ||
|  | 					case 3:	*_dto++ = *_dfrom++;	\ | ||
|  | 					case 2:	*_dto++ = *_dfrom++;	\ | ||
|  | 					case 1:	*_dto++ = *_dfrom++;	\ | ||
|  | 				} while (--n > 0);			\ | ||
|  | 			};						\ | ||
|  | 		} else if (m_to>m_from) {					\ | ||
|  | 			unsigned char* _dto = &((unsigned char*)m_to)[m_count-1];	\ | ||
|  | 			unsigned char* _dfrom = &((unsigned char*)m_from)[m_count-1];	\ | ||
|  | 			int n = (m_count + 7) / 8;	\ | ||
|  | 			switch (m_count % 8) {	\ | ||
|  | 				do {	\ | ||
|  | 					case 0:	*_dto-- = *_dfrom--;	\ | ||
|  | 					case 7:	*_dto-- = *_dfrom--;	\ | ||
|  | 					case 6:	*_dto-- = *_dfrom--;	\ | ||
|  | 					case 5:	*_dto-- = *_dfrom--;	\ | ||
|  | 					case 4:	*_dto-- = *_dfrom--;	\ | ||
|  | 					case 3:	*_dto-- = *_dfrom--;	\ | ||
|  | 					case 2:	*_dto-- = *_dfrom--;	\ | ||
|  | 					case 1:	*_dto-- = *_dfrom--;	\ | ||
|  | 				} while (--n > 0);			\ | ||
|  | 			};						\ | ||
|  | 		}                           				\ | ||
|  | 	} while(0)                           				\ | ||
|  | 
 | ||
|  | #define movemem_conventional(m_to,m_from,m_count) \
 | ||
|  | 	do {			 	\ | ||
|  | 		if (m_to<m_from) {					\ | ||
|  | 			unsigned char * _from=(unsigned char*)m_from;	\ | ||
|  | 			unsigned char * _to=(unsigned char*)m_to;	\ | ||
|  | 			int _count=m_count;				\ | ||
|  | 			for (int _i=0;_i<_count;_i++)			\ | ||
|  | 				_to[_i]=_from[_i];			\ | ||
|  | 									\ | ||
|  | 		} else if (m_to>m_from) {				\ | ||
|  | 			unsigned char * _from=(unsigned char*)m_from;	\ | ||
|  | 			unsigned char * _to=(unsigned char*)m_to;	\ | ||
|  | 			int _count=m_count;				\ | ||
|  | 			while (_count--) 				\ | ||
|  | 				_to[_count]=_from[_count];		\ | ||
|  | 									\ | ||
|  | 									\ | ||
|  | 		}							\ | ||
|  | 	} while (0);							\ | ||
|  | 
 | ||
|  | void movemem_system(void*,void*,int); | ||
|  | 
 | ||
|  | #define movemem movemem_system
 | ||
|  | 
 | ||
|  | 
 | ||
|  | void zeromem(void* p_mem,size_t p_bytes); | ||
|  | 
 | ||
|  | #endif
 | ||
|  | 
 |