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 } |