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