Skip to content

Commit b65f1ed

Browse files
committed
fix appender.d
1 parent f71919b commit b65f1ed

File tree

1 file changed

+15
-41
lines changed

1 file changed

+15
-41
lines changed

source/mir/appender.d

+15-41
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ private extern(C) @system nothrow @nogc pure void* memcpy(scope void* s1, scope
2626
struct ScopedBuffer(T, size_t bytes = 4096)
2727
if (bytes)
2828
{
29-
import std.traits: Unqual, isMutable, isIterable, hasElaborateAssign, isAssignable, isArray;
29+
import std.traits: Unqual, isMutable, isStaticArray, isIterable, hasElaborateAssign, isAssignable, isArray;
3030
import mir.primitives: hasLength;
3131
import mir.conv: emplaceRef;
3232

@@ -88,7 +88,6 @@ struct ScopedBuffer(T, size_t bytes = 4096)
8888
sizediff_t t = _currentLength - n;
8989
if (t < 0)
9090
assert(0, "ScopedBffer.popBackN: n is too large.");
91-
import mir.exception;
9291
data[t .. _currentLength]._mir_destroy;
9392
_currentLength = t;
9493
}
@@ -97,15 +96,15 @@ struct ScopedBuffer(T, size_t bytes = 4096)
9796
void put(T e) @safe scope
9897
{
9998
auto cl = _currentLength;
100-
prepare(1);
99+
auto d = prepare(1);
101100
static if (isMutable!T)
102101
{
103102
import core.lifetime: move;
104-
emplaceRef!(Unqual!T)(data[cl], e.move);
103+
emplaceRef!(Unqual!T)(d[cl], e.move);
105104
}
106105
else
107106
{
108-
emplaceRef!(Unqual!T)(data[cl], e);
107+
emplaceRef!(Unqual!T)(d[cl], e);
109108
}
110109
}
111110

@@ -118,57 +117,32 @@ struct ScopedBuffer(T, size_t bytes = 4096)
118117
emplaceRef!(Unqual!T)(d[cl], e);
119118
}
120119

121-
static if (!hasElaborateAssign!T && isAssignable!(T, const T))
122-
///
123-
void put(scope const(T)[] e) scope
124-
{
125-
auto cl = _currentLength;
126-
auto d = prepare(e.length);
127-
auto len = e.length * T.sizeof;
128-
if (!__ctfe)
129-
(()@trusted=>memcpy(cast(void*)(d.ptr + cl), e.ptr, len))();
130-
else
131-
(()@trusted { (d.ptr + cl)[0 .. len] = e[0 .. len]; })();
132-
}
133-
134-
static if (!hasElaborateAssign!T && !isAssignable!(T, const T))
120+
static if (!hasElaborateAssign!T)
135121
///
136-
void put()(scope T[] e) scope
122+
void put(scope R[] e) scope
137123
{
138124
auto cl = _currentLength;
139125
auto d = prepare(e.length);
140-
auto len = e.length * T.sizeof;
141126
if (!__ctfe)
142-
(()@trusted=>memcpy(cast(void*)(d.ptr + cl), e.ptr, len))();
127+
(()@trusted=>memcpy(cast(void*)(d.ptr + cl), e.ptr, e.length * T.sizeof))();
143128
else
144-
(()@trusted {
145-
foreach(i; 0 .. cl)
146-
d[i].emplaceRef!T(e[i]);
147-
})();
129+
static if (isMutable!T)
130+
(()@trusted=> d[cl .. cl + e.length] = e)();
131+
else
132+
assert(0);
148133
}
149134

150135
///
151136
void put(Iterable)(Iterable range) scope
152-
if (isIterable!Iterable && (!isArray!Iterable || hasElaborateAssign!T))
137+
if (isIterable!Iterable && !isStaticArray!Iterable && (!isArray!Iterable || hasElaborateAssign!T))
153138
{
154139
static if (hasLength!Iterable)
155140
{
156141
auto cl = _currentLength;
157142
auto d = prepare(range.length);
158-
static if (is(Iterable : R[]) && !hasElaborateAssign!T)
159-
{
160-
auto len = range.length * T.sizeof;
161-
if (!__ctfe)
162-
(()@trusted=>memcpy(d.ptr + cl, e.ptr, len))();
163-
else
164-
(()@trusted { (d.ptr + cl)[0 .. len] = e[0 .. len]; })();
165-
}
166-
else
167-
{
168-
foreach(ref e; range)
169-
emplaceRef!(Unqual!T)(d[cl++], e);
170-
assert(_currentLength == cl);
171-
}
143+
foreach(ref e; range)
144+
emplaceRef!(Unqual!T)(d[cl++], e);
145+
assert(_currentLength == cl);
172146
}
173147
else
174148
{

0 commit comments

Comments
 (0)