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