4
* コードが汚いのは気にしない。コンパイラは信じるな。mmx/sseなんてシラネ、128bitってなに?
6
* License: Public Domain
11
void memcpy(int T)(const(void)* to, const(void)* from){
12
static if(T==0)return;
15
*cast(byte*)to=*cast(byte*)from;
16
static if(T > 1){to++;from++;}
19
*cast(short*)to=*cast(short*)from;
20
static if(T > 3){to+=2;from+=2;}
23
*cast(int*)to=*cast(int*)from;
24
static if(T > 7){to+=4;from+=4;}
27
}else static if(T == 8){
28
*cast(long*)to=*cast(long*)from;
30
for(int i=0;i<(T/8-1);i++){
31
*cast(long*)to=*cast(long*)from;
34
*cast(long*)to=*cast(long*)from;
39
void memzero(int T)(void* dst){
40
static if(T==0)return;
44
static if(T > 1){dst++;}
48
static if(T > 3){dst+=2;}
52
static if(T > 7){dst+=4;}
55
}else static if(T == 8){
58
for(int i=0;i<(T/8-1);i++){
67
void memset_ubyte(int T, ubyte U)(void* dst){
68
static if(T==0)return;
71
*cast(ubyte*)dst=toMultiArr_ubyte!(ubyte,U);
72
static if(T > 1){dst++;}
75
*cast(ushort*)dst=toMultiArr_ubyte!(ushort,U);
76
static if(T > 3){dst+=2;}
79
*cast(uint*)dst=toMultiArr_ubyte!(uint,U);
80
static if(T > 7){dst+=4;}
83
}else static if(T == 8){
84
*cast(ulong*)dst=toMultiArr_ubyte!(ulong,U);
86
for(int i=0;i<(T/8-1);i++){
87
*cast(ulong*)dst=toMultiArr_ubyte!(ulong,U);
90
*cast(ulong*)dst=toMultiArr_ubyte!(ulong,U);
95
void memset_ushort(int T, ushort U)(void* dst){
96
static assert(T%2 == 0);
97
static if(T==0)return;
100
*cast(ushort*)dst=toMultiArr_ushort!(ushort,U);
101
static if(T > 3){dst+=2;}
104
*cast(uint*)dst=toMultiArr_ushort!(uint,U);
105
static if(T > 7){dst+=4;}
108
}else static if(T == 8){
109
*cast(ulong*)dst=toMultiArr_ushort!(ulong,U);
111
for(int i=0;i<(T/8-1);i++){
112
*cast(ulong*)dst=toMultiArr_ushort!(ulong,U);
115
*cast(ulong*)dst=toMultiArr_ushort!(ulong,U);
120
void memset_uint(int T, uint U)(void* dst){
121
static assert(T%4 == 0);
122
static if(T==0)return;
125
*cast(uint*)dst=toMultiArr_uint!(uint,U);
126
static if(T > 7){dst+=4;}
129
}else static if(T == 8){
130
*cast(ulong*)dst=toMultiArr_uint!(ulong,U);
132
for(int i=0;i<(T/8-1);i++){
133
*cast(ulong*)dst=toMultiArr_uint!(ulong,U);
136
*cast(ulong*)dst=toMultiArr_uint!(ulong,U);
141
void memset_ulong(int T, ulong U)(void* dst){
142
static assert(T%8 == 0);
143
static if(T==0)return;
146
}else static if(T == 8){
147
*cast(ulong*)dst=toMultiArr_ulong!(ulong,U);
149
for(int i=0;i<(T/8-1);i++){
150
*cast(ulong*)dst=toMultiArr_ulong!(ulong,U);
153
*cast(ulong*)dst=toMultiArr_ulong!(ulong,U);
158
template toMultiArr_ubyte(T,ubyte U){
159
static if(is(T==ubyte)){
160
const T toMultiArr_ubyte = U;
161
}else static if(is(T==ushort)){
162
const T toMultiArr_ubyte = cast(ushort)U<<8 | U;
163
}else static if(is(T==uint)){
164
const T toMultiArr_ubyte = cast(uint)U<<24 | cast(uint)U<<16 | cast(ushort)U<<8 | U;
165
}else static if(is(T==ulong)){
166
const T toMultiArr_ubyte = cast(ulong)U<<56 | cast(ulong)U<<48 | cast(ulong)U<<40 | cast(ulong)U<<32 | cast(uint)U<<24 | cast(uint)U<<16 | cast(ushort)U<<8 | U;
170
template toMultiArr_ushort(T,ushort U){
171
static if(is(T==ushort)){
172
const T toMultiArr_ushort = U;
173
}else static if(is(T==uint)){
174
const T toMultiArr_ushort = cast(uint)U<<16 | U;
175
}else static if(is(T==ulong)){
176
const T toMultiArr_ushort = cast(ulong)U<<48 | cast(ulong)U<<32 | cast(uint)U<<16 | U;
180
template toMultiArr_uint(T,uint U){
181
static if(is(T==uint)){
182
const T toMultiArr_uint = U;
183
}else static if(is(T==ulong)){
184
const T toMultiArr_uint = cast(ulong)U<<32 | U;
188
template toMultiArr_ulong(T,ulong U){
189
static if(is(T==ulong)){
190
const T toMultiArr_ulong = U;
195
string a="abcdefghijklmnopqrstuvwxyz".dup;
196
memcpy!(15)(a.ptr,a.ptr+1);
197
assert(a == "bcdefghijklmnoppqrstuvwxyz");
199
memzero!(b.length*b[0].sizeof)(b.ptr);
204
memset_ubyte!(c.length*c[0].sizeof,100)(c.ptr);
209
memset_ushort!(d.length*d[0].sizeof,100)(d.ptr);
214
memset_uint!(e.length*e[0].sizeof,100)(e.ptr);
219
memset_ulong!(f.length*f[0].sizeof,100)(f.ptr);