diff --git a/std/experimental/ndslice/slice.d b/std/experimental/ndslice/slice.d index ce9ddb95a82..e74426e5128 100644 --- a/std/experimental/ndslice/slice.d +++ b/std/experimental/ndslice/slice.d @@ -2315,8 +2315,8 @@ private struct PtrShell(Range) auto ref opIndex(sizediff_t index) in { - assert(_shift + index >= 0); import std.range.primitives: hasLength; + assert(_shift + index >= 0); static if (hasLength!Range) assert(_shift + index <= _range.length); } @@ -2330,6 +2330,7 @@ private struct PtrShell(Range) auto ref opIndexAssign(T)(T value, sizediff_t index) in { + import std.range.primitives: hasLength; assert(_shift + index >= 0); static if (hasLength!Range) assert(_shift + index <= _range.length); @@ -2342,6 +2343,7 @@ private struct PtrShell(Range) auto ref opIndexOpAssign(string op, T)(T value, sizediff_t index) in { + import std.range.primitives: hasLength; assert(_shift + index >= 0); static if (hasLength!Range) assert(_shift + index <= _range.length); @@ -2350,6 +2352,19 @@ private struct PtrShell(Range) { mixin (`return _range[_shift + index] ` ~ op ~ `= value;`); } + + auto ref opUnary(string op, T)(T value, sizediff_t index) + in + { + import std.range.primitives: hasLength; + assert(_shift + index >= 0); + static if (hasLength!Range) + assert(_shift + index <= _range.length); + } + body + { + mixin (`return ` ~ op ~ `_range[_shift + index];`); + } } static if (canSave!Range) @@ -2367,9 +2382,7 @@ private auto ptrShell(Range)(Range range, sizediff_t shift = 0) return PtrShell!Range(shift, range); } -version(none) // TODO: Remove before merge -// @safe pure nothrow ? -unittest +@safe pure nothrow @nogc unittest { import std.internal.test.dummyrange; foreach (RB; AliasSeq!(ReturnBy.Reference, ReturnBy.Value)) @@ -2379,14 +2392,30 @@ unittest auto ptr = range.ptrShell; assert(ptr[0] == range[0]); auto save0 = range[0]; - ptr[0] += 10; - ++ptr[0]; + ptr[0] += 11; assert(ptr[0] == save0 + 11); (ptr + 5)[2] = 333; assert(range[7] == 333); } } +pure nothrow @nogc unittest +{ + import std.internal.test.dummyrange; + foreach (RB; AliasSeq!(ReturnBy.Reference, ReturnBy.Value)) + { + DummyRange!(RB, Length.Yes, RangeType.Random) range; + assert(range.length >= 10); + auto slice = range.sliced(10); + assert(slice[0] == range[0]); + auto save0 = range[0]; + slice[0] += 11; + assert(slice[0] == save0 + 11); + slice[5 .. $][2] = 333; + assert(range[7] == 333); + } +} + private enum isSlicePointer(T) = isPointer!T || is(T : PtrShell!R, R); private struct LikePtr {} @@ -2521,13 +2550,13 @@ private void _indexAssign(bool lastStrideEquals1, string op, size_t N, size_t RN { static if (N == 1) { - static if(lastStrideEquals1 && (isPointer!Range || isDynamicArray!Range) && (isPointer!RRange || isDynamicArray!RRange)) + static if (lastStrideEquals1 && (isPointer!Range || isDynamicArray!Range) && (isPointer!RRange || isDynamicArray!RRange)) { - static if(isPointer!Range) + static if (isPointer!Range) auto l = slice._ptr; else auto l = slice._ptr._range[slice._ptr._shift .. slice._ptr._shift + slice._lengths[0]]; - static if(isPointer!RRange) + static if (isPointer!RRange) auto r = value._ptr; else auto r = value._ptr._range[value._ptr._shift .. value._ptr._shift + value._lengths[0]]; @@ -2573,9 +2602,9 @@ private void _indexAssign(bool lastStrideEquals1, string op, size_t N, Range, T) assert(slice.length == value.length, __FUNCTION__ ~ ": argument must have the same length."); static if (N == 1) { - static if(lastStrideEquals1 && (isPointer!Range || isDynamicArray!Range)) + static if (lastStrideEquals1 && (isPointer!Range || isDynamicArray!Range)) { - static if(isPointer!Range) + static if (isPointer!Range) auto l = slice._ptr; else auto l = slice._ptr._range[slice._ptr._shift .. slice._ptr._shift + slice._lengths[0]]; @@ -2622,9 +2651,9 @@ private void _indexAssign(bool lastStrideEquals1, string op, size_t N, Range, T) { static if (N == 1) { - static if(lastStrideEquals1 && (isPointer!Range || isDynamicArray!Range)) + static if (lastStrideEquals1 && (isPointer!Range || isDynamicArray!Range)) { - static if(isPointer!Range) + static if (isPointer!Range) auto l = slice._ptr; else auto l = slice._ptr._range[slice._ptr._shift .. $]; diff --git a/win32.mak b/win32.mak index d795773123c..06d53e7eb86 100644 --- a/win32.mak +++ b/win32.mak @@ -389,6 +389,10 @@ DOCS= $(DOC)\object.html \ $(DOC)\std_experimental_logger_multilogger.html \ $(DOC)\std_experimental_logger_nulllogger.html \ $(DOC)\std_experimental_logger.html \ + $(DOC)\std_experimental_ndslice_iteration.html \ + $(DOC)\std_experimental_ndslice_selection.html \ + $(DOC)\std_experimental_ndslice_slice.html \ + $(DOC)\std_experimental_ndslice.html \ $(DOC)\std_windows_charset.html \ $(DOC)\std_windows_registry.html \ $(DOC)\std_c_fenv.html \ @@ -835,6 +839,18 @@ $(DOC)\std_experimental_logger_nulllogger.html : $(STDDOC) std\experimental\logg $(DOC)\std_experimental_logger.html : $(STDDOC) std\experimental\logger\package.d $(DMD) -c -o- $(DDOCFLAGS) -Df$(DOC)\std_experimental_logger.html $(STDDOC) std\experimental\logger\package.d +$(DOC)\std_experimental_ndslice_iteration.html : $(STDDOC) std\experimental\ndslice\iteration.d + $(DMD) -c -o- $(DDOCFLAGS) -Df$(DOC)\std_experimental_ndslice_iteration.html $(STDDOC) std\experimental\ndslice\iteration.d + +$(DOC)\std_experimental_ndslice_selection.html : $(STDDOC) std\experimental\ndslice\selection.d + $(DMD) -c -o- $(DDOCFLAGS) -Df$(DOC)\std_experimental_ndslice_selection.html $(STDDOC) std\experimental\ndslice\selection.d + +$(DOC)\std_experimental_ndslice_slice.html : $(STDDOC) std\experimental\ndslice\slice.d + $(DMD) -c -o- $(DDOCFLAGS) -Df$(DOC)\std_experimental_ndslice_slice.html $(STDDOC) std\experimental\ndslice\slice.d + +$(DOC)\std_experimental_ndslice.html : $(STDDOC) std\experimental\ndslice\package.d + $(DMD) -c -o- $(DDOCFLAGS) -Df$(DOC)\std_experimental_ndslice.html $(STDDOC) std\experimental\ndslice\package.d + $(DOC)\std_digest_crc.html : $(STDDOC) std\digest\crc.d $(DMD) -c -o- $(DDOCFLAGS) -Df$(DOC)\std_digest_crc.html $(STDDOC) std\digest\crc.d diff --git a/win64.mak b/win64.mak index b02bdbc8a1f..2bdbeb77f2c 100644 --- a/win64.mak +++ b/win64.mak @@ -412,6 +412,10 @@ DOCS= $(DOC)\object.html \ $(DOC)\std_experimental_logger_multilogger.html \ $(DOC)\std_experimental_logger_nulllogger.html \ $(DOC)\std_experimental_logger.html \ + $(DOC)\std_experimental_ndslice_iteration.html \ + $(DOC)\std_experimental_ndslice_selection.html \ + $(DOC)\std_experimental_ndslice_slice.html \ + $(DOC)\std_experimental_ndslice.html \ $(DOC)\std_windows_charset.html \ $(DOC)\std_windows_registry.html \ $(DOC)\std_c_fenv.html \ @@ -813,6 +817,18 @@ $(DOC)\std_experimental_logger_nulllogger.html : $(STDDOC) std\experimental\logg $(DOC)\std_experimental_logger.html : $(STDDOC) std\experimental\logger\package.d $(DMD) -c -o- $(DDOCFLAGS) -Df$(DOC)\std_experimental_logger.html $(STDDOC) std\experimental\logger\package.d +$(DOC)\std_experimental_ndslice_iteration.html : $(STDDOC) std\experimental\ndslice\iteration.d + $(DMD) -c -o- $(DDOCFLAGS) -Df$(DOC)\std_experimental_ndslice_iteration.html $(STDDOC) std\experimental\ndslice\iteration.d + +$(DOC)\std_experimental_ndslice_selection.html : $(STDDOC) std\experimental\ndslice\selection.d + $(DMD) -c -o- $(DDOCFLAGS) -Df$(DOC)\std_experimental_ndslice_selection.html $(STDDOC) std\experimental\ndslice\selection.d + +$(DOC)\std_experimental_ndslice_slice.html : $(STDDOC) std\experimental\ndslice\slice.d + $(DMD) -c -o- $(DDOCFLAGS) -Df$(DOC)\std_experimental_ndslice_slice.html $(STDDOC) std\experimental\ndslice\slice.d + +$(DOC)\std_experimental_ndslice.html : $(STDDOC) std\experimental\ndslice\package.d + $(DMD) -c -o- $(DDOCFLAGS) -Df$(DOC)\std_experimental_ndslice.html $(STDDOC) std\experimental\ndslice\package.d + $(DOC)\std_digest_crc.html : $(STDDOC) std\digest\crc.d $(DMD) -c -o- $(DDOCFLAGS) -Df$(DOC)\std_digest_crc.html $(STDDOC) std\digest\crc.d