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