| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*  copymem.h                                                            */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*                       This file is part of:                           */ | 
					
						
							|  |  |  | /*                           GODOT ENGINE                                */ | 
					
						
							|  |  |  | /*                    http://www.godotengine.org                         */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2016-01-01 11:50:53 -02:00
										 |  |  | /* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* 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
 | 
					
						
							|  |  |  | 
 |