1 module rlib; 2 3 import core.stdc.stdint: uintptr_t; 4 @nogc: 5 nothrow: 6 @trusted: 7 8 private void* _memset_impl(void *dest, int ch, size_t count) 9 { 10 immutable c_char = cast(immutable ubyte)ch; 11 auto b_dest = cast(ubyte*)dest; 12 for (size_t i=0; i<count; ++i) { 13 b_dest[i] = c_char; 14 } 15 return dest; 16 } 17 18 private void* _memmove_impl(void* dest, const void* src, size_t count) 19 { 20 immutable dest_n = cast(uintptr_t)dest; 21 immutable src_n = cast(uintptr_t)src; 22 auto p_dst = cast(ubyte*)dest, p_src = cast(ubyte*)src; 23 if (src_n < dest_n) { 24 while (count > 1) { 25 --count; 26 p_dst[count] = p_src[count]; 27 } 28 } else { 29 for (size_t i=0; i<count; ++i) { 30 p_dst[i] = p_src[i]; 31 } 32 } 33 return dest; 34 } 35 36 private void* _memcpy_impl(void* dest, const void* src, size_t count) 37 { 38 auto p_dst = cast(ubyte*)dest; 39 auto p_src = cast(ubyte*)src; 40 for (size_t i=0; i<count; ++i) { 41 p_dst[i] = p_src[i]; 42 } 43 return dest; 44 } 45 46 private int _memcmp_impl(const void* p1, const void* p2, size_t count) 47 { 48 immutable b1 = cast(immutable ubyte*)p1, b2 = cast(immutable ubyte*)p2; 49 for (size_t i=0; i<count; ++i) 50 if (b1[i] != b2[i]) 51 return (b1[i] - b2[i]); 52 return 0; 53 } 54 55 extern(C): 56 57 version(LDC) { 58 import ldc.attributes; 59 @weak void* memset(void *dest, int ch, size_t count) { 60 return _memset_impl(dest, ch, count); 61 } 62 @weak void* memmove(void* dest, const void* src, size_t count) { 63 return _memmove_impl(dest, src, count); 64 } 65 @weak void* memcpy(void* dest, const void* src, size_t count) { 66 return _memcpy_impl(dest, src, count); 67 } 68 @weak int memcmp(const void* p1, const void* p2, size_t count) { 69 return _memcmp_impl(p1, p2, count); 70 } 71 } else { 72 void* memset(void *dest, int ch, size_t count) { 73 return _memset_impl(dest, ch, count); 74 } 75 void* memmove(void* dest, const void* src, size_t count) { 76 return _memmove_impl(dest, src, count); 77 } 78 void* memcpy(void* dest, const void* src, size_t count) { 79 return _memcpy_impl(dest, src, count); 80 } 81 int memcmp(const void* p1, const void* p2, size_t count) { 82 return _memcmp_impl(p1, p2, count); 83 } 84 } 85