|
1 | 1 | using System;
|
2 | 2 | using System.Collections.Generic;
|
| 3 | +using System.IO; |
3 | 4 | using System.Linq;
|
4 | 5 | using size_t = System.UIntPtr;
|
5 | 6 |
|
6 | 7 | namespace ZstdNet
|
7 | 8 | {
|
8 | 9 | public static class DictBuilder
|
9 | 10 | {
|
10 |
| - public static byte[] TrainFromBuffer(ICollection<byte[]> samples, int dictCapacity = DefaultDictCapacity) |
| 11 | + public static byte[] TrainFromBuffer(IEnumerable<byte[]> samples, int dictCapacity = DefaultDictCapacity) |
11 | 12 | {
|
12 |
| - var samplesBuffer = samples.SelectMany(sample => sample).ToArray(); |
13 |
| - var samplesSizes = samples.Select(sample => (size_t)sample.Length).ToArray(); |
14 |
| - var dictBuffer = new byte[dictCapacity]; |
15 |
| - var dictSize = (int)ExternMethods.ZDICT_trainFromBuffer(dictBuffer, (size_t)dictCapacity, samplesBuffer, samplesSizes, (uint)samples.Count).EnsureZdictSuccess(); |
| 13 | + var ms = new MemoryStream (); |
| 14 | + var samplesSizes = new List<size_t> (); |
| 15 | + foreach (var sample in samples) { |
| 16 | + samplesSizes.Add ((size_t) sample.Length); |
| 17 | + ms.Write (sample, 0, sample.Length); |
| 18 | + } |
| 19 | + var samplesBuffer = ms.ToArray (); |
16 | 20 |
|
17 |
| - if (dictCapacity == dictSize) |
18 |
| - return dictBuffer; |
19 |
| - var result = new byte[dictSize]; |
20 |
| - Array.Copy(dictBuffer, result, dictSize); |
21 |
| - return result; |
| 21 | + var dictBuffer = new byte[dictCapacity]; |
| 22 | + var dictSize = (int)ExternMethods |
| 23 | + .ZDICT_trainFromBuffer(dictBuffer, (size_t)dictCapacity, samplesBuffer, samplesSizes.ToArray(), (uint)samplesSizes.Count) |
| 24 | + .EnsureZdictSuccess(); |
| 25 | + if (dictCapacity != dictSize) { |
| 26 | + Array.Resize<byte> (ref dictBuffer, dictSize); |
| 27 | + } |
| 28 | + return dictBuffer; |
22 | 29 | }
|
23 | 30 |
|
24 | 31 | public const int DefaultDictCapacity = 112640; // Used by zstd utility by default
|
|
0 commit comments