public void ExtractIndexes(IGroup group) { var buffers = group.Buffers.Array; var lines = group.Lines.Array; int bufferLength = _usingBufferLength, buffersOffset = group.Buffers.Offset, linesOffset = group.Lines.Offset, n = linesOffset + group.Lines.Count, i = 0; while (linesOffset < n) { int d = i / bufferLength + buffersOffset, b = i % bufferLength, q = (i + 1) / bufferLength + buffersOffset, p = (i + 1) % bufferLength; var line = lines[linesOffset++] = new LineIndexes { Start = i, LettersCount = buffers[d][b], DigitsCount = buffers[q][p], SortingOffset = Consts.GroupIdLettersCount }; buffers[d][b] = Consts.EndLineByte1; i += line.DigitsCount; i += line.LettersCount; i += 3; } }
protected void CreateLinesIndex() { if (m_IndexBuffer != null) { SharpDX.Utilities.Dispose <SharpDX.Direct3D11.Buffer>(ref m_IndexBuffer); } m_IndexBuffer = SharpDX.Direct3D11.Buffer.Create(ApplicationDX11.Instance.Device, BindFlags.IndexBuffer, LineIndexes.ToArray()); }
public void Test( [ValueSource(nameof(TestCases))] TestCase testCase, [ValueSource(nameof(BufferSizes))] BufferSize bufferSize) { var configMock = new Mock <IConfig>(); int usingBufferSize = LargeBufferSize; if (bufferSize < BufferSize.Large) { usingBufferSize = sizeof(ulong); if (bufferSize != BufferSize.Min) { ++usingBufferSize; } } configMock .SetupGet(o => o.UsingBufferLength) .Returns(usingBufferSize); var physicalBufferLength = usingBufferSize + Consts.BufferReadingEnsurance; configMock .SetupGet(o => o.PhysicalBufferLength) .Returns(physicalBufferLength); ISortingSegmentsSupplier sortingSegmentsSupplier = new SortingSegmentsSupplier( configMock.Object); var lineIndexesExtractorMock = new Mock <ILinesIndexesExtractor>(); IGroupSorter groupSorter = new GroupSorter( sortingSegmentsSupplier, lineIndexesExtractorMock.Object); var groupBytesCount = testCase.GroupBytes.Length; var groupBuffersCount = (int)Math.Ceiling((double) groupBytesCount / usingBufferSize); var buffersCount = BuffersOffset + groupBuffersCount + OverBuffersCount; byte[][] buffers = Enumerable .Range(0, buffersCount) .Select(_ => new byte[physicalBufferLength]) .ToArray(); for (int i = 0; i < groupBuffersCount - 1; i++) { Array.Copy(testCase.GroupBytes, i * usingBufferSize, buffers[BuffersOffset + i], 0, usingBufferSize); } Array.Copy(testCase.GroupBytes, (groupBuffersCount - 1) * usingBufferSize, buffers[BuffersOffset + groupBuffersCount - 1], 0, groupBytesCount % usingBufferSize); var lines = new LineIndexes[LinesStorageLength]; var segments = new ulong[LinesStorageLength]; var groupMock = new Mock <IGroup>(); groupMock .SetupGet(o => o.BytesCount) .Returns(groupBytesCount); groupMock .SetupGet(o => o.Buffers) .Returns(new ArraySegment <byte[]>( buffers, BuffersOffset, groupBuffersCount)); groupMock .SetupGet(o => o.Lines) .Returns(new ArraySegment <LineIndexes>( lines, LinesRangeOffset, testCase.InputLines.Length)); groupMock .SetupGet(o => o.SortingSegments) .Returns(new ArraySegment <ulong>( segments, LinesRangeOffset, testCase.InputLines.Length)); lineIndexesExtractorMock .Setup(o => o.ExtractIndexes(groupMock.Object)) .Callback(() => Array.Copy(testCase.InputLines, 0, lines, LinesRangeOffset, testCase.InputLines.Length)); groupSorter.Sort(groupMock.Object); var resultLines = lines .Skip(LinesRangeOffset) .Take(testCase.InputLines.Length) .Select(o => o.Start) .ToArray(); // Console.WriteLine(string.Join(" ", testCase.ExpectedSortedLines)); // Console.WriteLine(string.Join(" ", resultLines)); CollectionAssert.AreEqual( testCase.ExpectedSortedLines, resultLines); }
internal Item(LineIndexes indexes, byte[] bytes) { Indexes = indexes; Bytes = bytes; }