Mercurial > pub > ImplabNet
comparison Implab/Formats/Json/JsonStringScanner.cs @ 235:b49969a7043c v2
Слияние
| author | cin |
|---|---|
| date | Thu, 05 Oct 2017 09:24:49 +0300 |
| parents | 3e26338eb977 |
| children | 7c7e9ad6fe4a |
comparison
equal
deleted
inserted
replaced
| 234:8dd666e6b6bf | 235:b49969a7043c |
|---|---|
| 1 using System; | |
| 2 using System.Collections.Generic; | |
| 3 using System.Linq; | |
| 4 using System.Text; | |
| 5 using System.Threading.Tasks; | |
| 6 | |
| 7 namespace Implab.Formats.Json { | |
| 8 public class JsonStringScanner : JsonScanner { | |
| 9 const int _defaultBuffer = 64; | |
| 10 | |
| 11 readonly string m_data; | |
| 12 int m_offset; | |
| 13 | |
| 14 JsonStringScanner(string data, char[] buffer, int pos, int length, int offset) : base(buffer, pos, length) { | |
| 15 m_data = data; | |
| 16 m_offset = offset; | |
| 17 } | |
| 18 | |
| 19 protected override int Read(char[] buffer, int offset, int size) { | |
| 20 if (m_data == null) | |
| 21 return 0; | |
| 22 if (m_offset >= m_data.Length) | |
| 23 return 0; | |
| 24 | |
| 25 var count = Math.Min(size, m_data.Length - m_offset); | |
| 26 | |
| 27 m_data.CopyTo(m_offset, buffer, offset, count); | |
| 28 m_offset += count; | |
| 29 | |
| 30 return count; | |
| 31 } | |
| 32 | |
| 33 public static JsonStringScanner Create(string data) { | |
| 34 Safe.ArgumentNotNull(data, nameof(data)); | |
| 35 | |
| 36 if (data.Length <= _defaultBuffer) | |
| 37 return new JsonStringScanner(null, data.ToCharArray(), 0, data.Length, data.Length); | |
| 38 | |
| 39 var buffer = new char[_defaultBuffer]; | |
| 40 data.CopyTo(0, buffer, 0, _defaultBuffer); | |
| 41 return new JsonStringScanner(data, buffer, 0, _defaultBuffer, _defaultBuffer); | |
| 42 } | |
| 43 | |
| 44 public static JsonStringScanner Create(string data, int offset, int length) { | |
| 45 Safe.ArgumentNotNull(data, nameof(data)); | |
| 46 Safe.ArgumentGreaterThan(offset, 0, nameof(offset)); | |
| 47 Safe.ArgumentGreaterThan(length, 0, nameof(length)); | |
| 48 | |
| 49 if (offset + length > data.Length) | |
| 50 throw new ArgumentOutOfRangeException("Specified offset and length are out of the string bounds"); | |
| 51 | |
| 52 if (length <= _defaultBuffer) { | |
| 53 var buffer = new char[length]; | |
| 54 data.CopyTo(offset, buffer, 0, length); | |
| 55 | |
| 56 return new JsonStringScanner(null, buffer, 0, length, length); | |
| 57 } else { | |
| 58 var buffer = new char[_defaultBuffer]; | |
| 59 data.CopyTo(offset, buffer, 0, _defaultBuffer); | |
| 60 return new JsonStringScanner(data, buffer, 0, _defaultBuffer, offset + _defaultBuffer); | |
| 61 } | |
| 62 } | |
| 63 | |
| 64 public static JsonStringScanner Create(char[] data, int offset, int length) { | |
| 65 Safe.ArgumentNotNull(data, nameof(data)); | |
| 66 Safe.ArgumentGreaterThan(offset, 0, nameof(offset)); | |
| 67 Safe.ArgumentGreaterThan(length, 0, nameof(length)); | |
| 68 | |
| 69 if (offset + length > data.Length) | |
| 70 throw new ArgumentOutOfRangeException("Specified offset and length are out of the array bounds"); | |
| 71 | |
| 72 return new JsonStringScanner(null, data, offset, offset + length, offset + length); | |
| 73 | |
| 74 } | |
| 75 } | |
| 76 } |
