1 module tagion.betterC.utils.platform; 2 3 public { 4 5 extern (C) void _d_array_slice_copy(void* dst, size_t dstlen, void* src, size_t srclen, size_t elemsz) { 6 import std.compiler; 7 8 static if ((version_major == 2 && version_minor >= 100) || (vendor !is Vendor.llvm)) { 9 pragma(msg, "Warning llvm_memcpy has not been enabled for ", vendor, " version ", version_major, ".", version_minor,); 10 } 11 else { 12 import ldc.intrinsics : llvm_memcpy; 13 14 llvm_memcpy!size_t(dst, src, dstlen * elemsz, 0); 15 } 16 } 17 18 19 version (WebAssembly) { 20 pragma(msg, "WebAssembler Memory"); 21 @nogc: 22 void* calloc(size_t nmemb, size_t size); 23 void* realloc(void* ptr, size_t size); 24 void free(void* ptr); 25 // void __assert(bool flag); 26 } 27 else { 28 29 import core.stdc.stdio; 30 import core.stdc.stdlib : calloc, free, realloc; 31 } 32 } 33 34 import std.meta; 35 import std.traits; 36 37 static void _static_call_all(string tocall, string namespace, Modules...)() { 38 static foreach (module_; Modules) { 39 { 40 enum import_code = "import" ~ module_.stringof["module".length .. $] ~ ";"; 41 mixin(import_code); 42 void _static_caller(string[] members, string namespace = null)() { 43 static foreach (name; members) { 44 { 45 enum fullname = (namespace is null) ? name : namespace ~ "." ~ name; 46 47 static if ((name.length > tocall.length) && ( 48 name[0 .. tocall.length] == tocall)) { 49 enum call_code = fullname ~ "();"; 50 mixin(call_code); 51 } 52 else { 53 enum is_code = "enum isType =is(" ~ fullname ~ ");"; 54 mixin(is_code); 55 static if (isType) { 56 { 57 enum type_code = "alias Type =" ~ fullname ~ ";"; 58 mixin(type_code); 59 60 _static_caller!([__traits(allMembers, Type)], fullname); 61 } 62 } 63 } 64 } 65 } 66 } 67 68 _static_caller!([__traits(allMembers, module_)]); 69 } 70 } 71 } 72 73 alias _call_static_ctor(Modules...) = _static_call_all!("_staticCtor", "", Modules); 74 75 alias _call_static_dtor(Modules...) = _static_call_all!("_staticDtor", "", Modules); 76 77 78 import tagion.betterC.hibon.HiBON : HiBONT; 79 import tagion.betterC.utils.RBTree : RBTreeT; 80 81 alias HiBONT_RBTreeT = RBTreeT!(HiBONT.Member*).Node; 82 extern (C) HiBONT_RBTreeT _D6tagion7betterC5utils6RBTree__T7RBTreeTTPSQBqQBm5hibon5HiBON6HiBONT6MemberZQBs4NILLSQDgQDcQCxQCu__TQCqTQClZQCy4Node; 83