@@ -26,7 +26,7 @@ private extern(C) @system nothrow @nogc pure void* memcpy(scope void* s1, scope
2626struct 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