diff options
Diffstat (limited to 'core/os/copymem.h')
-rw-r--r-- | core/os/copymem.h | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/core/os/copymem.h b/core/os/copymem.h new file mode 100644 index 0000000000..09e8c6903e --- /dev/null +++ b/core/os/copymem.h @@ -0,0 +1,119 @@ +/*************************************************************************/ +/* 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 + |