├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── empty.md └── workflows │ └── test.yml ├── .gitignore ├── LICENSE ├── NOTICE.md ├── README.md └── src ├── .editorconfig ├── Benchmark ├── Benchmark.csproj ├── Program.cs └── data │ ├── large.xml │ └── small.xml ├── U8XmlParser.sln ├── U8XmlParser ├── LICENSE └── U8XmlParser.csproj ├── U8XmlParserUnity ├── .gitignore ├── Assets │ ├── Plugins.meta │ └── Plugins │ │ ├── U8XmlParser.meta │ │ ├── U8XmlParser │ │ ├── Runtime.meta │ │ ├── Runtime │ │ │ ├── AllNodeList.cs │ │ │ ├── AllNodeList.cs.meta │ │ │ ├── AssemblyInfo.cs │ │ │ ├── AssemblyInfo.cs.meta │ │ │ ├── DataLocation.cs │ │ │ ├── DataLocation.cs.meta │ │ │ ├── Internal.meta │ │ │ ├── Internal │ │ │ │ ├── AllocationSafety.cs │ │ │ │ ├── AllocationSafety.cs.meta │ │ │ │ ├── BitOperationHelper.cs │ │ │ │ ├── BitOperationHelper.cs.meta │ │ │ │ ├── CustomList.cs │ │ │ │ ├── CustomList.cs.meta │ │ │ │ ├── DataOffsetHelper.cs │ │ │ │ ├── DataOffsetHelper.cs.meta │ │ │ │ ├── EncodingExtension.cs │ │ │ │ ├── EncodingExtension.cs.meta │ │ │ │ ├── IXmlObject.cs │ │ │ │ ├── IXmlObject.cs.meta │ │ │ │ ├── NodeStack.cs │ │ │ │ ├── NodeStack.cs.meta │ │ │ │ ├── OptionalNodeList.cs │ │ │ │ ├── OptionalNodeList.cs.meta │ │ │ │ ├── PredefinedEntityTable.cs │ │ │ │ ├── PredefinedEntityTable.cs.meta │ │ │ │ ├── RawStringPairList.cs │ │ │ │ ├── RawStringPairList.cs.meta │ │ │ │ ├── RawStringTable.cs │ │ │ │ ├── RawStringTable.cs.meta │ │ │ │ ├── SkipLocalsInitCompatible.cs │ │ │ │ ├── SkipLocalsInitCompatible.cs.meta │ │ │ │ ├── SpanHelper.cs │ │ │ │ ├── SpanHelper.cs.meta │ │ │ │ ├── StreamExtension.cs │ │ │ │ ├── StreamExtension.cs.meta │ │ │ │ ├── ThrowHelper.cs │ │ │ │ ├── ThrowHelper.cs.meta │ │ │ │ ├── UTF8ExceptionFallbackEncoding.cs │ │ │ │ ├── UTF8ExceptionFallbackEncoding.cs.meta │ │ │ │ ├── UnicodeHelper.cs │ │ │ │ ├── UnicodeHelper.cs.meta │ │ │ │ ├── UnmanagedBuffer.cs │ │ │ │ ├── UnmanagedBuffer.cs.meta │ │ │ │ ├── UnsafeHelper.cs │ │ │ │ ├── UnsafeHelper.cs.meta │ │ │ │ ├── XXHash32.cs │ │ │ │ ├── XXHash32.cs.meta │ │ │ │ ├── XmlObjectCore.cs │ │ │ │ ├── XmlObjectCore.cs.meta │ │ │ │ ├── XmlnsHelper.cs │ │ │ │ └── XmlnsHelper.cs.meta │ │ │ ├── Option.cs │ │ │ ├── Option.cs.meta │ │ │ ├── RawString.Conversion.cs │ │ │ ├── RawString.Conversion.cs.meta │ │ │ ├── RawString.Deprecated.cs │ │ │ ├── RawString.Deprecated.cs.meta │ │ │ ├── RawString.cs │ │ │ ├── RawString.cs.meta │ │ │ ├── SpanByteExtensions.cs │ │ │ ├── SpanByteExtensions.cs.meta │ │ │ ├── SplitRawStrings.cs │ │ │ ├── SplitRawStrings.cs.meta │ │ │ ├── Unsafes.meta │ │ │ ├── Unsafes │ │ │ │ ├── XmlObjectUnsafe.cs │ │ │ │ ├── XmlObjectUnsafe.cs.meta │ │ │ │ ├── XmlParserUnsafe.cs │ │ │ │ └── XmlParserUnsafe.cs.meta │ │ │ ├── XmlAttribute.cs │ │ │ ├── XmlAttribute.cs.meta │ │ │ ├── XmlAttributeEnumerableExtension.cs │ │ │ ├── XmlAttributeEnumerableExtension.cs.meta │ │ │ ├── XmlAttributeList.cs │ │ │ ├── XmlAttributeList.cs.meta │ │ │ ├── XmlDeclaration.cs │ │ │ ├── XmlDeclaration.cs.meta │ │ │ ├── XmlDocumentType.cs │ │ │ ├── XmlDocumentType.cs.meta │ │ │ ├── XmlEntityTable.cs │ │ │ ├── XmlEntityTable.cs.meta │ │ │ ├── XmlNode.cs │ │ │ ├── XmlNode.cs.meta │ │ │ ├── XmlNodeDescendantList.cs │ │ │ ├── XmlNodeDescendantList.cs.meta │ │ │ ├── XmlNodeEnumerableExtension.cs │ │ │ ├── XmlNodeEnumerableExtension.cs.meta │ │ │ ├── XmlNodeList.cs │ │ │ ├── XmlNodeList.cs.meta │ │ │ ├── XmlObject.cs │ │ │ ├── XmlObject.cs.meta │ │ │ ├── XmlParser.cs │ │ │ └── XmlParser.cs.meta │ │ ├── Samples~ │ │ │ ├── U8XmlParserSample.meta │ │ │ └── U8XmlParserSample │ │ │ │ ├── Scripts.meta │ │ │ │ ├── Scripts │ │ │ │ ├── U8XmlSample.cs │ │ │ │ └── U8XmlSample.cs.meta │ │ │ │ ├── U8Xml.U8XmlParserSample.asmdef │ │ │ │ ├── U8Xml.U8XmlParserSample.asmdef.meta │ │ │ │ ├── U8XmlSampleScene.unity │ │ │ │ └── U8XmlSampleScene.unity.meta │ │ ├── System.Buffers.dll │ │ ├── System.Buffers.dll.meta │ │ ├── System.Memory.dll │ │ ├── System.Memory.dll.meta │ │ ├── System.Runtime.CompilerServices.Unsafe.dll │ │ ├── System.Runtime.CompilerServices.Unsafe.dll.meta │ │ ├── U8Xml.U8XmlParser.asmdef │ │ └── U8Xml.U8XmlParser.asmdef.meta │ │ ├── package.json │ │ └── package.json.meta └── ProjectSettings │ ├── AudioManager.asset │ ├── ClusterInputManager.asset │ ├── DynamicsManager.asset │ ├── EditorBuildSettings.asset │ ├── EditorSettings.asset │ ├── GraphicsSettings.asset │ ├── InputManager.asset │ ├── NavMeshAreas.asset │ ├── PackageManagerSettings.asset │ ├── Physics2DSettings.asset │ ├── PresetManager.asset │ ├── ProjectSettings.asset │ ├── ProjectVersion.txt │ ├── QualitySettings.asset │ ├── TagManager.asset │ ├── TimeManager.asset │ ├── UnityConnectSettings.asset │ ├── VFXManager.asset │ ├── VersionControlSettings.asset │ └── XRSettings.asset └── UnitTest ├── CommentTest.cs ├── Data.cs ├── DataLocationTest.cs ├── DtdParseTest.cs ├── ElementAndTextMixedTest.cs ├── FileParserTest.cs ├── FindAttributeTest.cs ├── FindChildTest.cs ├── NodeInfo.cs ├── NodeStringTest.cs ├── ParseAttributeTest.cs ├── ParserTest.cs ├── RawStringTest.cs ├── TestCases.cs ├── TestFiles ├── test_utf16_be.xml ├── test_utf16_le.xml ├── test_utf8.xml └── test_utf8_with_bom.xml ├── UnitTest.csproj ├── XmlAttributesTest.cs └── XmlDeclarationTest.cs /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug**: 11 | 12 | **Environment**: 13 | 14 | library version: x.x.x 15 | .NET version: (.NET6, .NET5, etc...) 16 | OS: (Windows10, Ubuntu xx.xx, etc...) 17 | 18 | **Steps to Reproduce**: 19 | 20 | 1. 21 | 2. 22 | 3. 23 | 24 | **Expected behavior**: 25 | 26 | 27 | **Actual Behavior**: 28 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/empty.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Empty 3 | about: No template 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | 11 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Build and Test 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | workflow_dispatch: 9 | 10 | jobs: 11 | build: 12 | 13 | runs-on: ubuntu-latest 14 | strategy: 15 | matrix: 16 | target-framework: [ 'net48', 'netcoreapp3.1', 'net5.0', 'net6.0' ] 17 | 18 | steps: 19 | - uses: actions/checkout@v2 20 | - name: Setup .NET Core SDK 21 | uses: actions/setup-dotnet@v1 22 | with: 23 | dotnet-version: '6.0.100' 24 | - name: Restore dependencies 25 | run: dotnet restore src/U8XmlParser/U8XmlParser.csproj 26 | - name: Build Debug 27 | run: dotnet build --no-restore -c Debug --framework ${{ matrix.target-framework }} /nowarn:cs1591 src/U8XmlParser/U8XmlParser.csproj 28 | - name: Test Debug 29 | run: dotnet test --no-build --verbosity normal -c Debug --framework ${{ matrix.target-framework }} src/UnitTest/UnitTest.csproj 30 | - name: Build Release 31 | run: dotnet build --no-restore -c Release --framework ${{ matrix.target-framework }} /nowarn:cs1591 src/U8XmlParser/U8XmlParser.csproj 32 | - name: Test Release 33 | run: dotnet test --no-build --verbosity normal -c Release --framework ${{ matrix.target-framework }} src/UnitTest/UnitTest.csproj 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 ikorin24 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /NOTICE.md: -------------------------------------------------------------------------------- 1 | # NOTICE 2 | 3 | ## BenchmarkDotNet 4 | 5 | The MIT License 6 | Copyright (c) 2013–2020 .NET Foundation and contributors 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 11 | 12 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 13 | 14 | ## StringLiteralGenerator 15 | 16 | MIT License 17 | 18 | Copyright (c) 2020 Nobuyuki Iwanaga 19 | 20 | Permission is hereby granted, free of charge, to any person obtaining a copy 21 | of this software and associated documentation files (the "Software"), to deal 22 | in the Software without restriction, including without limitation the rights 23 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 24 | copies of the Software, and to permit persons to whom the Software is 25 | furnished to do so, subject to the following conditions: 26 | 27 | The above copyright notice and this permission notice shall be included in all 28 | copies or substantial portions of the Software. 29 | 30 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 31 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 32 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 33 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 34 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 35 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 36 | SOFTWARE. 37 | -------------------------------------------------------------------------------- /src/.editorconfig: -------------------------------------------------------------------------------- 1 | # 上位ディレクトリから .editorconfig 設定を継承する場合は、以下の行を削除します 2 | root = true 3 | 4 | [*] 5 | end_of_line = crlf 6 | 7 | [*.md,*.xml,*.cs,*.xaml,*.glsl,*.vert,*.frag] 8 | # for any text-based file 9 | charset = utf-8 10 | end_of_line = crlf 11 | insert_final_newline = true 12 | 13 | [*.md] 14 | indent_style = space 15 | indent_size = 4 16 | insert_final_newline = true 17 | 18 | [*.xml] 19 | indent_size = 4 20 | indent_style = space 21 | tab_width = 4 22 | insert_final_newline = true 23 | 24 | # CSharp formatting settings: 25 | [*.cs] 26 | # インデントと間隔 27 | indent_size = 4 28 | indent_style = space 29 | tab_width = 4 30 | 31 | # 改行設定 32 | end_of_line = crlf 33 | insert_final_newline = true 34 | 35 | #### .NET コーディング規則 #### 36 | 37 | # using の整理 38 | dotnet_separate_import_directive_groups = false 39 | dotnet_sort_system_directives_first = false 40 | 41 | # this. と Me. の設定 42 | dotnet_style_qualification_for_event = false:silent 43 | dotnet_style_qualification_for_field = false:silent 44 | dotnet_style_qualification_for_method = false:silent 45 | dotnet_style_qualification_for_property = false:silent 46 | 47 | # 言語キーワードと BCL の種類の設定 48 | dotnet_style_predefined_type_for_locals_parameters_members = true:silent 49 | dotnet_style_predefined_type_for_member_access = true:silent 50 | 51 | # かっこの設定 52 | dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent 53 | dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent 54 | dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent 55 | dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent 56 | 57 | # 修飾子設定 58 | dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent 59 | 60 | # 式レベルの設定 61 | csharp_style_deconstructed_variable_declaration = true:suggestion 62 | csharp_style_inlined_variable_declaration = true:suggestion 63 | csharp_style_throw_expression = true:suggestion 64 | dotnet_style_coalesce_expression = true:suggestion 65 | dotnet_style_collection_initializer = true:suggestion 66 | dotnet_style_explicit_tuple_names = true:suggestion 67 | dotnet_style_null_propagation = true:suggestion 68 | dotnet_style_object_initializer = true:suggestion 69 | dotnet_style_prefer_auto_properties = true:silent 70 | dotnet_style_prefer_compound_assignment = true:suggestion 71 | dotnet_style_prefer_conditional_expression_over_assignment = true:silent 72 | dotnet_style_prefer_conditional_expression_over_return = true:silent 73 | dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion 74 | dotnet_style_prefer_inferred_tuple_names = true:suggestion 75 | dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion 76 | 77 | # フィールド設定 78 | dotnet_style_readonly_field = true:suggestion 79 | 80 | # パラメーターの設定 81 | dotnet_code_quality_unused_parameters = all:suggestion 82 | 83 | #### C# コーディング規則 #### 84 | 85 | # var を優先 86 | csharp_style_var_elsewhere = false:silent 87 | csharp_style_var_for_built_in_types = false:silent 88 | csharp_style_var_when_type_is_apparent = false:silent 89 | 90 | # 式のようなメンバー 91 | csharp_style_expression_bodied_accessors = true:silent 92 | csharp_style_expression_bodied_constructors = false:silent 93 | csharp_style_expression_bodied_indexers = true:silent 94 | csharp_style_expression_bodied_lambdas = true:silent 95 | csharp_style_expression_bodied_local_functions = false:silent 96 | csharp_style_expression_bodied_methods = false:silent 97 | csharp_style_expression_bodied_operators = false:silent 98 | csharp_style_expression_bodied_properties = true:silent 99 | 100 | # パターン マッチング設定 101 | csharp_style_pattern_matching_over_as_with_null_check = true:suggestion 102 | csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion 103 | 104 | # Null チェック設定 105 | csharp_style_conditional_delegate_call = true:suggestion 106 | 107 | # 修飾子設定 108 | csharp_prefer_static_local_function = true:suggestion 109 | csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async 110 | 111 | # コード ブロックの設定 112 | csharp_prefer_braces = true:silent 113 | csharp_prefer_simple_using_statement = true:suggestion 114 | 115 | # 式レベルの設定 116 | csharp_prefer_simple_default_expression = true:suggestion 117 | csharp_style_pattern_local_over_anonymous_function = true:suggestion 118 | csharp_style_prefer_index_operator = true:suggestion 119 | csharp_style_prefer_range_operator = true:suggestion 120 | csharp_style_unused_value_assignment_preference = discard_variable:suggestion 121 | csharp_style_unused_value_expression_statement_preference = discard_variable:silent 122 | 123 | # 'using' ディレクティブの基本設定 124 | csharp_using_directive_placement = outside_namespace:silent 125 | 126 | #### C# 書式ルール #### 127 | 128 | # 改行設定 129 | csharp_new_line_before_catch = true 130 | csharp_new_line_before_else = true 131 | csharp_new_line_before_finally = true 132 | csharp_new_line_before_members_in_anonymous_types = true 133 | csharp_new_line_before_members_in_object_initializers = true 134 | csharp_new_line_before_open_brace = accessors,anonymous_methods,anonymous_types,lambdas,methods,object_collection_array_initializers,properties,types 135 | csharp_new_line_between_query_expression_clauses = true 136 | 137 | # インデント設定 138 | csharp_indent_block_contents = true 139 | csharp_indent_braces = false 140 | csharp_indent_case_contents = true 141 | csharp_indent_case_contents_when_block = false 142 | csharp_indent_labels = one_less_than_current 143 | csharp_indent_switch_labels = true 144 | 145 | # スペース設定 146 | csharp_space_after_cast = false 147 | csharp_space_after_colon_in_inheritance_clause = true 148 | csharp_space_after_comma = true 149 | csharp_space_after_dot = false 150 | csharp_space_after_keywords_in_control_flow_statements = false 151 | csharp_space_after_semicolon_in_for_statement = true 152 | csharp_space_around_binary_operators = before_and_after 153 | csharp_space_around_declaration_statements = false 154 | csharp_space_before_colon_in_inheritance_clause = true 155 | csharp_space_before_comma = false 156 | csharp_space_before_dot = false 157 | csharp_space_before_open_square_brackets = false 158 | csharp_space_before_semicolon_in_for_statement = false 159 | csharp_space_between_empty_square_brackets = false 160 | csharp_space_between_method_call_empty_parameter_list_parentheses = false 161 | csharp_space_between_method_call_name_and_opening_parenthesis = false 162 | csharp_space_between_method_call_parameter_list_parentheses = false 163 | csharp_space_between_method_declaration_empty_parameter_list_parentheses = false 164 | csharp_space_between_method_declaration_name_and_open_parenthesis = false 165 | csharp_space_between_method_declaration_parameter_list_parentheses = false 166 | csharp_space_between_parentheses = false 167 | csharp_space_between_square_brackets = false 168 | 169 | # 折り返しの設定 170 | csharp_preserve_single_line_blocks = true 171 | csharp_preserve_single_line_statements = true 172 | -------------------------------------------------------------------------------- /src/Benchmark/Benchmark.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Exe 5 | net6.0;net5.0;net48 6 | U8Xml.Benchmark 7 | 8.0 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | Always 21 | 22 | 23 | Always 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/Benchmark/Program.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System.IO; 3 | using BenchmarkDotNet.Running; 4 | using BenchmarkDotNet.Attributes; 5 | 6 | namespace U8Xml.Benchmark 7 | { 8 | class Program 9 | { 10 | public static void Main() 11 | { 12 | // Switch benchmarks 13 | 14 | //BenchmarkRunner.Run(); 15 | BenchmarkRunner.Run(); 16 | } 17 | } 18 | 19 | [MemoryDiagnoser] 20 | [MarkdownExporterAttribute.GitHub] 21 | [RyuJitX64Job] 22 | [IterationCount(100)] 23 | public class ParserStreamBenchmark 24 | { 25 | private Stream? _stream; 26 | 27 | public ParserStreamBenchmark() 28 | { 29 | // Remove comment-out to switch the file 30 | 31 | //var name = "small.xml"; 32 | var name = "large.xml"; 33 | 34 | var filePath = Path.Combine("data", name); 35 | 36 | using(var file = File.OpenRead(filePath)) { 37 | var ms = new MemoryStream(); 38 | file.CopyTo(ms); 39 | _stream = ms; 40 | } 41 | } 42 | 43 | // *** NOTE *** 44 | // Don't use IterationSetup and IterationCleanup. This benchmark is shorter than 100ms. 45 | // See https://benchmarkdotnet.org/articles/features/setup-and-cleanup.html 46 | // 47 | // > It's not recommended to use this attribute in microbenchmarks because it can spoil the results. 48 | // > However, if you are writing a macrobenchmark (e.g. a benchmark which takes at least 100ms) 49 | // > and you want to prepare some data before each invocation, [IterationSetup] can be useful. 50 | 51 | [Benchmark(Baseline = true, Description = "U8Xml.XmlParser (my lib)")] 52 | public void U8XmlParser() 53 | { 54 | var stream = _stream!; 55 | stream.Position = 0; 56 | using var xml = U8Xml.XmlParser.Parse(stream); 57 | } 58 | 59 | [Benchmark(Description = "System.Xml.Linq.XDocument")] 60 | public void XDocument() 61 | { 62 | var stream = _stream!; 63 | stream.Position = 0; 64 | var xml = System.Xml.Linq.XDocument.Load(stream); 65 | } 66 | 67 | [Benchmark(Description = "System.Xml.XmlDocument")] 68 | public void XmlDocument() 69 | { 70 | var stream = _stream!; 71 | stream.Position = 0; 72 | var xml = new System.Xml.XmlDocument(); 73 | xml.Load(stream); 74 | } 75 | 76 | [Benchmark(Description = "System.Xml.XmlReader")] 77 | public void XmlReader() 78 | { 79 | var stream = _stream!; 80 | stream.Position = 0; 81 | using var reader = System.Xml.XmlReader.Create(stream); 82 | while(reader.Read()) { 83 | } 84 | } 85 | } 86 | 87 | [MemoryDiagnoser] 88 | [MarkdownExporterAttribute.GitHub] 89 | [RyuJitX64Job] 90 | [IterationCount(100)] 91 | public class ParserFileBenchmark 92 | { 93 | private string _filePath; 94 | 95 | public ParserFileBenchmark() 96 | { 97 | // Remove comment-out to switch the file 98 | 99 | //var name = "small.xml"; 100 | var name = "large.xml"; 101 | 102 | _filePath = Path.Combine("data", name); 103 | } 104 | 105 | // *** NOTE *** 106 | // Don't use IterationSetup and IterationCleanup. This benchmark is shorter than 100ms. 107 | // See https://benchmarkdotnet.org/articles/features/setup-and-cleanup.html 108 | // 109 | // > It's not recommended to use this attribute in microbenchmarks because it can spoil the results. 110 | // > However, if you are writing a macrobenchmark (e.g. a benchmark which takes at least 100ms) 111 | // > and you want to prepare some data before each invocation, [IterationSetup] can be useful. 112 | 113 | [Benchmark(Baseline = true, Description = "U8Xml.XmlParser (my lib)")] 114 | public void U8XmlParser_File() 115 | { 116 | using var xml = U8Xml.XmlParser.ParseFile(_filePath); 117 | } 118 | 119 | [Benchmark(Description = "System.Xml.Linq.XDocument")] 120 | public void XDocument_File() 121 | { 122 | var xml = System.Xml.Linq.XDocument.Load(_filePath); 123 | } 124 | 125 | [Benchmark(Description = "System.Xml.XmlDocument")] 126 | public void XmlDocument_File() 127 | { 128 | var xml = new System.Xml.XmlDocument(); 129 | xml.Load(_filePath); 130 | } 131 | 132 | [Benchmark(Description = "System.Xml.XmlReader")] 133 | public void XmlReader_File() 134 | { 135 | using var reader = System.Xml.XmlReader.Create(_filePath); 136 | while(reader.Read()) { 137 | } 138 | } 139 | } 140 | 141 | } 142 | -------------------------------------------------------------------------------- /src/U8XmlParser.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.31112.23 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "U8XmlParser", "U8XmlParser\U8XmlParser.csproj", "{ADD436FC-0CB2-4FDB-AC42-70852E0868BB}" 7 | EndProject 8 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTest", "UnitTest\UnitTest.csproj", "{9906A207-5BFB-45BC-840B-755388A2A368}" 9 | EndProject 10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Benchmark", "Benchmark\Benchmark.csproj", "{52C19707-7EF1-44BF-A99A-60A2D145ACAE}" 11 | EndProject 12 | Global 13 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 14 | Debug|Any CPU = Debug|Any CPU 15 | Release|Any CPU = Release|Any CPU 16 | EndGlobalSection 17 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 18 | {ADD436FC-0CB2-4FDB-AC42-70852E0868BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 19 | {ADD436FC-0CB2-4FDB-AC42-70852E0868BB}.Debug|Any CPU.Build.0 = Debug|Any CPU 20 | {ADD436FC-0CB2-4FDB-AC42-70852E0868BB}.Release|Any CPU.ActiveCfg = Release|Any CPU 21 | {ADD436FC-0CB2-4FDB-AC42-70852E0868BB}.Release|Any CPU.Build.0 = Release|Any CPU 22 | {9906A207-5BFB-45BC-840B-755388A2A368}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 23 | {9906A207-5BFB-45BC-840B-755388A2A368}.Debug|Any CPU.Build.0 = Debug|Any CPU 24 | {9906A207-5BFB-45BC-840B-755388A2A368}.Release|Any CPU.ActiveCfg = Release|Any CPU 25 | {9906A207-5BFB-45BC-840B-755388A2A368}.Release|Any CPU.Build.0 = Release|Any CPU 26 | {52C19707-7EF1-44BF-A99A-60A2D145ACAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 27 | {52C19707-7EF1-44BF-A99A-60A2D145ACAE}.Debug|Any CPU.Build.0 = Debug|Any CPU 28 | {52C19707-7EF1-44BF-A99A-60A2D145ACAE}.Release|Any CPU.ActiveCfg = Release|Any CPU 29 | {52C19707-7EF1-44BF-A99A-60A2D145ACAE}.Release|Any CPU.Build.0 = Release|Any CPU 30 | EndGlobalSection 31 | GlobalSection(SolutionProperties) = preSolution 32 | HideSolutionNode = FALSE 33 | EndGlobalSection 34 | GlobalSection(ExtensibilityGlobals) = postSolution 35 | SolutionGuid = {C7FB9280-6C7E-413B-AC4A-6AB87373C3F9} 36 | EndGlobalSection 37 | EndGlobal 38 | -------------------------------------------------------------------------------- /src/U8XmlParser/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 ikorin24 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/U8XmlParser/U8XmlParser.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0;net5.0;netcoreapp3.1;net48;netstandard2.0;netstandard2.1 5 | enable 6 | 8.0 7 | U8Xml 8 | true 9 | true 10 | ikorin24 11 | ikorin24 12 | High performance C# xml parser 13 | Copyright © 2022 ikorin24 14 | https://github.com/ikorin24/U8XmlParser.git 15 | true 16 | git 17 | 1.6.1 18 | LICENSE 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | True 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/.gitignore: -------------------------------------------------------------------------------- 1 | # This .gitignore file should be placed at the root of your Unity project directory 2 | # 3 | # Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore 4 | # 5 | /[Ll]ibrary/ 6 | /[Tt]emp/ 7 | /[Oo]bj/ 8 | /[Bb]uild/ 9 | /[Bb]uilds/ 10 | /[Ll]ogs/ 11 | /[Uu]ser[Ss]ettings/ 12 | 13 | # MemoryCaptures can get excessive in size. 14 | # They also could contain extremely sensitive data 15 | /[Mm]emoryCaptures/ 16 | 17 | # Asset meta data should only be ignored when the corresponding asset is also ignored 18 | !/[Aa]ssets/**/*.meta 19 | 20 | # Uncomment this line if you wish to ignore the asset store tools plugin 21 | # /[Aa]ssets/AssetStoreTools* 22 | 23 | # Autogenerated Jetbrains Rider plugin 24 | /[Aa]ssets/Plugins/Editor/JetBrains* 25 | 26 | # Visual Studio cache directory 27 | .vs/ 28 | 29 | # Gradle cache directory 30 | .gradle/ 31 | 32 | # Autogenerated VS/MD/Consulo solution and project files 33 | ExportedObj/ 34 | .consulo/ 35 | *.csproj 36 | *.unityproj 37 | *.sln 38 | *.suo 39 | *.tmp 40 | *.user 41 | *.userprefs 42 | *.pidb 43 | *.booproj 44 | *.svd 45 | *.pdb 46 | *.mdb 47 | *.opendb 48 | *.VC.db 49 | 50 | # Unity3D generated meta files 51 | *.pidb.meta 52 | *.pdb.meta 53 | *.mdb.meta 54 | 55 | # Unity3D generated file on crash reports 56 | sysinfo.txt 57 | 58 | # Builds 59 | *.apk 60 | *.aab 61 | *.unitypackage 62 | 63 | # Crashlytics generated file 64 | crashlytics-build.properties 65 | 66 | # Packed Addressables 67 | /[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin* 68 | 69 | # Temporary auto-generated Android Assets 70 | /[Aa]ssets/[Ss]treamingAssets/aa.meta 71 | /[Aa]ssets/[Ss]treamingAssets/aa/* 72 | 73 | .vsconfig 74 | 75 | !/[Aa]ssets/Plugins/U8XmlParser/*~/ 76 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1f69c3da1b7db5347aabb76fa2ff769a 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b8cd984bb5d771941bf6d44f99388290 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bab58fd6c06414a4ead0c2bd187c3a03 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/AllNodeList.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using System.Collections; 4 | using System.Collections.Generic; 5 | using System.Diagnostics; 6 | using System.Runtime.CompilerServices; 7 | using U8Xml.Internal; 8 | 9 | namespace U8Xml 10 | { 11 | [DebuggerDisplay("XmlNode[{Count}]")] 12 | [DebuggerTypeProxy(typeof(AllNodeListDebuggerTypeProxy))] 13 | public readonly unsafe struct AllNodeList : IEnumerable 14 | { 15 | private readonly CustomList _nodes; 16 | private readonly int _count; 17 | private readonly XmlNodeType? _targetType; 18 | 19 | public int Count => _count; 20 | 21 | internal AllNodeList(CustomList nodes, int count, XmlNodeType? targetType) 22 | { 23 | _nodes = nodes; 24 | _count = count; 25 | _targetType = targetType; 26 | } 27 | 28 | public XmlNode First() 29 | { 30 | if(FirstOrDefault().TryGetValue(out var node) == false) { 31 | ThrowHelper.ThrowInvalidOperation("Sequence contains no elements."); 32 | } 33 | return node; 34 | } 35 | 36 | public Option FirstOrDefault() 37 | { 38 | using var e = GetEnumerator(); 39 | if(e.MoveNext() == false) { 40 | return Option.Null; 41 | } 42 | return e.Current; 43 | } 44 | 45 | public XmlNode First(Func predicate) 46 | { 47 | if(FirstOrDefault(predicate).TryGetValue(out var node) == false) { 48 | ThrowHelper.ThrowInvalidOperation("Sequence contains no matching elements."); 49 | } 50 | return node; 51 | } 52 | 53 | public Option FirstOrDefault(Func predicate) 54 | { 55 | if(predicate is null) { ThrowHelper.ThrowNullArg(nameof(predicate)); } 56 | foreach(var node in this) { 57 | if(predicate!(node)) { 58 | return node; 59 | } 60 | } 61 | return Option.Null; 62 | } 63 | 64 | public Enumerator GetEnumerator() => new Enumerator(_nodes.GetEnumerator(), _targetType); 65 | 66 | IEnumerator IEnumerable.GetEnumerator() => new EnumeratorClass(_nodes.GetEnumerator(), _targetType); 67 | 68 | IEnumerator IEnumerable.GetEnumerator() => new EnumeratorClass(_nodes.GetEnumerator(), _targetType); 69 | 70 | 71 | public struct Enumerator : IEnumerator 72 | { 73 | private CustomList.Enumerator _e; 74 | private readonly XmlNodeType _targetType; 75 | private readonly bool _hasTargetType; 76 | 77 | internal Enumerator(CustomList.Enumerator e, XmlNodeType? targetType) 78 | { 79 | _e = e; 80 | (_hasTargetType, _targetType) = targetType.HasValue switch 81 | { 82 | true => (true, targetType.Value), 83 | false => (false, default), 84 | }; 85 | } 86 | 87 | public XmlNode Current => new XmlNode(_e.Current); 88 | 89 | object IEnumerator.Current => Current; 90 | 91 | public void Dispose() => _e.Dispose(); 92 | 93 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 94 | public bool MoveNext() 95 | { 96 | MoveNext: 97 | if(_e.MoveNext() == false) { 98 | return false; 99 | } 100 | if(_hasTargetType == false || _e.Current->NodeType == _targetType) { 101 | return true; 102 | } 103 | goto MoveNext; 104 | } 105 | 106 | public void Reset() => _e.Reset(); 107 | } 108 | 109 | internal sealed class EnumeratorClass : IEnumerator 110 | { 111 | private Enumerator _e; 112 | 113 | internal EnumeratorClass(CustomList.Enumerator e, XmlNodeType? targetType) 114 | { 115 | _e = new Enumerator(e, targetType); 116 | } 117 | 118 | public XmlNode Current => _e.Current; 119 | 120 | object IEnumerator.Current => Current; 121 | 122 | public void Dispose() => _e.Dispose(); 123 | 124 | public bool MoveNext() => _e.MoveNext(); 125 | 126 | public void Reset() => _e.Reset(); 127 | } 128 | 129 | internal sealed class AllNodeListDebuggerTypeProxy 130 | { 131 | [DebuggerBrowsable(DebuggerBrowsableState.Never)] 132 | private readonly AllNodeList _list; 133 | 134 | [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] 135 | public XmlNode[] Item => System.Linq.Enumerable.ToArray(_list); 136 | 137 | public AllNodeListDebuggerTypeProxy(AllNodeList list) 138 | { 139 | _list = list; 140 | } 141 | } 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/AllNodeList.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6d0ea6380985e6e49b1fbf817a317aa9 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | #if UNITY_2018_1_OR_NEWER 2 | #define IS_UNITY 3 | #endif 4 | 5 | #if !IS_UNITY 6 | using System.Runtime.CompilerServices; 7 | 8 | [assembly: InternalsVisibleTo("UnitTest")] 9 | #endif 10 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/AssemblyInfo.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ef8ba4dd9e0bd9846b4e75e05c8d62ab 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/DataLocation.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8e7e4a164e54cc6419ba5ffe2c2be876 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ad02885932ce5304387056a3f8fcc8ca 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/AllocationSafety.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using System.Diagnostics; 4 | 5 | namespace U8Xml.Internal 6 | { 7 | internal static class AllocationSafety 8 | { 9 | [ThreadStatic] 10 | private static int _size; 11 | 12 | [Conditional("DEBUG")] 13 | public static void Add(int size) 14 | { 15 | _size += size; 16 | } 17 | 18 | [Conditional("DEBUG")] 19 | public static void Remove(int size) 20 | { 21 | _size -= size; 22 | } 23 | 24 | [Conditional("DEBUG")] 25 | public static void Ensure() 26 | { 27 | var size = _size; 28 | _size = 0; 29 | if(size != 0) { 30 | throw new Exception($"Memory leak happened or something wrong. ({_size} bytes)"); 31 | } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/AllocationSafety.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4d4c78a6690297348b5624cd8b04f06f 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/BitOperationHelper.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | #if NETCOREAPP3_1_OR_GREATER 3 | #define SUPPORT_BIT_OPERATIONS 4 | #endif 5 | 6 | using System; 7 | using System.Diagnostics; 8 | using System.Runtime.CompilerServices; 9 | 10 | #if SUPPORT_BIT_OPERATIONS 11 | using System.Numerics; 12 | #else 13 | using System.Runtime.InteropServices; 14 | #endif 15 | 16 | namespace U8Xml.Internal 17 | { 18 | internal static class BitOperationHelper 19 | { 20 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 21 | public static uint RotateLeft(uint value, int offset) 22 | { 23 | return (value << offset) | (value >> (32 - offset)); 24 | } 25 | 26 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 27 | public static int Log2(uint value) 28 | { 29 | #if SUPPORT_BIT_OPERATIONS 30 | return BitOperations.Log2(value); 31 | #else 32 | // https://source.dot.net/#System.Private.CoreLib/BitOperations.cs,178 33 | 34 | // The 0->0 contract is fulfilled by setting the LSB to 1. 35 | // Log(1) is 0, and setting the LSB for values > 1 does not change the log2 result. 36 | value |= 1; 37 | return Log2SoftwareFallback(value); 38 | #endif 39 | } 40 | 41 | #if !SUPPORT_BIT_OPERATIONS 42 | private static ReadOnlySpan Log2DeBruijn => new byte[32] 43 | { 44 | 00, 09, 01, 10, 13, 21, 02, 29, 45 | 11, 14, 16, 18, 22, 25, 03, 30, 46 | 08, 12, 20, 28, 15, 17, 24, 07, 47 | 19, 27, 23, 06, 26, 05, 04, 31 48 | }; 49 | 50 | private static int Log2SoftwareFallback(uint value) 51 | { 52 | // https://source.dot.net/#System.Private.CoreLib/BitOperations.cs,253 53 | 54 | // No AggressiveInlining due to large method size 55 | // Has conventional contract 0->0 (Log(0) is undefined) 56 | 57 | // Fill trailing zeros with ones, eg 00010010 becomes 00011111 58 | value |= value >> 01; 59 | value |= value >> 02; 60 | value |= value >> 04; 61 | value |= value >> 08; 62 | value |= value >> 16; 63 | 64 | // uint.MaxValue >> 27 is always in range [0 - 31] so we use Unsafe.AddByteOffset to avoid bounds check 65 | return Unsafe.AddByteOffset( 66 | // Using deBruijn sequence, k=2, n=5 (2^5=32) : 0b_0000_0111_1100_0100_1010_1100_1101_1101u 67 | ref MemoryMarshal.GetReference(Log2DeBruijn), 68 | // uint|long -> IntPtr cast on 32-bit platforms does expensive overflow checks not needed here 69 | (IntPtr)(int)((value * 0x07C4ACDDu) >> 27)); 70 | } 71 | #endif 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/BitOperationHelper.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1de7f9bfd588d2846a09993dccdca0ba 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/CustomList.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fe5b87eef17f35b48a66d251383c411c 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/DataOffsetHelper.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System.Diagnostics; 3 | 4 | namespace U8Xml.Internal 5 | { 6 | internal static unsafe class DataOffsetHelper 7 | { 8 | public static int? GetOffset(byte* dataHead, int dataLen, byte* target) 9 | { 10 | if(dataLen < 0) { ThrowHelper.ThrowArgOutOfRange(nameof(dataLen)); } 11 | if(CheckContainsMemory(dataHead, dataLen, target, 0) == false) { 12 | return null; 13 | } 14 | long offset = target - dataHead; 15 | return checked((int)(uint)offset); 16 | } 17 | 18 | public static DataLocation? GetLocation(byte* dataHead, int dataLen, byte* targetHead, int targetLen) 19 | { 20 | if(dataLen < 0) { ThrowHelper.ThrowArgOutOfRange(nameof(dataLen)); } 21 | if(targetLen < 0) { ThrowHelper.ThrowArgOutOfRange(nameof(targetLen)); } 22 | if(CheckContainsMemory(dataHead, dataLen, targetHead, targetLen) == false) { 23 | return null; 24 | } 25 | 26 | var start = GetLinePositionPrivate(dataHead, dataLen, targetHead); 27 | var endOffset = GetLinePositionPrivate(targetHead, targetLen, targetHead + targetLen); 28 | var end = new DataLinePosition( 29 | line: start.Line + endOffset.Line, 30 | position: (endOffset.Line == 0) ? (start.Position + endOffset.Position) : endOffset.Position 31 | ); 32 | 33 | int byteOffset = checked((int)(uint)(targetHead - dataHead)); 34 | var range = new DataRange(byteOffset, targetLen); 35 | return new DataLocation(start, end, range); 36 | } 37 | 38 | public static DataLinePosition? GetLinePosition(byte* dataHead, int dataLen, byte* target) 39 | { 40 | if(dataLen < 0) { ThrowHelper.ThrowArgOutOfRange(nameof(dataLen)); } 41 | if(CheckContainsMemory(dataHead, dataLen, target, 0) == false) { 42 | return null; 43 | } 44 | return GetLinePositionPrivate(dataHead, dataLen, target); 45 | } 46 | 47 | private static DataLinePosition GetLinePositionPrivate(byte* dataHead, int dataLen, byte* target) 48 | { 49 | Debug.Assert(dataLen >= 0); 50 | Debug.Assert(dataHead <= target); 51 | 52 | int lineNum = 0; 53 | byte* lastLineHead = dataHead; 54 | for(byte* p = dataHead; p < target; p++) { 55 | if(*p == '\n') { 56 | lineNum++; 57 | lastLineHead = p + 1; 58 | } 59 | } 60 | int byteCountInLastLine = checked((int)(uint)(target - lastLineHead)); 61 | var utf8 = UTF8ExceptionFallbackEncoding.Instance; 62 | var pos = utf8.GetCharCount(lastLineHead, byteCountInLastLine); 63 | return new DataLinePosition(lineNum, pos); 64 | } 65 | 66 | private static bool CheckContainsMemory(byte* dataHead, int dataLen, byte* targetHead, int targetLen) 67 | { 68 | Debug.Assert(targetLen >= 0); 69 | Debug.Assert(dataLen >= 0); 70 | return (dataHead <= targetHead) && (targetHead + targetLen) <= (dataHead + dataLen); 71 | } 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/DataOffsetHelper.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fbd5c9e8d0193f84fb4415abd83d4e2a 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/EncodingExtension.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | 3 | #if UNITY_2018_1_OR_NEWER 4 | #define IS_UNITY 5 | #endif 6 | 7 | #if !(NETSTANDARD2_0 || NET48 || IS_UNITY) 8 | #define ENCODING_SPAN_API 9 | #endif 10 | 11 | 12 | #if !ENCODING_SPAN_API 13 | using System; 14 | using System.Text; 15 | 16 | namespace U8Xml.Internal 17 | { 18 | internal static class EncodingExtension 19 | { 20 | public static unsafe int GetByteCount(this Encoding encoding, ReadOnlySpan span) 21 | { 22 | fixed(char* ptr = span) { 23 | return encoding.GetByteCount(ptr, span.Length); 24 | } 25 | } 26 | } 27 | } 28 | #endif // ENCODING_SPAN_API 29 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/EncodingExtension.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6b00765bedd1f4f4bbfac6cf73eeb159 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/IXmlObject.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | 4 | namespace U8Xml.Internal 5 | { 6 | internal interface IXmlObject : IDisposable 7 | { 8 | bool IsDisposed { get; } 9 | XmlNode Root { get; } 10 | Option Declaration { get; } 11 | Option DocumentType { get; } 12 | XmlEntityTable EntityTable { get; } 13 | RawString AsRawString(); 14 | RawString AsRawString(int start); 15 | RawString AsRawString(int start, int length); 16 | RawString AsRawString(DataRange range); 17 | 18 | AllNodeList GetAllNodes(); 19 | AllNodeList GetAllNodes(XmlNodeType? targetType); 20 | 21 | DataLocation GetLocation(XmlNode node); 22 | DataLocation GetLocation(XmlAttribute attr); 23 | DataLocation GetLocation(RawString str); 24 | DataLocation GetLocation(DataRange range); 25 | 26 | DataRange GetRange(XmlNode node); 27 | DataRange GetRange(XmlAttribute attr); 28 | DataRange GetRange(RawString str); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/IXmlObject.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9359032f80e955a489641cea191bf17b 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/NodeStack.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using System.Runtime.CompilerServices; 4 | using System.Runtime.InteropServices; 5 | using System.Diagnostics; 6 | 7 | namespace U8Xml.Internal 8 | { 9 | [DebuggerDisplay("NodeStack[{Count}]")] 10 | [DebuggerTypeProxy(typeof(NodeStackDebuggerTypeProxy))] 11 | internal unsafe struct NodeStack : IDisposable 12 | { 13 | private XmlNode_** _ptr; 14 | private int _capacity; 15 | private int _count; 16 | 17 | public int Capacity => _capacity; 18 | 19 | public int Count => _count; 20 | 21 | public NodeStack(int capacity) 22 | { 23 | Debug.Assert(capacity >= 0); 24 | _ptr = (XmlNode_**)Marshal.AllocHGlobal(capacity * sizeof(XmlNode_*)); 25 | AllocationSafety.Add(capacity * sizeof(XmlNode_*)); 26 | _capacity = capacity; 27 | _count = 0; 28 | } 29 | 30 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 31 | public void Push(XmlNode_* value) 32 | { 33 | if(_capacity == _count) { 34 | GrowUp(); 35 | } 36 | Debug.Assert(_capacity > _count); 37 | _ptr[_count] = value; 38 | _count++; 39 | } 40 | 41 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 42 | public XmlNode_* Pop() 43 | { 44 | if(_count == 0) { ThrowHelper.ThrowInvalidOperation("Stack has no items."); } 45 | _count--; 46 | return _ptr[_count]; 47 | } 48 | 49 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 50 | public XmlNode_* Peek() 51 | { 52 | if(_count == 0) { ThrowHelper.ThrowInvalidOperation("Stack has no items."); } 53 | return _ptr[_count - 1]; 54 | } 55 | 56 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 57 | public bool TryPeek(out XmlNode_* item) 58 | { 59 | if(_count == 0) { 60 | item = null; 61 | return false; 62 | } 63 | item = _ptr[_count - 1]; 64 | return true; 65 | } 66 | 67 | public void Dispose() 68 | { 69 | Marshal.FreeHGlobal((IntPtr)_ptr); 70 | AllocationSafety.Remove(_capacity * sizeof(XmlNode_*)); 71 | _capacity = 0; 72 | _count = 0; 73 | } 74 | 75 | [MethodImpl(MethodImplOptions.NoInlining)] // uncommon path, no inlining 76 | private void GrowUp() 77 | { 78 | var newCapacity = Math.Max(4, _capacity * 2); 79 | var ptr = (XmlNode_**)Marshal.AllocHGlobal(newCapacity * sizeof(XmlNode_*)); 80 | AllocationSafety.Add(newCapacity * sizeof(XmlNode_*)); 81 | try { 82 | SpanHelper.CreateSpan(_ptr, _count).CopyTo(SpanHelper.CreateSpan(ptr, newCapacity)); 83 | Marshal.FreeHGlobal((IntPtr)_ptr); 84 | AllocationSafety.Remove(_capacity * sizeof(XmlNode_*)); 85 | _ptr = ptr; 86 | _capacity = newCapacity; 87 | } 88 | catch { 89 | Marshal.FreeHGlobal((IntPtr)ptr); 90 | AllocationSafety.Remove(newCapacity * sizeof(XmlNode_*)); 91 | throw; 92 | } 93 | } 94 | 95 | 96 | private class NodeStackDebuggerTypeProxy 97 | { 98 | [DebuggerBrowsable(DebuggerBrowsableState.Never)] 99 | private NodeStack _entity; 100 | 101 | [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] 102 | public unsafe XmlNode_*[] Items 103 | { 104 | get 105 | { 106 | var array = new XmlNode_*[_entity.Count]; 107 | for(int i = 0; i < array.Length; i++) { 108 | array[i] = _entity._ptr[i]; 109 | } 110 | return array; 111 | } 112 | } 113 | 114 | public NodeStackDebuggerTypeProxy(NodeStack entity) 115 | { 116 | _entity = entity; 117 | } 118 | } 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/NodeStack.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e098653ee80931d44b89d575b7de216e 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/OptionalNodeList.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using System.Runtime.CompilerServices; 4 | using System.Runtime.InteropServices; 5 | 6 | namespace U8Xml.Internal 7 | { 8 | internal unsafe readonly struct OptionalNodeList : IDisposable, IReference 9 | { 10 | private readonly IntPtr _list; // OptionalNodeList_* 11 | 12 | public bool IsNull => _list == IntPtr.Zero; 13 | 14 | public XmlDeclaration_* Declaration => &((OptionalNodeList_*)_list)->Declaration; 15 | 16 | public XmlDocumentType_* DocumentType => &((OptionalNodeList_*)_list)->DocumentType; 17 | 18 | private OptionalNodeList(IntPtr list) 19 | { 20 | _list = list; 21 | } 22 | 23 | public static OptionalNodeList Create() 24 | { 25 | var ptr = (OptionalNodeList_*)Marshal.AllocHGlobal(sizeof(OptionalNodeList_)); 26 | AllocationSafety.Add(sizeof(OptionalNodeList_)); 27 | *ptr = default; 28 | return new OptionalNodeList((IntPtr)ptr); 29 | } 30 | 31 | public void Dispose() 32 | { 33 | Marshal.FreeHGlobal(_list); 34 | AllocationSafety.Remove(sizeof(OptionalNodeList_)); 35 | Unsafe.AsRef(_list) = IntPtr.Zero; 36 | } 37 | 38 | 39 | private struct OptionalNodeList_ 40 | { 41 | public XmlDeclaration_ Declaration; 42 | public XmlDocumentType_ DocumentType; 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/OptionalNodeList.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3138f6fd8a4bfb645b90e1c5c324131d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/PredefinedEntityTable.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | 4 | namespace U8Xml.Internal 5 | { 6 | internal static class PredefinedEntityTable 7 | { 8 | private static ReadOnlySpan EntityAMP => new byte[1] { (byte)'&' }; 9 | private static ReadOnlySpan EntityLT => new byte[1] { (byte)'<' }; 10 | private static ReadOnlySpan EntityGT => new byte[1] { (byte)'>' }; 11 | private static ReadOnlySpan EntityQUOT => new byte[1] { (byte)'"' }; 12 | private static ReadOnlySpan EntityAPOS => new byte[1] { (byte)'\'' }; 13 | 14 | public static unsafe bool TryGetPredefinedValue(in RawString alias, out ReadOnlySpan value) 15 | { 16 | if(alias.Length == 2) { 17 | if(alias.At(0) == 'l' && alias.At(1) == 't') { 18 | // < 19 | value = EntityLT; 20 | return true; 21 | } 22 | if(alias.At(0) == 'g' && alias.At(1) == 't') { 23 | // > 24 | value = EntityGT; 25 | return true; 26 | } 27 | } 28 | else if(alias.Length == 3) { 29 | if(alias.At(0) == 'a' && alias.At(1) == 'm' && alias.At(2) == 'p') { 30 | // & 31 | value = EntityAMP; 32 | return true; 33 | } 34 | } 35 | else if(alias.Length == 4) { 36 | if(alias.At(0) == 'q' && alias.At(1) == 'u' && alias.At(2) == 'o' && alias.At(3) == 't') { 37 | // " 38 | value = EntityQUOT; 39 | return true; 40 | } 41 | if(alias.At(0) == 'a' && alias.At(1) == 'p' && alias.At(2) == 'o' && alias.At(3) == 's') { 42 | // ' 43 | value = EntityAPOS; 44 | return true; 45 | } 46 | } 47 | 48 | value = default; 49 | return false; 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/PredefinedEntityTable.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2daed0ca7b46eae4bb27e830a30ac938 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/RawStringPairList.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using System.Diagnostics; 4 | using System.Runtime.CompilerServices; 5 | using System.Runtime.InteropServices; 6 | 7 | namespace U8Xml.Internal 8 | { 9 | // [NOTE] 10 | // - This list re-allocate and copy memory when capacity increases, the address of memories can be changed. 11 | 12 | [DebuggerDisplay("{DebugDisplay,nq}")] 13 | [DebuggerTypeProxy(typeof(RawStringPairListTypeProxy))] 14 | internal unsafe ref struct RawStringPairList 15 | { 16 | private Pair* _ptr; 17 | private int _capacity; 18 | private int _count; 19 | 20 | public int Count => _count; 21 | 22 | [DebuggerBrowsable(DebuggerBrowsableState.Never)] 23 | private string DebugDisplay => $"{nameof(RawStringPairList)} (Count={_count})"; 24 | 25 | public ref readonly Pair this[int index] 26 | { 27 | get 28 | { 29 | // Check index boundary only when DEBUG because this is internal. 30 | Debug.Assert((uint)index < (uint)_count); 31 | return ref _ptr[index]; 32 | } 33 | } 34 | 35 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 36 | public void Add(in RawString key, in RawString value) 37 | { 38 | if(_capacity <= _count) { 39 | Growup(); // no inlining, uncommon path 40 | } 41 | Debug.Assert(_capacity > _count); 42 | ref var p = ref _ptr[_count++]; 43 | p.Key = key; 44 | p.Value = value; 45 | } 46 | 47 | [MethodImpl(MethodImplOptions.NoInlining)] // no inlining, uncommon path 48 | private void Growup() 49 | { 50 | if(_capacity == 0) { 51 | const int InitialCapacity = 32; 52 | var size = InitialCapacity * sizeof(Pair); 53 | 54 | // It does not need to be cleared to zero. 55 | _ptr = (Pair*)Marshal.AllocHGlobal(size); 56 | AllocationSafety.Add(size); 57 | _capacity = InitialCapacity; 58 | _count = 0; 59 | } 60 | else { 61 | Debug.Assert(_capacity > 0); 62 | var newCapacity = _capacity * 2; 63 | var newSize = newCapacity * sizeof(Pair); 64 | var newPtr = (Pair*)Marshal.AllocHGlobal(newSize); 65 | AllocationSafety.Add(newSize); 66 | 67 | var sizeToCopy = _count * sizeof(Pair); 68 | Buffer.MemoryCopy(_ptr, newPtr, sizeToCopy, sizeToCopy); 69 | Marshal.FreeHGlobal((IntPtr)_ptr); 70 | AllocationSafety.Remove(_capacity * sizeof(Pair)); 71 | _capacity = newCapacity; 72 | _ptr = newPtr; 73 | } 74 | } 75 | 76 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 77 | public void Dispose() 78 | { 79 | Marshal.FreeHGlobal((IntPtr)_ptr); 80 | AllocationSafety.Remove(_capacity * sizeof(Pair)); 81 | _capacity = 0; 82 | _count = 0; 83 | } 84 | 85 | [DebuggerDisplay("Key={Key}, Value={Value}")] 86 | public struct Pair 87 | { 88 | public RawString Key; 89 | public RawString Value; 90 | } 91 | 92 | private class RawStringPairListTypeProxy 93 | { 94 | [DebuggerBrowsable(DebuggerBrowsableState.Never)] 95 | private Pair[] _items; 96 | 97 | [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] 98 | public Pair[] Items => _items; 99 | 100 | public RawStringPairListTypeProxy(RawStringPairList entity) 101 | { 102 | var items = new Pair[entity.Count]; 103 | for(int i = 0; i < items.Length; i++) { 104 | items[i] = entity[i]; 105 | } 106 | _items = items; 107 | } 108 | } 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/RawStringPairList.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 83270f91d3ba80f41aaa1be25e3b970a 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/RawStringTable.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4f14f38b8e643fe4eb5249e57106e1da 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/SkipLocalsInitCompatible.cs: -------------------------------------------------------------------------------- 1 | #if !NET5_0_OR_GREATER 2 | #nullable enable 3 | namespace System.Runtime.CompilerServices 4 | { 5 | [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Method | AttributeTargets.Module | AttributeTargets.Property | AttributeTargets.Struct, Inherited = false)] 6 | internal sealed class SkipLocalsInitAttribute : Attribute 7 | { 8 | } 9 | } 10 | #endif 11 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/SkipLocalsInitCompatible.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 632756180bb87844a974e3d4fa0637a0 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/SpanHelper.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | 3 | #if UNITY_2018_1_OR_NEWER 4 | #define IS_UNITY 5 | #endif 6 | 7 | #if NETSTANDARD2_0 || NET48 || IS_UNITY 8 | #define NO_SPAN_API 9 | #endif 10 | 11 | #if NETCOREAPP3_1_OR_GREATER 12 | #define FAST_SPAN 13 | #endif 14 | 15 | using System; 16 | using System.Text; 17 | using System.Runtime.CompilerServices; 18 | 19 | #if FAST_SPAN 20 | using System.Runtime.InteropServices; 21 | #endif 22 | 23 | namespace U8Xml.Internal 24 | { 25 | internal static class SpanHelper 26 | { 27 | public static string Utf8ToString(this ReadOnlySpan source) 28 | { 29 | #if NO_SPAN_API 30 | unsafe { fixed(byte* ptr = source) { return UTF8ExceptionFallbackEncoding.Instance.GetString(ptr, source.Length); } } 31 | #else 32 | return UTF8ExceptionFallbackEncoding.Instance.GetString(source); 33 | #endif 34 | } 35 | 36 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 37 | public static unsafe ReadOnlySpan CreateReadOnlySpan(void* ptr, int length) where T : unmanaged 38 | { 39 | #if FAST_SPAN 40 | return MemoryMarshal.CreateReadOnlySpan(ref Unsafe.AsRef(ptr), length); 41 | #else 42 | return new ReadOnlySpan(ptr, length); 43 | #endif 44 | } 45 | 46 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 47 | public static unsafe Span CreateSpan(void* ptr, int length) where T : unmanaged 48 | { 49 | #if FAST_SPAN 50 | return MemoryMarshal.CreateSpan(ref Unsafe.AsRef(ptr), length); 51 | #else 52 | return new Span(ptr, length); 53 | #endif 54 | } 55 | 56 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 57 | public static ref readonly byte At(this ReadOnlySpan span, int index) 58 | { 59 | #if FAST_SPAN 60 | #if DEBUG 61 | if((uint)index >= (uint)span.Length) { throw new IndexOutOfRangeException(); } 62 | #endif 63 | return ref Unsafe.Add(ref MemoryMarshal.GetReference(span), index); 64 | #else 65 | return ref span[index]; 66 | #endif 67 | } 68 | 69 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 70 | public static ref byte At(this Span span, int index) 71 | { 72 | #if FAST_SPAN 73 | #if DEBUG 74 | if((uint)index >= (uint)span.Length) { throw new IndexOutOfRangeException(); } 75 | #endif 76 | return ref Unsafe.Add(ref MemoryMarshal.GetReference(span), index); 77 | #else 78 | return ref span[index]; 79 | #endif 80 | } 81 | 82 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 83 | internal static ReadOnlySpan SliceUnsafe(this ReadOnlySpan span, int start, int length) 84 | { 85 | #if DEBUG 86 | if((uint)start > (uint)span.Length) { ThrowHelper.ThrowArgOutOfRange(nameof(start)); } 87 | if((uint)length > (uint)(span.Length - start)) { ThrowHelper.ThrowArgOutOfRange(nameof(length)); } 88 | #endif 89 | 90 | #if FAST_SPAN 91 | return MemoryMarshal.CreateReadOnlySpan(ref Unsafe.Add(ref MemoryMarshal.GetReference(span), start), length); 92 | #else 93 | return span.Slice(start, length); 94 | #endif 95 | } 96 | 97 | /// Trim invisible charactors. (whitespace, '\t', '\r', and '\n') 98 | /// trimmed string 99 | internal static ReadOnlySpan Trim(this ReadOnlySpan span) 100 | { 101 | return span.TrimStart().TrimEnd(); 102 | } 103 | 104 | /// Trim invisible charactors of start. (whitespace, '\t', '\r', and '\n') 105 | /// trimmed string 106 | internal static ReadOnlySpan TrimStart(this ReadOnlySpan span) 107 | { 108 | for(int i = 0; i < span.Length; i++) { 109 | ref readonly var p = ref span.At(i); 110 | if(p != ' ' && p != '\t' && p != '\r' && p != '\n') { 111 | return span.SliceUnsafe(i, span.Length - i); 112 | } 113 | } 114 | return ReadOnlySpan.Empty; 115 | } 116 | 117 | /// Trim invisible charactors of end. (whitespace, '\t', '\r' and '\n') 118 | /// trimmed string 119 | internal static ReadOnlySpan TrimEnd(this ReadOnlySpan span) 120 | { 121 | for(int i = span.Length - 1; i >= 0; i--) { 122 | ref readonly var p = ref span.At(i); 123 | if(p != ' ' && p != '\t' && p != '\r' && p != '\n') { 124 | return span.SliceUnsafe(0, i + 1); 125 | } 126 | } 127 | return span; 128 | } 129 | } 130 | } 131 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/SpanHelper.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cc249a921bf655342ac09244195c7569 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/StreamExtension.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | 3 | #if UNITY_2018_1_OR_NEWER 4 | #define IS_UNITY 5 | #endif 6 | 7 | #if !(NETSTANDARD2_0 || NET48 || IS_UNITY) 8 | #define STREAM_SPAN_API 9 | #endif 10 | 11 | #if !STREAM_SPAN_API 12 | using System.Buffers; 13 | #endif 14 | 15 | using System; 16 | using System.IO; 17 | 18 | namespace U8Xml.Internal 19 | { 20 | internal static class StreamExtension 21 | { 22 | public static unsafe (UnmanagedBuffer buffer, int length) ReadAllToUnmanaged(this Stream stream, int fileSizeHint) 23 | { 24 | int capacity = Math.Min(int.MaxValue, Math.Max(0, fileSizeHint)); // 0 <= capacity <= int.MaxValue 25 | 26 | #if STREAM_SPAN_API 27 | var buf = new UnmanagedBuffer(capacity); 28 | var length = 0; 29 | try { 30 | while(true) { 31 | const int LengthToRead = 4096; 32 | if(buf.Length < length + LengthToRead) { 33 | var tmp = new UnmanagedBuffer(checked(length + LengthToRead)); 34 | buf.AsSpan(0, length).CopyTo(tmp.AsSpan()); 35 | buf.Dispose(); 36 | buf = tmp; 37 | } 38 | var readlen = stream.Read(buf.AsSpan(length)); 39 | length += readlen; 40 | if(stream.CanSeek && stream.Position == stream.Length) { break; } 41 | if(readlen == 0) { break; } 42 | } 43 | return (buf, length); 44 | } 45 | catch { 46 | buf.Dispose(); 47 | throw; 48 | } 49 | #else 50 | const int LengthToRead = 4096; 51 | int bufSize = Math.Min(fileSizeHint, LengthToRead); 52 | var rentArray = ArrayPool.Shared.Rent(bufSize); 53 | 54 | var buf = new UnmanagedBuffer(fileSizeHint); 55 | var totalLen = 0; 56 | try { 57 | while(true) { 58 | var readlen = stream!.Read(rentArray, 0, bufSize); 59 | if(readlen == 0) { break; } 60 | 61 | if(buf.Length < totalLen + readlen) { 62 | ExtendBuffer(ref buf, totalLen); 63 | } 64 | rentArray.AsSpan(0, readlen).CopyTo(buf.AsSpan(totalLen)); 65 | totalLen += readlen; 66 | 67 | if(stream.CanSeek && stream.Position == stream.Length) { break; } 68 | } 69 | return (buf, totalLen); 70 | } 71 | catch { 72 | buf.Dispose(); 73 | throw; 74 | } 75 | finally { 76 | ArrayPool.Shared.Return(rentArray); 77 | } 78 | 79 | static void ExtendBuffer(ref UnmanagedBuffer buf, int currentUsedLen) 80 | { 81 | var newBufSize = buf.Length <= 0 ? 1024 : buf.Length * 2; 82 | var newBuf = new UnmanagedBuffer(newBufSize); 83 | try { 84 | buf.AsSpan(0, currentUsedLen).CopyTo(newBuf.AsSpan()); 85 | } 86 | catch { 87 | newBuf.Dispose(); 88 | throw; 89 | } 90 | buf.Dispose(); 91 | buf = newBuf; 92 | } 93 | #endif 94 | } 95 | } 96 | 97 | internal static class FileHelper 98 | { 99 | public static unsafe (UnmanagedBuffer buffer, int length) ReadFileToUnmanaged(string filePath) 100 | { 101 | #if NET6_0_OR_GREATER 102 | UnmanagedBuffer buffer = default; 103 | try { 104 | int length; 105 | using var handle = File.OpenHandle(filePath); 106 | var fileLength = RandomAccess.GetLength(handle); 107 | if(fileLength > int.MaxValue) { 108 | ThrowHelper.ThrowNotSupported("The file is too large to parse. The parser only supports the file whose size is less than 2GB."); 109 | } 110 | buffer = new UnmanagedBuffer((int)fileLength); 111 | length = RandomAccess.Read(handle, buffer.AsSpan(), 0); 112 | return (buffer, length); 113 | } 114 | catch { 115 | buffer.Dispose(); 116 | throw; 117 | } 118 | #else 119 | using(var stream = File.OpenRead(filePath)) { 120 | var fileLength = stream.Length; 121 | if(fileLength > int.MaxValue) { 122 | ThrowHelper.ThrowNotSupported("The file is too large to parse. The parser only supports the file whose size is less than 2GB."); 123 | } 124 | return stream.ReadAllToUnmanaged((int)fileLength); 125 | } 126 | #endif 127 | } 128 | } 129 | } 130 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/StreamExtension.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 236dc4363e83c9c4aa0d3bc05a5cc687 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/ThrowHelper.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | 3 | #if UNITY_2018_1_OR_NEWER 4 | #define IS_UNITY 5 | #endif 6 | 7 | #if !(NETSTANDARD2_0 || NET48) && !IS_UNITY 8 | #define CODE_ANALYTICS 9 | #endif 10 | 11 | using System; 12 | #if CODE_ANALYTICS 13 | using System.Diagnostics.CodeAnalysis; 14 | #endif 15 | 16 | 17 | namespace U8Xml.Internal 18 | { 19 | internal static class ThrowHelper 20 | { 21 | #if CODE_ANALYTICS 22 | [DoesNotReturn] 23 | #endif 24 | public static void ThrowNotSupported(string message) 25 | { 26 | throw new NotSupportedException(message); 27 | } 28 | 29 | #if CODE_ANALYTICS 30 | [DoesNotReturn] 31 | #endif 32 | public static void ThrowNullArg(string message) 33 | { 34 | throw new ArgumentNullException(message); 35 | } 36 | 37 | 38 | #if CODE_ANALYTICS 39 | [DoesNotReturn] 40 | #endif 41 | public static void ThrowFormatException(string? message = null) 42 | { 43 | throw new FormatException(message); 44 | } 45 | 46 | #if CODE_ANALYTICS 47 | [DoesNotReturn] 48 | #endif 49 | public static void ThrowArgOutOfRange(string? message = null) 50 | { 51 | throw new ArgumentOutOfRangeException(message); 52 | } 53 | 54 | #if CODE_ANALYTICS 55 | [DoesNotReturn] 56 | #endif 57 | public static void ThrowArg(string? message = null) 58 | { 59 | throw new ArgumentException(message); 60 | } 61 | 62 | #if CODE_ANALYTICS 63 | [DoesNotReturn] 64 | #endif 65 | public static void ThrowInvalidOperation(string? message = null) 66 | { 67 | throw new InvalidOperationException(message); 68 | } 69 | 70 | #if CODE_ANALYTICS 71 | [DoesNotReturn] 72 | #endif 73 | public static void ThrowDisposed(string objectName) 74 | { 75 | throw new ObjectDisposedException(objectName); 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/ThrowHelper.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c67bfff535b8b4b44bda84029b3bfefd 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/UTF8ExceptionFallbackEncoding.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System.Text; 3 | 4 | namespace U8Xml.Internal 5 | { 6 | internal sealed class UTF8ExceptionFallbackEncoding : UTF8Encoding 7 | { 8 | public static UTF8ExceptionFallbackEncoding Instance { get; } = new UTF8ExceptionFallbackEncoding(); 9 | private UTF8ExceptionFallbackEncoding() : base(false, true) { } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/UTF8ExceptionFallbackEncoding.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0a46b099fe6a83a49905a532b2fa91a0 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/UnicodeHelper.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using System.Runtime.CompilerServices; 4 | 5 | namespace U8Xml.Internal 6 | { 7 | internal static class UnicodeHelper 8 | { 9 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 10 | public static bool TryEncodeCodePointToUtf8(uint codePoint, Span destination, out int bytesWritten) 11 | { 12 | #if NETCOREAPP3_1_OR_GREATER 13 | return new System.Text.Rune(codePoint).TryEncodeToUtf8(destination, out bytesWritten); 14 | #else 15 | return TryEncodeToUtf8ForLegacyRuntime(codePoint, destination, out bytesWritten); 16 | #endif 17 | } 18 | 19 | #if !NETCOREAPP3_1_OR_GREATER 20 | 21 | // The following implementation is copied from System.Text.Rune 22 | // 23 | // original source code 24 | // https://github.com/dotnet/runtime/blob/be19e1cc6aad0f28e3bf1d7c7201c455a96b3a9d/src/libraries/System.Private.CoreLib/src/System/Text/Rune.cs#L1061 25 | 26 | private static bool TryEncodeToUtf8ForLegacyRuntime(uint codePoint, Span destination, out int bytesWritten) 27 | { 28 | // The bit patterns below come from the Unicode Standard, Table 3-6. 29 | 30 | if(!destination.IsEmpty) { 31 | if(codePoint <= 0x7Fu) { 32 | destination[0] = (byte)codePoint; 33 | bytesWritten = 1; 34 | return true; 35 | } 36 | 37 | if(1 < (uint)destination.Length) { 38 | if((int)codePoint <= 0x7FFu) { 39 | // Scalar 00000yyy yyxxxxxx -> bytes [ 110yyyyy 10xxxxxx ] 40 | destination[0] = (byte)((codePoint + (0b110u << 11)) >> 6); 41 | destination[1] = (byte)((codePoint & 0x3Fu) + 0x80u); 42 | bytesWritten = 2; 43 | return true; 44 | } 45 | 46 | if(2 < (uint)destination.Length) { 47 | if((int)codePoint <= 0xFFFFu) { 48 | // Scalar zzzzyyyy yyxxxxxx -> bytes [ 1110zzzz 10yyyyyy 10xxxxxx ] 49 | destination[0] = (byte)((codePoint + (0b1110 << 16)) >> 12); 50 | destination[1] = (byte)(((codePoint & (0x3Fu << 6)) >> 6) + 0x80u); 51 | destination[2] = (byte)((codePoint & 0x3Fu) + 0x80u); 52 | bytesWritten = 3; 53 | return true; 54 | } 55 | 56 | if(3 < (uint)destination.Length) { 57 | // Scalar 000uuuuu zzzzyyyy yyxxxxxx -> bytes [ 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx ] 58 | destination[0] = (byte)((codePoint + (0b11110 << 21)) >> 18); 59 | destination[1] = (byte)(((codePoint & (0x3Fu << 12)) >> 12) + 0x80u); 60 | destination[2] = (byte)(((codePoint & (0x3Fu << 6)) >> 6) + 0x80u); 61 | destination[3] = (byte)((codePoint & 0x3Fu) + 0x80u); 62 | bytesWritten = 4; 63 | return true; 64 | } 65 | } 66 | } 67 | } 68 | 69 | // Destination buffer not large enough 70 | 71 | bytesWritten = default; 72 | return false; 73 | } 74 | #endif 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/UnicodeHelper.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b360cb6179f93e04eafd9516a1728e3e 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/UnmanagedBuffer.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using System.Runtime.InteropServices; 4 | using System.Runtime.CompilerServices; 5 | using System.Diagnostics; 6 | 7 | namespace U8Xml.Internal 8 | { 9 | /// Unmanaged memory buffer of type 10 | [DebuggerTypeProxy(typeof(UnmanagedBufferDebuggerTypeProxy))] 11 | [DebuggerDisplay("byte[{Length}]")] 12 | internal unsafe readonly struct UnmanagedBuffer : IDisposable 13 | { 14 | private readonly IntPtr _ptr; // byte* 15 | private readonly int _length; 16 | 17 | public bool IsEmpty => _length == 0; 18 | 19 | public int Length => _length; 20 | 21 | public IntPtr Ptr => _ptr; 22 | 23 | public UnmanagedBuffer(int length) 24 | { 25 | if(length == 0) { 26 | this = default; 27 | return; 28 | } 29 | _ptr = Marshal.AllocHGlobal(length); 30 | AllocationSafety.Add(length); 31 | _length = length; 32 | } 33 | 34 | public UnmanagedBuffer(ReadOnlySpan source) 35 | { 36 | if(source.IsEmpty) { 37 | this = default; 38 | return; 39 | } 40 | _ptr = Marshal.AllocHGlobal(source.Length); 41 | AllocationSafety.Add(source.Length); 42 | _length = source.Length; 43 | source.CopyTo(SpanHelper.CreateSpan(_ptr.ToPointer(), _length)); 44 | } 45 | 46 | public void TransferMemoryOwnership(out IntPtr ptr, out int length) 47 | { 48 | ptr = _ptr; 49 | length = _length; 50 | Unsafe.AsRef(_ptr) = default; 51 | Unsafe.AsRef(_length) = 0; 52 | } 53 | 54 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 55 | public void Dispose() 56 | { 57 | Marshal.FreeHGlobal(_ptr); 58 | AllocationSafety.Remove(_length); 59 | Unsafe.AsRef(_ptr) = default; 60 | Unsafe.AsRef(_length) = 0; 61 | } 62 | 63 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 64 | public Span AsSpan() => SpanHelper.CreateSpan(_ptr.ToPointer(), _length); 65 | 66 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 67 | public Span AsSpan(int start) => AsSpan().Slice(start); // check boundary 68 | 69 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 70 | public Span AsSpan(int start, int length) => AsSpan().Slice(start, length); // check boundary 71 | 72 | 73 | 74 | private sealed class UnmanagedBufferDebuggerTypeProxy 75 | { 76 | [DebuggerBrowsable(DebuggerBrowsableState.Never)] 77 | private readonly UnmanagedBuffer _entity; 78 | 79 | [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] 80 | public byte[] Items => _entity.AsSpan().ToArray(); 81 | 82 | public UnmanagedBufferDebuggerTypeProxy(UnmanagedBuffer entity) 83 | { 84 | _entity = entity; 85 | } 86 | } 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/UnmanagedBuffer.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ba1a379101847cd479ed96410c6a4d4f 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/UnsafeHelper.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System.Runtime.CompilerServices; 3 | 4 | namespace U8Xml.Internal 5 | { 6 | internal static class UnsafeHelper 7 | { 8 | public static void SkipInit(out T value) 9 | { 10 | #if !NETCOREAPP3_1 11 | Unsafe.SkipInit(out value); 12 | #else 13 | value = default!; 14 | #endif 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/UnsafeHelper.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: da75a68723d5bf149aad886b29b16516 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/XXHash32.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | 3 | #if NETCOREAPP3_1_OR_GREATER 4 | #define FAST_SPAN 5 | #endif 6 | 7 | using System; 8 | using System.Diagnostics; 9 | using System.Runtime.CompilerServices; 10 | 11 | #if FAST_SPAN 12 | using System.Runtime.InteropServices; 13 | #endif 14 | 15 | namespace U8Xml.Internal 16 | { 17 | internal static unsafe class XXHash32 18 | { 19 | private static readonly uint _seed = (uint)DateTime.UtcNow.Ticks; 20 | 21 | private const uint Prime1 = 2654435761U; 22 | private const uint Prime2 = 2246822519U; 23 | private const uint Prime3 = 3266489917U; 24 | private const uint Prime4 = 668265263U; 25 | private const uint Prime5 = 374761393U; 26 | 27 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 28 | public static int ComputeHash(in T data) where T : unmanaged 29 | { 30 | #if FAST_SPAN 31 | var span = MemoryMarshal.CreateReadOnlySpan(ref Unsafe.As(ref Unsafe.AsRef(in data)), sizeof(T)); 32 | fixed(byte* p = span) { 33 | return ComputeHash(p, span.Length); 34 | } 35 | #else 36 | var localCopy = data; 37 | return ComputeHash((byte*)&localCopy, sizeof(T)); 38 | #endif 39 | } 40 | 41 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 42 | public static int ComputeHash(byte* data, int byteLength) 43 | { 44 | Debug.Assert(byteLength >= 0); 45 | 46 | if(byteLength == 0) { return 0; } 47 | if(byteLength < 16) { 48 | var acc = _seed + Prime5 + (uint)byteLength; 49 | return (int)ComputeHashShort(data, byteLength, acc); 50 | } 51 | else { 52 | return (int)ComputeHashFull(data, byteLength); 53 | } 54 | } 55 | 56 | private static uint ComputeHashShort(byte* data, int byteLength, uint acc) 57 | { 58 | Debug.Assert(byteLength < 16 && byteLength >= 0); 59 | 60 | var laneCount = Math.DivRem(byteLength, 4, out int mod4); 61 | if(laneCount == 1) { 62 | acc = AccumRemainingLane(acc, *(uint*)data); 63 | } 64 | else if(laneCount == 2) { 65 | acc = AccumRemainingLane(acc, *(uint*)data); 66 | acc = AccumRemainingLane(acc, *(uint*)(data + 4)); 67 | } 68 | else if(laneCount == 3) { 69 | acc = AccumRemainingLane(acc, *(uint*)data); 70 | acc = AccumRemainingLane(acc, *(uint*)(data + 4)); 71 | acc = AccumRemainingLane(acc, *(uint*)(data + 8)); 72 | } 73 | 74 | byte* bytes = data + 4 * laneCount; 75 | if(mod4 == 1) { 76 | acc = AccumByte(acc, bytes[0]); 77 | } 78 | else if(mod4 == 2) { 79 | acc = AccumByte(acc, bytes[0]); 80 | acc = AccumByte(acc, bytes[1]); 81 | } 82 | else if(mod4 == 3) { 83 | acc = AccumByte(acc, bytes[0]); 84 | acc = AccumByte(acc, bytes[1]); 85 | acc = AccumByte(acc, bytes[2]); 86 | } 87 | return MixFinal(acc); 88 | } 89 | 90 | private static uint ComputeHashFull(byte* data, int byteLength) 91 | { 92 | var blockCount = Math.DivRem(byteLength, 16, out int mod16); 93 | Initialize(out uint acc1, out uint acc2, out uint acc3, out uint acc4); 94 | for(int i = 0; i < blockCount; i++) { 95 | uint lane1 = *(uint*)(data + 16 * i); 96 | uint lane2 = *(uint*)(data + 16 * i + 4); 97 | uint lane3 = *(uint*)(data + 16 * i + 8); 98 | uint lane4 = *(uint*)(data + 16 * i + 12); 99 | acc1 = AccumBlockLane(acc1, lane1); 100 | acc2 = AccumBlockLane(acc2, lane2); 101 | acc3 = AccumBlockLane(acc3, lane3); 102 | acc4 = AccumBlockLane(acc4, lane4); 103 | } 104 | uint acc = MixState(acc1, acc2, acc3, acc4) + (uint)byteLength; 105 | return ComputeHashShort(data + byteLength - mod16, mod16, acc); 106 | } 107 | 108 | 109 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 110 | private static void Initialize(out uint v1, out uint v2, out uint v3, out uint v4) 111 | { 112 | v1 = _seed + Prime1 + Prime2; 113 | v2 = _seed + Prime2; 114 | v3 = _seed; 115 | v4 = _seed - Prime1; 116 | } 117 | 118 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 119 | private static uint AccumBlockLane(uint hash, uint lane) 120 | { 121 | return BitOperationHelper.RotateLeft(hash + lane * Prime2, 13) * Prime1; 122 | } 123 | 124 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 125 | private static uint AccumRemainingLane(uint hash, uint lane) 126 | { 127 | return BitOperationHelper.RotateLeft(hash + lane * Prime3, 17) * Prime4; 128 | } 129 | 130 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 131 | private static uint AccumByte(uint hash, byte b) 132 | { 133 | return BitOperationHelper.RotateLeft(hash + (uint)b * Prime5, 11) * Prime1; 134 | } 135 | 136 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 137 | private static uint MixState(uint v1, uint v2, uint v3, uint v4) 138 | { 139 | return BitOperationHelper.RotateLeft(v1, 1) + BitOperationHelper.RotateLeft(v2, 7) + BitOperationHelper.RotateLeft(v3, 12) + BitOperationHelper.RotateLeft(v4, 18); 140 | } 141 | 142 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 143 | private static uint MixFinal(uint hash) 144 | { 145 | hash ^= hash >> 15; 146 | hash *= Prime2; 147 | hash ^= hash >> 13; 148 | hash *= Prime3; 149 | hash ^= hash >> 16; 150 | return hash; 151 | } 152 | } 153 | } 154 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/XXHash32.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2bdf07b0c0f1eb646a5b03f0453e47e9 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/XmlObjectCore.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 14fc39f22e968884fa7c28428e2432ac 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/XmlnsHelper.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using System.Diagnostics; 4 | 5 | namespace U8Xml.Internal 6 | { 7 | internal static class XmlnsHelper 8 | { 9 | private const uint Bytes_xmln = (byte)'x' + ((byte)'m' << 8) + ((byte)'l' << 16) + ((byte)'n' << 24); 10 | private const uint Bytes_s_colon = (byte)'s' + ((byte)':' << 8); 11 | 12 | public unsafe static bool TryResolveNamespaceAlias(ReadOnlySpan nsName, XmlNode node, out RawString alias) 13 | { 14 | // xmlns:[alias]="[nsName]" 15 | // nsName -> alias 16 | 17 | var currentNode = node; 18 | while(true) { 19 | if(currentNode.HasXmlNamespaceAttr) { 20 | foreach(var attr in currentNode.Attributes) { 21 | var attrName = attr.Name; 22 | if((attrName.Length >= 5) && (*(uint*)attrName.GetPtr() == Bytes_xmln) 23 | && (attrName.At(4) == (byte)'s')) { 24 | if(attrName.Length == 5 && attr.Value == nsName) { 25 | // xmlns="[nsName]" 26 | return Validate(RawString.Empty, nsName, node, out alias); 27 | } 28 | else if(attrName.Length >= 7 && attrName[5] == (byte)':' && attr.Value == nsName) { 29 | // xmlns:[alias]="[nsName]" 30 | return Validate(attrName.Slice(6), nsName, node, out alias); 31 | } 32 | } 33 | } 34 | } 35 | if(currentNode.TryGetParent(out currentNode) == false) { 36 | alias = RawString.Empty; 37 | return false; 38 | } 39 | } 40 | 41 | static bool Validate(RawString aliasToValidate, ReadOnlySpan nsName, XmlNode targetNode, out RawString alias) 42 | { 43 | if(TryFindXmlnsRecursively(targetNode, aliasToValidate.AsSpan(), out var nsn)) { 44 | if(nsn == nsName) { 45 | alias = aliasToValidate; 46 | return true; 47 | } 48 | else { 49 | alias = RawString.Empty; 50 | return false; 51 | } 52 | } 53 | else { 54 | Debug.Fail("Why are you getting here?"); 55 | alias = RawString.Empty; 56 | return false; 57 | } 58 | } 59 | } 60 | 61 | public unsafe static bool TryGetAttributeFullName(XmlAttribute attr, out RawString nsName, out RawString name) 62 | { 63 | RawString nsAlias; 64 | var attrName = attr.Name; 65 | if(attr.Node.TryGetValue(out var node) == false) { 66 | nsName = RawString.Empty; 67 | name = attr.Name; 68 | return false; 69 | } 70 | for(int i = 0; i < attrName.Length; i++) { 71 | if(attrName.At(i) == (byte)':') { 72 | nsAlias = attrName.SliceUnsafe(0, i); 73 | name = attrName.SliceUnsafe(i + 1, attrName.Length - i - 1); 74 | return TryFindXmlnsRecursively(node, nsAlias.AsSpan(), out nsName); 75 | } 76 | } 77 | name = attrName; 78 | return TryFindXmlnsRecursively(node, ReadOnlySpan.Empty, out nsName); 79 | } 80 | 81 | public unsafe static bool TryGetNodeFullName(XmlNode node, out RawString nsName, out RawString name) 82 | { 83 | RawString nsAlias; 84 | var nodeName = node.Name; 85 | for(int i = 0; i < nodeName.Length; i++) { 86 | if(nodeName.At(i) == (byte)':') { 87 | nsAlias = nodeName.SliceUnsafe(0, i); 88 | name = nodeName.SliceUnsafe(i + 1, nodeName.Length - i - 1); 89 | return TryFindXmlnsRecursively(node, nsAlias.AsSpan(), out nsName); 90 | } 91 | } 92 | name = nodeName; 93 | return TryFindXmlnsRecursively(node, ReadOnlySpan.Empty, out nsName); 94 | } 95 | 96 | private static bool TryFindXmlnsRecursively(XmlNode target, ReadOnlySpan alias, out RawString nsName) 97 | { 98 | // xmlns:[alias]="[nsName]" 99 | // alias -> nsName (recursive) 100 | 101 | var current = target; 102 | 103 | while(true) { 104 | if(TryFindXmlns(current, alias, out var nsn)) { 105 | nsName = nsn; 106 | return true; 107 | } 108 | 109 | if(current.TryGetParent(out current) == false) { 110 | nsName = RawString.Empty; 111 | return false; 112 | } 113 | } 114 | } 115 | 116 | private unsafe static bool TryFindXmlns(XmlNode target, ReadOnlySpan alias, out RawString nsName) 117 | { 118 | // xmlns:[alias]="[nsName]" 119 | // alias -> nsName (not recursive) 120 | 121 | if(alias.IsEmpty) { 122 | foreach(var attr in target.Attributes) { 123 | var attrName = attr.Name; 124 | if((attrName.Length == 5) && (*(uint*)attrName.GetPtr() == Bytes_xmln) 125 | && (attrName.At(4) == (byte)'s')) { 126 | nsName = attr.Value; 127 | return true; 128 | } 129 | } 130 | } 131 | else { 132 | foreach(var attr in target.Attributes) { 133 | var attrName = attr.Name; 134 | if((attrName.Length >= 7) && (*(uint*)attrName.GetPtr() == Bytes_xmln) 135 | && (*(ushort*)(attrName.GetPtr() + 4) == Bytes_s_colon) 136 | && attrName.Slice(6) == alias) { 137 | nsName = attr.Value; 138 | return true; 139 | } 140 | } 141 | } 142 | nsName = RawString.Empty; 143 | return false; 144 | } 145 | } 146 | } 147 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Internal/XmlnsHelper.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 409f9c954a13fe047b9f97719cc171a7 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Option.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Diagnostics; 5 | using System.Runtime.CompilerServices; 6 | using U8Xml.Internal; 7 | 8 | namespace U8Xml 9 | { 10 | /// A type that represents a value that may exist. 11 | /// type of the value 12 | [DebuggerDisplay("{ToString(),nq}")] 13 | public readonly struct Option : IEquatable> where T : unmanaged, IReference 14 | { 15 | private readonly T _v; 16 | 17 | /// Get empty instance of . 18 | public static Option Null => default; 19 | 20 | /// Create the instance of . 21 | /// original value 22 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 23 | public Option(in T v) 24 | { 25 | _v = v; 26 | } 27 | 28 | /// Get the value if exists, or it throws . 29 | public T Value 30 | { 31 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 32 | get 33 | { 34 | if(_v.IsNull) { ThrowHelper.ThrowInvalidOperation("No value exist."); } 35 | return _v; 36 | } 37 | } 38 | 39 | /// Get whether the value exists or not. 40 | public bool HasValue => _v.IsNull == false; 41 | 42 | /// Try to get a value if exists, or the method returns false. 43 | /// a value if exists. (Don't use it if the method returns false.) 44 | /// succeed or not 45 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 46 | public bool TryGetValue(out T value) 47 | { 48 | value = _v; 49 | return _v.IsNull == false; 50 | } 51 | 52 | /// 53 | public override string ToString() => _v.IsNull ? "null" : (_v.ToString() ?? ""); 54 | 55 | /// 56 | public override bool Equals(object? obj) => obj is Option option && Equals(option); 57 | 58 | /// Returns whether the value is same as the specified instance. 59 | /// an instance to check 60 | /// equal or not 61 | public bool Equals(Option other) => EqualityComparer.Default.Equals(_v, other._v); 62 | 63 | /// Returns whether the value is same as the specified instance. 64 | /// an instance to check 65 | /// equal or not 66 | public bool Equals(in T other) => EqualityComparer.Default.Equals(_v, other); 67 | 68 | /// 69 | public override int GetHashCode() => _v.GetHashCode(); 70 | 71 | /// implicit cast operation to 72 | /// a value to cast 73 | public static implicit operator Option(in T value) => new Option(value); 74 | } 75 | 76 | 77 | public interface IReference 78 | { 79 | public bool IsNull { get; } 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Option.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: caeda48964d0ec24b947645c31fc3a21 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/RawString.Conversion.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 387e96a48c4820c4695c96617eccbd01 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/RawString.Deprecated.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using System.ComponentModel; 4 | 5 | namespace U8Xml 6 | { 7 | partial struct RawString 8 | { 9 | /// Use instead. (The correct method name is Start**s**With) 10 | /// 11 | /// 12 | [Obsolete("Use RawString.StartsWith instead. (The method name is Start*s*With)")] 13 | [EditorBrowsable(EditorBrowsableState.Never)] 14 | public bool StartWith(RawString other) => StartsWith(other); 15 | 16 | /// Use instead. (The correct method name is Start**s**With) 17 | /// 18 | /// 19 | [Obsolete("Use RawString.StartsWith instead. (The method name is Start*s*With)")] 20 | [EditorBrowsable(EditorBrowsableState.Never)] 21 | public bool StartWith(ReadOnlySpan other) => StartsWith(other); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/RawString.Deprecated.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b57db09749c9db8448a36fcce6b5c226 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/RawString.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 32bcd11ec7187b941920abe5395319a3 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/SpanByteExtensions.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using System.Runtime.CompilerServices; 4 | 5 | namespace U8Xml 6 | { 7 | public static class SpanByteExtensions 8 | { 9 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 10 | public static Span Slice(this Span span, DataRange range) 11 | { 12 | return span.Slice(range.Start, range.Length); 13 | } 14 | 15 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 16 | public static ReadOnlySpan Slice(this ReadOnlySpan span, DataRange range) 17 | { 18 | return span.Slice(range.Start, range.Length); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/SpanByteExtensions.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a638df21bbfde404d925c807162fea37 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/SplitRawStrings.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using System.Runtime.CompilerServices; 4 | using System.Linq; 5 | using System.Collections.Generic; 6 | 7 | namespace U8Xml 8 | { 9 | public readonly ref struct SplitRawStrings 10 | { 11 | private readonly RawString _str; 12 | private readonly bool _isSeparatorSingleByte; 13 | private readonly byte _separator; 14 | private readonly ReadOnlySpan _spanSeparator; 15 | 16 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 17 | public SplitRawStrings(RawString str, byte separator) 18 | { 19 | _str = str; 20 | _isSeparatorSingleByte = true; 21 | _separator = separator; 22 | _spanSeparator = default; 23 | } 24 | 25 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 26 | public SplitRawStrings(RawString str, ReadOnlySpan separator) 27 | { 28 | _str = str; 29 | _isSeparatorSingleByte = false; 30 | _separator = default; 31 | _spanSeparator = separator; 32 | } 33 | 34 | public IEnumerable AsEnumerable() 35 | { 36 | var list = new List(); 37 | foreach(var s in this) { 38 | list.Add(s); 39 | } 40 | return list; 41 | } 42 | 43 | public RawString[] ToArray() 44 | { 45 | return AsEnumerable().ToArray(); 46 | } 47 | 48 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 49 | public Enumerator GetEnumerator() => _isSeparatorSingleByte ? new Enumerator(_str, _separator) : new Enumerator(_str, _spanSeparator); 50 | 51 | public ref struct Enumerator 52 | { 53 | private RawString _str; 54 | private RawString _current; 55 | private readonly bool _isSeparatorChar; 56 | private readonly byte _separatorChar; 57 | private readonly ReadOnlySpan _separatorStr; 58 | 59 | public RawString Current => _current; 60 | 61 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 62 | public Enumerator(RawString str, byte separator) 63 | { 64 | _str = str; 65 | _current = RawString.Empty; 66 | _isSeparatorChar = true; 67 | _separatorChar = separator; 68 | _separatorStr = default; 69 | } 70 | 71 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 72 | public Enumerator(RawString str, ReadOnlySpan separator) 73 | { 74 | _str = str; 75 | _current = RawString.Empty; 76 | _isSeparatorChar = false; 77 | _separatorChar = default; 78 | _separatorStr = separator; 79 | } 80 | 81 | public void Dispose() { } 82 | 83 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 84 | public bool MoveNext() 85 | { 86 | if(_str.IsEmpty) { 87 | return false; 88 | } 89 | if(_isSeparatorChar) { 90 | (_current, _str) = _str.Split2(_separatorChar); 91 | } 92 | else { 93 | (_current, _str) = _str.Split2(_separatorStr); 94 | } 95 | return true; 96 | } 97 | } 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/SplitRawStrings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 632a8f8f566456b43a2bef2fca61f1f7 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Unsafes.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6d6fd4c9e67b26247ab78dd81f52d9fd 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Unsafes/XmlObjectUnsafe.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using System.Runtime.CompilerServices; 4 | using System.Runtime.InteropServices; 5 | using System.Threading; 6 | using U8Xml.Internal; 7 | 8 | namespace U8Xml.Unsafes 9 | { 10 | /// 11 | /// [WARNING] DON'T use this if you don't know how to use. This method is hidden. 12 | /// *** Memory leaks happen if you use it in the wrong way. *** 13 | /// You MUST dispose after using it. It's compatible with 14 | /// 15 | public unsafe readonly struct XmlObjectUnsafe : IDisposable, IXmlObject 16 | { 17 | private readonly IntPtr _core; // XmlObjectCore* 18 | 19 | public bool IsDisposed => _core == IntPtr.Zero; 20 | 21 | private XmlObjectUnsafe(IntPtr core) 22 | { 23 | _core = core; 24 | } 25 | 26 | public XmlNode Root => ((XmlObjectCore*)_core)->Root; 27 | 28 | public Option Declaration => ((XmlObjectCore*)_core)->Declaration; 29 | 30 | public Option DocumentType => ((XmlObjectCore*)_core)->DocumentType; 31 | 32 | public XmlEntityTable EntityTable => ((XmlObjectCore*)_core)->EntityTable; 33 | 34 | public RawString AsRawString() => ((XmlObjectCore*)_core)->AsRawString(); 35 | 36 | public RawString AsRawString(int start) => ((XmlObjectCore*)_core)->AsRawString(start); 37 | 38 | public RawString AsRawString(int start, int length) => ((XmlObjectCore*)_core)->AsRawString(start, length); 39 | 40 | public RawString AsRawString(DataRange range) => ((XmlObjectCore*)_core)->AsRawString(range); 41 | 42 | public void Dispose() 43 | { 44 | var core = Interlocked.Exchange(ref Unsafe.AsRef(_core), IntPtr.Zero); 45 | if(core == IntPtr.Zero) { return; } 46 | ((XmlObjectCore*)core)->Dispose(); 47 | Marshal.FreeHGlobal(core); 48 | AllocationSafety.Remove(sizeof(XmlObjectCore)); 49 | } 50 | 51 | /// Get all nodes (target type is ) 52 | /// all element nodes 53 | public AllNodeList GetAllNodes() => ((XmlObjectCore*)_core)->GetAllNodes(); 54 | 55 | /// Get all nodes by specifying node type 56 | /// node type 57 | /// all nodes 58 | public AllNodeList GetAllNodes(XmlNodeType? targetType) => ((XmlObjectCore*)_core)->GetAllNodes(targetType); 59 | 60 | public DataLocation GetLocation(XmlNode node) => ((XmlObjectCore*)_core)->GetLocation(node); 61 | 62 | public DataLocation GetLocation(XmlAttribute attr) => ((XmlObjectCore*)_core)->GetLocation(attr); 63 | 64 | public DataLocation GetLocation(RawString str) => ((XmlObjectCore*)_core)->GetLocation(str); 65 | 66 | public DataLocation GetLocation(DataRange range) => ((XmlObjectCore*)_core)->GetLocation(range); 67 | 68 | public DataRange GetRange(XmlNode node) => ((XmlObjectCore*)_core)->GetRange(node); 69 | 70 | public DataRange GetRange(XmlAttribute attr) => ((XmlObjectCore*)_core)->GetRange(attr); 71 | 72 | public DataRange GetRange(RawString str) => ((XmlObjectCore*)_core)->GetRange(str); 73 | 74 | public override string ToString() => AsRawString().ToString(); 75 | 76 | internal static XmlObjectUnsafe Create(in XmlObjectCore core) 77 | { 78 | var size = sizeof(XmlObjectCore); 79 | var ptr = Marshal.AllocHGlobal(size); 80 | AllocationSafety.Add(size); 81 | *((XmlObjectCore*)ptr) = core; 82 | return new XmlObjectUnsafe(ptr); 83 | } 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Unsafes/XmlObjectUnsafe.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 981064754b3cf7a46ac8d6257f09168d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Unsafes/XmlParserUnsafe.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using System.IO; 4 | using System.Text; 5 | using U8Xml.Internal; 6 | 7 | namespace U8Xml.Unsafes 8 | { 9 | /// 10 | /// [WARNING] DON'T use this if you don't know how to use. The class is hidden. 11 | /// *** Memory leaks happen if you use it in the wrong way. *** 12 | /// The object returned from the methods MUST BE disposed after you use it. 13 | /// 14 | public static class XmlParserUnsafe 15 | { 16 | /// 17 | /// [WARNING] DON'T use this if you don't know how to use. The method is hidden. 18 | /// *** Memory leaks happen if you use it in the wrong way. *** 19 | /// The object returned from the method MUST BE disposed after you use it. 20 | /// 21 | /// utf-8 string to parse 22 | /// xml object 23 | public static XmlObjectUnsafe ParseUnsafe(ReadOnlySpan utf8Text) 24 | { 25 | var buf = new UnmanagedBuffer(utf8Text); 26 | try { 27 | return XmlObjectUnsafe.Create(XmlParser.ParseCore(ref buf, utf8Text.Length)); 28 | } 29 | catch { 30 | buf.Dispose(); 31 | throw; 32 | } 33 | } 34 | 35 | /// 36 | /// [WARNING] DON'T use this if you don't know how to use. The method is hidden. 37 | /// *** Memory leaks happen if you use it in the wrong way. *** 38 | /// The object returned from the method MUST BE disposed after you use it. 39 | /// 40 | /// stream to parse 41 | /// xml object 42 | public static XmlObjectUnsafe ParseUnsafe(Stream stream) 43 | { 44 | var fileSizeHint = stream.CanSeek ? (int)stream.Length : 1024 * 1024; 45 | return ParseUnsafe(stream, fileSizeHint); 46 | } 47 | 48 | /// 49 | /// [WARNING] DON'T use this if you don't know how to use. The method is hidden. 50 | /// *** Memory leaks happen if you use it in the wrong way. *** 51 | /// The object returned from the method MUST BE disposed after you use it. 52 | /// 53 | /// stream to parse 54 | /// file size hint 55 | /// xml object 56 | public static XmlObjectUnsafe ParseUnsafe(Stream stream, int fileSizeHint) 57 | { 58 | if(stream is null) { ThrowHelper.ThrowNullArg(nameof(stream)); } 59 | var (buf, length) = stream!.ReadAllToUnmanaged(fileSizeHint); 60 | try { 61 | return XmlObjectUnsafe.Create(XmlParser.ParseCore(ref buf, length)); 62 | } 63 | catch { 64 | buf.Dispose(); 65 | throw; 66 | } 67 | } 68 | 69 | /// 70 | /// [WARNING] DON'T use this if you don't know how to use. The method is hidden. 71 | /// *** Memory leaks happen if you use it in the wrong way. *** 72 | /// The object returned from the method MUST BE disposed after you use it. 73 | /// 74 | /// file path to parse 75 | /// xml object 76 | public static XmlObjectUnsafe ParseFileUnsafe(string filePath) 77 | { 78 | return XmlObjectUnsafe.Create(XmlParser.ParseFileCore(filePath, Encoding.UTF8)); 79 | } 80 | 81 | /// 82 | /// [WARNING] DON'T use this if you don't know how to use. The method is hidden. 83 | /// *** Memory leaks happen if you use it in the wrong way. *** 84 | /// The object returned from the method MUST BE disposed after you use it. 85 | /// 86 | /// file path to parse 87 | /// encoding of the file 88 | /// xml object 89 | public static XmlObjectUnsafe ParseFileUnsafe(string filePath, Encoding encoding) 90 | { 91 | return XmlObjectUnsafe.Create(XmlParser.ParseFileCore(filePath, encoding)); 92 | } 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/Unsafes/XmlParserUnsafe.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 89b592c6d3775fc44a77002806917471 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/XmlAttribute.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 96dade303bf9597439a3e78981f1d900 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/XmlAttributeEnumerableExtension.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bdc7fa32d568d644fa0a070df09d5d64 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/XmlAttributeList.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Diagnostics; 5 | using System.Runtime.CompilerServices; 6 | using System.Collections; 7 | using U8Xml.Internal; 8 | using System.Runtime.InteropServices; 9 | 10 | namespace U8Xml 11 | { 12 | /// Provides list of 13 | [DebuggerDisplay("XmlAttribute[{Count}]")] 14 | [DebuggerTypeProxy(typeof(XmlAttributeListTypeProxy))] 15 | public unsafe readonly struct XmlAttributeList : IEnumerable, ICollection 16 | { 17 | private readonly IntPtr _node; // XmlNode_* 18 | 19 | private readonly int StartIndex => ((XmlNode_*)_node)->AttrIndex; 20 | private CustomList List => ((XmlNode_*)_node)->WholeAttrs; 21 | 22 | /// Get count of attributes 23 | public int Count => ((XmlNode_*)_node)->AttrCount; 24 | 25 | internal XmlNode Node => new XmlNode((XmlNode_*)_node); 26 | 27 | bool ICollection.IsReadOnly => true; 28 | 29 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 30 | internal XmlAttributeList(XmlNode_* node) 31 | { 32 | _node = (IntPtr)node; 33 | } 34 | 35 | public XmlAttribute First() 36 | { 37 | if(Count == 0) { ThrowHelper.ThrowInvalidOperation("Sequence contains no elements."); } 38 | return new XmlAttribute(List.At(StartIndex)); 39 | } 40 | 41 | public XmlAttribute First(Func predicate) 42 | { 43 | if(FirstOrDefault(predicate).TryGetValue(out var attr) == false) { 44 | ThrowHelper.ThrowInvalidOperation("Sequence contains no matching elements."); 45 | } 46 | return attr; 47 | } 48 | 49 | public Option FirstOrDefault() 50 | { 51 | return Count == 0 ? default : new XmlAttribute(List.At(StartIndex)); 52 | } 53 | 54 | public Option FirstOrDefault(Func predicate) 55 | { 56 | if(predicate is null) { ThrowHelper.ThrowNullArg(nameof(predicate)); } 57 | foreach(var attr in this) { 58 | if(predicate!(attr)) { 59 | return attr; 60 | } 61 | } 62 | return default; 63 | } 64 | 65 | void ICollection.Add(XmlAttribute item) => throw new NotSupportedException(); 66 | 67 | void ICollection.Clear() => throw new NotSupportedException(); 68 | 69 | bool ICollection.Contains(XmlAttribute item) => throw new NotSupportedException(); 70 | 71 | void ICollection.CopyTo(XmlAttribute[] array, int arrayIndex) => throw new NotSupportedException(); 72 | 73 | bool ICollection.Remove(XmlAttribute item) => throw new NotSupportedException(); 74 | 75 | internal void CopyTo(Span span) 76 | { 77 | // Only for debugger 78 | 79 | var dest = MemoryMarshal.Cast(span); 80 | fixed(IntPtr* buf = dest) { 81 | List.CopyItemsPointer((XmlAttribute_**)buf, dest.Length, StartIndex, Count); 82 | } 83 | } 84 | 85 | public Enumerator GetEnumerator() => new Enumerator(List.GetEnumerator(StartIndex, Count)); 86 | 87 | IEnumerator IEnumerable.GetEnumerator() => new EnumeratorClass(List.GetEnumerator(StartIndex, Count)); 88 | 89 | IEnumerator IEnumerable.GetEnumerator() => new EnumeratorClass(List.GetEnumerator(StartIndex, Count)); 90 | 91 | public struct Enumerator : IEnumerator 92 | { 93 | private CustomList.Enumerator _enumerator; // mutable object, don't make it readonly 94 | 95 | public XmlAttribute Current => new XmlAttribute(_enumerator.Current); 96 | 97 | object IEnumerator.Current => *_enumerator.Current; 98 | 99 | internal Enumerator(in CustomList.Enumerator enumerator) 100 | { 101 | _enumerator = enumerator; 102 | } 103 | 104 | public void Dispose() => _enumerator.Dispose(); 105 | 106 | public bool MoveNext() => _enumerator.MoveNext(); 107 | 108 | public void Reset() => _enumerator.Reset(); 109 | } 110 | 111 | private sealed class EnumeratorClass : IEnumerator 112 | { 113 | private CustomList.Enumerator _enumerator; // mutable object, don't make it readonly 114 | 115 | public XmlAttribute Current => new XmlAttribute(_enumerator.Current); 116 | 117 | object IEnumerator.Current => *_enumerator.Current; 118 | 119 | internal EnumeratorClass(in CustomList.Enumerator enumerator) 120 | { 121 | _enumerator = enumerator; 122 | } 123 | 124 | public void Dispose() => _enumerator.Dispose(); 125 | 126 | public bool MoveNext() => _enumerator.MoveNext(); 127 | 128 | public void Reset() => _enumerator.Reset(); 129 | } 130 | 131 | private class XmlAttributeListTypeProxy 132 | { 133 | [DebuggerBrowsable(DebuggerBrowsableState.Never)] 134 | private XmlAttributeList _entity; 135 | 136 | [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] 137 | public XmlAttribute[] Items 138 | { 139 | get 140 | { 141 | var array = new XmlAttribute[_entity.Count]; 142 | _entity.CopyTo(array); 143 | return array; 144 | } 145 | } 146 | 147 | public XmlAttributeListTypeProxy(XmlAttributeList entity) 148 | { 149 | _entity = entity; 150 | } 151 | } 152 | } 153 | } 154 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/XmlAttributeList.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a634eaa1aa6d1bf4c81ad8f292951e7b 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/XmlDeclaration.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using System.Diagnostics; 4 | using System.Runtime.CompilerServices; 5 | 6 | namespace U8Xml 7 | { 8 | [DebuggerDisplay("{ToString(),nq}")] 9 | public unsafe readonly struct XmlDeclaration : IEquatable, IReference 10 | { 11 | private readonly XmlDeclaration_* _declaration; 12 | 13 | public bool IsNull => _declaration == null; 14 | 15 | public Option Version => new XmlAttribute(_declaration->Version); 16 | public Option Encoding => new XmlAttribute(_declaration->Encoding); 17 | 18 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 19 | internal XmlDeclaration(XmlDeclaration_* declaration) 20 | { 21 | _declaration = declaration; 22 | } 23 | 24 | public RawString AsRawString() => _declaration != null ? _declaration->Body : RawString.Empty; 25 | 26 | public override bool Equals(object? obj) => obj is XmlDeclaration declaration && Equals(declaration); 27 | 28 | public bool Equals(XmlDeclaration other) => _declaration == other._declaration; 29 | 30 | public override int GetHashCode() => new IntPtr(_declaration).GetHashCode(); 31 | 32 | public override string ToString() => _declaration != null ? _declaration->Body.ToString() : ""; 33 | } 34 | 35 | internal unsafe struct XmlDeclaration_ 36 | { 37 | public RawString Body; 38 | public XmlAttribute_* Version; 39 | public XmlAttribute_* Encoding; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/XmlDeclaration.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bcd685e1e4c6b5f46bc5b14540df58f8 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/XmlDocumentType.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using System.Diagnostics; 4 | using System.Runtime.CompilerServices; 5 | 6 | namespace U8Xml 7 | { 8 | [DebuggerDisplay("{ToString(),nq}")] 9 | public unsafe readonly struct XmlDocumentType : IEquatable, IReference 10 | { 11 | private readonly XmlDocumentType_* _docType; 12 | 13 | public bool IsNull => _docType == null; 14 | 15 | public RawString Name => _docType->Name; 16 | 17 | public RawString InternalSubset => _docType->InternalSubset; 18 | 19 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 20 | internal XmlDocumentType(XmlDocumentType_* docType) 21 | { 22 | _docType = docType; 23 | } 24 | 25 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 26 | public RawString AsRawString() => _docType != null ? _docType->Body : RawString.Empty; 27 | 28 | public override bool Equals(object? obj) => obj is XmlDocumentType type && Equals(type); 29 | 30 | public bool Equals(XmlDocumentType other) => _docType == other._docType; 31 | 32 | public override int GetHashCode() => new IntPtr(_docType).GetHashCode(); 33 | 34 | public override string ToString() => AsRawString().ToString(); 35 | } 36 | 37 | internal unsafe struct XmlDocumentType_ 38 | { 39 | public RawString Body; 40 | public RawString Name; 41 | public RawString InternalSubset; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/XmlDocumentType.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 40301ccc1f503f14685109ed3c481cd1 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/XmlEntityTable.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 253ee32ece5849c459245deba7c32365 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/XmlNode.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 24e9d0e4c41025e46a22694ddc179048 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/XmlNodeDescendantList.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using System.Diagnostics; 5 | using System.Runtime.CompilerServices; 6 | using U8Xml.Internal; 7 | 8 | namespace U8Xml 9 | { 10 | [DebuggerDisplay("{DebuggerDisplay,nq}")] 11 | [DebuggerTypeProxy(typeof(XmlNodeDescendantListDebuggerTypeProxy))] 12 | public unsafe readonly struct XmlNodeDescendantList : IEnumerable 13 | { 14 | private readonly XmlNode_* _parent; 15 | private readonly XmlNodeType? _targetType; 16 | 17 | internal XmlNodeDescendantList(XmlNode_* parent, XmlNodeType? targetType) 18 | { 19 | Debug.Assert(parent != null); 20 | _parent = parent; 21 | _targetType = targetType; 22 | } 23 | 24 | [DebuggerBrowsable(DebuggerBrowsableState.Never)] 25 | private string DebuggerDisplay 26 | { 27 | get 28 | { 29 | int count = 0; 30 | foreach(var _ in this) { 31 | count++; 32 | } 33 | return $"XmlNode[{count}]"; 34 | } 35 | } 36 | 37 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 38 | public Enumerator GetEnumerator() => new Enumerator(_parent, _targetType); 39 | 40 | IEnumerator IEnumerable.GetEnumerator() => new EnumeratorClass(_parent, _targetType); 41 | 42 | IEnumerator IEnumerable.GetEnumerator() => new EnumeratorClass(_parent, _targetType); 43 | 44 | public struct Enumerator : IEnumerator 45 | { 46 | private CustomList.Enumerator _e; // Don't make it readonly. 47 | private readonly int _depth; 48 | private readonly XmlNodeType _targetType; 49 | private readonly bool _hasTargetType; 50 | 51 | public XmlNode Current => new XmlNode(_e.Current); 52 | 53 | object IEnumerator.Current => Current; 54 | 55 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 56 | internal Enumerator(XmlNode_* parent, XmlNodeType? targetType) 57 | { 58 | (_hasTargetType, _targetType) = targetType.HasValue switch 59 | { 60 | true => (true, targetType.Value), 61 | false => (false, default), 62 | }; 63 | 64 | var firstChild = parent->FirstChild; 65 | if(firstChild == null) { 66 | // default instance is valid. 67 | _e = default; 68 | _depth = default; 69 | } 70 | else { 71 | _e = parent->WholeNodes.GetEnumerator(firstChild->NodeIndex); 72 | _depth = parent->Depth; 73 | } 74 | } 75 | 76 | public void Dispose() => _e.Dispose(); 77 | 78 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 79 | public bool MoveNext() 80 | { 81 | MoveNext: 82 | if(_e.MoveNext() == false) { 83 | return false; 84 | } 85 | if(_e.Current->Depth <= _depth) { 86 | return false; 87 | } 88 | if(_hasTargetType == false || _e.Current->NodeType == _targetType) { 89 | return true; 90 | } 91 | goto MoveNext; 92 | } 93 | 94 | public void Reset() => _e.Reset(); 95 | } 96 | 97 | private sealed class EnumeratorClass : IEnumerator 98 | { 99 | private Enumerator _e; // Don't make it readonly. 100 | 101 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 102 | internal EnumeratorClass(XmlNode_* parent, XmlNodeType? targetType) 103 | { 104 | _e = new Enumerator(parent, targetType); 105 | } 106 | 107 | public XmlNode Current => _e.Current; 108 | 109 | object IEnumerator.Current => _e.Current; 110 | 111 | public void Dispose() => _e.Dispose(); 112 | 113 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 114 | public bool MoveNext() => _e.MoveNext(); 115 | 116 | public void Reset() => _e.Reset(); 117 | } 118 | 119 | internal sealed class XmlNodeDescendantListDebuggerTypeProxy 120 | { 121 | [DebuggerBrowsable(DebuggerBrowsableState.Never)] 122 | private readonly XmlNodeDescendantList _list; 123 | 124 | [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] 125 | public XmlNode[] Item => System.Linq.Enumerable.ToArray(_list); 126 | 127 | public XmlNodeDescendantListDebuggerTypeProxy(XmlNodeDescendantList list) 128 | { 129 | _list = list; 130 | } 131 | } 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/XmlNodeDescendantList.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 932607c081f698c47b1523386a46c731 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/XmlNodeEnumerableExtension.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 329019aa70221ba4d8baaef504a2e8d1 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/XmlNodeList.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Collections; 5 | using System.Runtime.CompilerServices; 6 | using System.Diagnostics; 7 | using U8Xml.Internal; 8 | 9 | namespace U8Xml 10 | { 11 | [DebuggerDisplay("{DebugDisplay,nq}")] 12 | [DebuggerTypeProxy(typeof(XmlNodeListTypeProxy))] 13 | public unsafe readonly struct XmlNodeList : IEnumerable, ICollection, IReference 14 | { 15 | private readonly XmlNode_* _parent; 16 | private readonly XmlNodeType? _targetType; 17 | 18 | internal Option Parent => new XmlNode(_parent); 19 | 20 | public bool IsNull => _parent == null; 21 | 22 | public bool IsEmpty => Count == 0; 23 | 24 | public int Count => _targetType switch 25 | { 26 | null => _parent->ChildCount, 27 | XmlNodeType.ElementNode => _parent->ChildElementCount, 28 | XmlNodeType.TextNode => _parent->ChildTextCount, 29 | _ => 0, 30 | }; 31 | 32 | [DebuggerBrowsable(DebuggerBrowsableState.Never)] 33 | private string DebugDisplay => _parent != null ? $"{nameof(XmlNode)}[{Count}]" : $"{nameof(XmlNode)} (invalid instance)"; 34 | 35 | bool ICollection.IsReadOnly => true; 36 | 37 | internal XmlNodeList(XmlNode_* parent, XmlNodeType? targetType) 38 | { 39 | _parent = parent; 40 | _targetType = targetType; 41 | } 42 | 43 | public XmlNode First() 44 | { 45 | if(FirstOrDefault().TryGetValue(out var node) == false) { 46 | ThrowHelper.ThrowInvalidOperation("Sequence contains no elements."); 47 | } 48 | return node; 49 | } 50 | 51 | public Option FirstOrDefault() 52 | { 53 | using var e = GetEnumerator(); 54 | if(e.MoveNext() == false) { 55 | return Option.Null; 56 | } 57 | return e.Current; 58 | } 59 | 60 | public XmlNode First(Func predicate) 61 | { 62 | if(FirstOrDefault(predicate).TryGetValue(out var node) == false) { 63 | ThrowHelper.ThrowInvalidOperation("Sequence contains no matching elements."); 64 | } 65 | return node; 66 | } 67 | 68 | public Option FirstOrDefault(Func predicate) 69 | { 70 | if(predicate is null) { ThrowHelper.ThrowNullArg(nameof(predicate)); } 71 | foreach(var node in this) { 72 | if(predicate!(node)) { 73 | return node; 74 | } 75 | } 76 | return Option.Null; 77 | } 78 | 79 | public Enumerator GetEnumerator() => new Enumerator(_parent, _targetType); 80 | 81 | IEnumerator IEnumerable.GetEnumerator() => new EnumeratorClass(_parent, _targetType); 82 | 83 | IEnumerator IEnumerable.GetEnumerator() => new EnumeratorClass(_parent, _targetType); 84 | 85 | void ICollection.Add(XmlNode item) => throw new NotSupportedException(); 86 | 87 | void ICollection.Clear() => throw new NotSupportedException(); 88 | 89 | bool ICollection.Contains(XmlNode item) => throw new NotSupportedException(); 90 | 91 | void ICollection.CopyTo(XmlNode[] array, int arrayIndex) => throw new NotSupportedException(); 92 | 93 | bool ICollection.Remove(XmlNode item) => throw new NotSupportedException(); 94 | 95 | public unsafe struct Enumerator : IEnumerator 96 | { 97 | private XmlNode_* _current; 98 | private XmlNode_* _next; 99 | private readonly XmlNodeType _targetType; 100 | private readonly bool _hasTargetType; 101 | 102 | internal Enumerator(XmlNode_* parent, XmlNodeType? targetType) 103 | { 104 | _next = parent->FirstChild; 105 | _current = null; 106 | (_targetType, _hasTargetType) = targetType.HasValue switch 107 | { 108 | true => (targetType.Value, true), 109 | false => (default, false), 110 | }; 111 | } 112 | 113 | public XmlNode Current => new XmlNode(_current); 114 | 115 | object IEnumerator.Current => Current; 116 | 117 | public void Dispose() { } // nop 118 | 119 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 120 | public bool MoveNext() 121 | { 122 | MoveNext: 123 | if(_next == null) { return false; } 124 | _current = _next; 125 | _next = _next->Sibling; 126 | 127 | if(_hasTargetType == false || _current->NodeType == _targetType) { 128 | return true; 129 | } 130 | 131 | goto MoveNext; 132 | } 133 | 134 | public void Reset() => throw new NotSupportedException("Reset() is not supported."); 135 | } 136 | 137 | private sealed class EnumeratorClass : IEnumerator 138 | { 139 | private Enumerator _enumerator; // mutable object, don't make it readonly. 140 | 141 | public XmlNode Current => _enumerator.Current; 142 | 143 | object IEnumerator.Current => Current; 144 | 145 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 146 | internal EnumeratorClass(XmlNode_* parent, XmlNodeType? targetType) 147 | { 148 | _enumerator = new Enumerator(parent, targetType); 149 | } 150 | 151 | public void Dispose() => _enumerator.Dispose(); 152 | 153 | public bool MoveNext() => _enumerator.MoveNext(); 154 | 155 | public void Reset() => _enumerator.Reset(); 156 | } 157 | 158 | private sealed class XmlNodeListTypeProxy 159 | { 160 | [DebuggerBrowsable(DebuggerBrowsableState.Never)] 161 | private XmlNodeList _entity; 162 | 163 | [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] 164 | public unsafe XmlNode[] Items => System.Linq.Enumerable.ToArray(_entity); 165 | 166 | public XmlNodeListTypeProxy(XmlNodeList entity) 167 | { 168 | _entity = entity; 169 | } 170 | } 171 | } 172 | } 173 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/XmlNodeList.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9d46ccfeac23f7a4b97dd1c32bc19d4d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/XmlObject.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using U8Xml.Internal; 4 | using System.Runtime.CompilerServices; 5 | 6 | namespace U8Xml 7 | { 8 | /// Xml structual object parsed from xml file. 9 | /// [CAUTION] DO NOT call any methods or properties except after calling . 10 | public unsafe sealed class XmlObject : IDisposable, IXmlObject 11 | { 12 | private readonly XmlObjectCore _core; 13 | 14 | /// Get whether the xml object is disposed or not. 15 | /// DO NOT call any other methods or properties if the property is false. 16 | public bool IsDisposed => _core.IsDisposed; 17 | 18 | /// Get th root node 19 | public XmlNode Root => _core.Root; 20 | 21 | /// Get xml declaration 22 | public Option Declaration => _core.Declaration; 23 | 24 | /// Get xml document type declaration 25 | public Option DocumentType => _core.DocumentType; 26 | 27 | /// Get xml entity table 28 | public XmlEntityTable EntityTable => _core.EntityTable; 29 | 30 | internal XmlObject(in XmlObjectCore core) 31 | { 32 | _core = core; 33 | } 34 | 35 | ~XmlObject() => _core.Dispose(); 36 | 37 | /// Dispose the xml object and release all memoriess it has. 38 | public void Dispose() 39 | { 40 | GC.SuppressFinalize(this); 41 | _core.Dispose(); 42 | } 43 | 44 | /// Get whole xml string as utf-8 bytes data. 45 | /// whole xml string 46 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 47 | public RawString AsRawString() => _core.AsRawString(); 48 | 49 | /// Get sliced xml string as utf-8 bytes data. 50 | /// start byte offset 51 | /// sliced xml string 52 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 53 | public RawString AsRawString(int start) => _core.AsRawString(start); 54 | 55 | /// Get sliced xml string as utf-8 bytes data. 56 | /// start byte offset 57 | /// byte length 58 | /// sliced xml string 59 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 60 | public RawString AsRawString(int start, int length) => _core.AsRawString(start, length); 61 | 62 | /// Get sliced xml string as utf-8 bytes data. 63 | /// data range 64 | /// sliced xml string 65 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 66 | public RawString AsRawString(DataRange range) => _core.AsRawString(range); 67 | 68 | /// Get all nodes (target type is ) 69 | /// all element nodes 70 | [MethodImpl(MethodImplOptions.AggressiveInlining)] 71 | public AllNodeList GetAllNodes() => _core.GetAllNodes(); 72 | 73 | /// Get all nodes by specifying node type 74 | /// node type 75 | /// all nodes 76 | public AllNodeList GetAllNodes(XmlNodeType? targetType) => _core.GetAllNodes(targetType); 77 | 78 | public DataLocation GetLocation(XmlNode node) => _core.GetLocation(node); 79 | 80 | public DataLocation GetLocation(XmlAttribute attr) => _core.GetLocation(attr); 81 | 82 | public DataLocation GetLocation(RawString str) => _core.GetLocation(str); 83 | 84 | public DataLocation GetLocation(DataRange range) => _core.GetLocation(range); 85 | 86 | public DataRange GetRange(XmlNode node) => _core.GetRange(node); 87 | 88 | public DataRange GetRange(XmlAttribute attr) => _core.GetRange(attr); 89 | 90 | public DataRange GetRange(RawString str) => _core.GetRange(str); 91 | 92 | public override string ToString() => AsRawString().ToString(); 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/XmlObject.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 76c7b54dcdd04434ab27847b2eb5af58 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Runtime/XmlParser.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f81cd223d7f733348b5b30dab93bd9d3 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Samples~/U8XmlParserSample.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0dfcc5866dc7ba34790d530b6e549c8e 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Samples~/U8XmlParserSample/Scripts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5d7e7d8a2ed57ab48b1d7898f2da715d 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Samples~/U8XmlParserSample/Scripts/U8XmlSample.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace U8Xml.Samples 4 | { 5 | public class U8XmlSample : MonoBehaviour 6 | { 7 | private const string SampleXml = @" 8 | 9 | 10 | 11 | The quick brown fox jumps over the lazy dog 12 | 13 | "; 14 | 15 | private void Start() 16 | { 17 | string rootNodeName; 18 | 19 | Debug.Log(SampleXml); 20 | using(var xml = XmlParser.Parse(SampleXml)) { 21 | 22 | var root = xml.Root; 23 | rootNodeName = root.Name.ToString(); 24 | 25 | if(root.TryGetFirstChild(out var node1)) { 26 | var attr = node1.FindAttribute("aaa"); 27 | string attrName = attr.Name.ToString(); 28 | int attrValue = attr.Value.ToInt32(); 29 | Debug.Log($"node1: {node1.Name}, [{attrName} = {attrValue}]"); 30 | } 31 | 32 | if(root.TryFindChild("baz", out var node2)) { 33 | Debug.Log(node2.InnerText); 34 | } 35 | } 36 | 37 | // [NOTE] 38 | // Don't use XmlObject, RawString, or any objects from XmlParser after Dispose(). 39 | // All thier memory are already released. 40 | // Evaluate them into int, float, string, etc... if you use after disposed. 41 | 42 | Debug.Log($"root node name: {rootNodeName}"); 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Samples~/U8XmlParserSample/Scripts/U8XmlSample.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e67af3d64724a38499644e4862e60322 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Samples~/U8XmlParserSample/U8Xml.U8XmlParserSample.asmdef: -------------------------------------------------------------------------------- 1 | { 2 | "name": "U8XmlParserSample", 3 | "rootNamespace": "U8Xml.Samples", 4 | "references": [ 5 | "GUID:99988bbb805cede47a3a6f22765caf54" 6 | ], 7 | "includePlatforms": [], 8 | "excludePlatforms": [], 9 | "allowUnsafeCode": false, 10 | "overrideReferences": false, 11 | "precompiledReferences": [], 12 | "autoReferenced": true, 13 | "defineConstraints": [], 14 | "versionDefines": [], 15 | "noEngineReferences": false 16 | } -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Samples~/U8XmlParserSample/U8Xml.U8XmlParserSample.asmdef.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d9fb1a9b866c8b9448dbf7561ff227bf 3 | AssemblyDefinitionImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/Samples~/U8XmlParserSample/U8XmlSampleScene.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9fc0d4010bbf28b4594072e72b8655ab 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/System.Buffers.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ikorin24/U8XmlParser/e3cd36118d4e770c09e6ab34f385718d2933403c/src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/System.Buffers.dll -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/System.Buffers.dll.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 36a3e1193da7b3c44bfaff844be9ca9e 3 | PluginImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | iconMap: {} 7 | executionOrder: {} 8 | defineConstraints: [] 9 | isPreloaded: 0 10 | isOverridable: 0 11 | isExplicitlyReferenced: 0 12 | validateReferences: 1 13 | platformData: 14 | - first: 15 | Any: 16 | second: 17 | enabled: 1 18 | settings: {} 19 | - first: 20 | Editor: Editor 21 | second: 22 | enabled: 0 23 | settings: 24 | DefaultValueInitialized: true 25 | - first: 26 | Windows Store Apps: WindowsStoreApps 27 | second: 28 | enabled: 0 29 | settings: 30 | CPU: AnyCPU 31 | userData: 32 | assetBundleName: 33 | assetBundleVariant: 34 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/System.Memory.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ikorin24/U8XmlParser/e3cd36118d4e770c09e6ab34f385718d2933403c/src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/System.Memory.dll -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/System.Memory.dll.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 442d388db3f2e5d478e97d77c021ae37 3 | PluginImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | iconMap: {} 7 | executionOrder: {} 8 | defineConstraints: [] 9 | isPreloaded: 0 10 | isOverridable: 0 11 | isExplicitlyReferenced: 0 12 | validateReferences: 1 13 | platformData: 14 | - first: 15 | Any: 16 | second: 17 | enabled: 1 18 | settings: {} 19 | - first: 20 | Editor: Editor 21 | second: 22 | enabled: 0 23 | settings: 24 | DefaultValueInitialized: true 25 | - first: 26 | Windows Store Apps: WindowsStoreApps 27 | second: 28 | enabled: 0 29 | settings: 30 | CPU: AnyCPU 31 | userData: 32 | assetBundleName: 33 | assetBundleVariant: 34 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/System.Runtime.CompilerServices.Unsafe.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ikorin24/U8XmlParser/e3cd36118d4e770c09e6ab34f385718d2933403c/src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/System.Runtime.CompilerServices.Unsafe.dll -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/System.Runtime.CompilerServices.Unsafe.dll.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3f20798a11696a84f8aea6a3e850b115 3 | PluginImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | iconMap: {} 7 | executionOrder: {} 8 | defineConstraints: [] 9 | isPreloaded: 0 10 | isOverridable: 0 11 | isExplicitlyReferenced: 0 12 | validateReferences: 1 13 | platformData: 14 | - first: 15 | Any: 16 | second: 17 | enabled: 1 18 | settings: {} 19 | - first: 20 | Editor: Editor 21 | second: 22 | enabled: 0 23 | settings: 24 | DefaultValueInitialized: true 25 | - first: 26 | Windows Store Apps: WindowsStoreApps 27 | second: 28 | enabled: 0 29 | settings: 30 | CPU: AnyCPU 31 | userData: 32 | assetBundleName: 33 | assetBundleVariant: 34 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/U8Xml.U8XmlParser.asmdef: -------------------------------------------------------------------------------- 1 | { 2 | "name": "U8XmlParser", 3 | "rootNamespace": "U8Xml", 4 | "references": [], 5 | "includePlatforms": [], 6 | "excludePlatforms": [], 7 | "allowUnsafeCode": true, 8 | "overrideReferences": true, 9 | "precompiledReferences": [ 10 | "System.Buffers.dll", 11 | "System.Memory.dll", 12 | "System.Runtime.CompilerServices.Unsafe.dll" 13 | ], 14 | "autoReferenced": true, 15 | "defineConstraints": [], 16 | "versionDefines": [], 17 | "noEngineReferences": true 18 | } -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/U8XmlParser/U8Xml.U8XmlParser.asmdef.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 99988bbb805cede47a3a6f22765caf54 3 | AssemblyDefinitionImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "com.ikorin24.u8xmlparser", 3 | "displayName": "U8XmlParser", 4 | "version": "1.6.1", 5 | "unity": "2020.3", 6 | "description": "Provides the fastest xml parser.", 7 | "keywords": [ "xml", "parser", "XmlParser", "U8XmlParser" ], 8 | "dependencies": {}, 9 | "author": { 10 | "name": "ikorin24", 11 | "email": "sunshinexxab@yahoo.co.jp" 12 | }, 13 | "samples": [ 14 | { 15 | "displayName": "U8XmlParserSample", 16 | "description": "Sample scene for U8XmlParser", 17 | "path": "U8XmlParser/Samples~/U8XmlParserSample" 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/Assets/Plugins/package.json.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 01500b4cb9a570746ba5fadf45f53b65 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/ProjectSettings/AudioManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!11 &1 4 | AudioManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Volume: 1 8 | Rolloff Scale: 1 9 | Doppler Factor: 1 10 | Default Speaker Mode: 2 11 | m_SampleRate: 0 12 | m_DSPBufferSize: 1024 13 | m_VirtualVoiceCount: 512 14 | m_RealVoiceCount: 32 15 | m_SpatializerPlugin: 16 | m_AmbisonicDecoderPlugin: 17 | m_DisableAudio: 0 18 | m_VirtualizeEffects: 1 19 | m_RequestedDSPBufferSize: 1024 20 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/ProjectSettings/ClusterInputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!236 &1 4 | ClusterInputManager: 5 | m_ObjectHideFlags: 0 6 | m_Inputs: [] 7 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/ProjectSettings/DynamicsManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!55 &1 4 | PhysicsManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 11 7 | m_Gravity: {x: 0, y: -9.81, z: 0} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_BounceThreshold: 2 10 | m_SleepThreshold: 0.005 11 | m_DefaultContactOffset: 0.01 12 | m_DefaultSolverIterations: 6 13 | m_DefaultSolverVelocityIterations: 1 14 | m_QueriesHitBackfaces: 0 15 | m_QueriesHitTriggers: 1 16 | m_EnableAdaptiveForce: 0 17 | m_ClothInterCollisionDistance: 0 18 | m_ClothInterCollisionStiffness: 0 19 | m_ContactsGeneration: 1 20 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 21 | m_AutoSimulation: 1 22 | m_AutoSyncTransforms: 0 23 | m_ReuseCollisionCallbacks: 1 24 | m_ClothInterCollisionSettingsToggle: 0 25 | m_ContactPairsMode: 0 26 | m_BroadphaseType: 0 27 | m_WorldBounds: 28 | m_Center: {x: 0, y: 0, z: 0} 29 | m_Extent: {x: 250, y: 250, z: 250} 30 | m_WorldSubdivisions: 8 31 | m_FrictionType: 0 32 | m_EnableEnhancedDeterminism: 0 33 | m_EnableUnifiedHeightmaps: 1 34 | m_DefaultMaxAngluarSpeed: 7 35 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/ProjectSettings/EditorBuildSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1045 &1 4 | EditorBuildSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Scenes: [] 8 | m_configObjects: {} 9 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/ProjectSettings/EditorSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!159 &1 4 | EditorSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 11 7 | m_ExternalVersionControlSupport: Visible Meta Files 8 | m_SerializationMode: 2 9 | m_LineEndingsForNewScripts: 0 10 | m_DefaultBehaviorMode: 0 11 | m_PrefabRegularEnvironment: {fileID: 0} 12 | m_PrefabUIEnvironment: {fileID: 0} 13 | m_SpritePackerMode: 0 14 | m_SpritePackerPaddingPower: 1 15 | m_EtcTextureCompressorBehavior: 1 16 | m_EtcTextureFastCompressor: 1 17 | m_EtcTextureNormalCompressor: 2 18 | m_EtcTextureBestCompressor: 4 19 | m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp;asmref 20 | m_ProjectGenerationRootNamespace: 21 | m_CollabEditorSettings: 22 | inProgressEnabled: 1 23 | m_EnableTextureStreamingInEditMode: 1 24 | m_EnableTextureStreamingInPlayMode: 1 25 | m_AsyncShaderCompilation: 1 26 | m_EnterPlayModeOptionsEnabled: 0 27 | m_EnterPlayModeOptions: 3 28 | m_ShowLightmapResolutionOverlay: 1 29 | m_UseLegacyProbeSampleCount: 0 30 | m_SerializeInlineMappingsOnOneLine: 1 -------------------------------------------------------------------------------- /src/U8XmlParserUnity/ProjectSettings/GraphicsSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!30 &1 4 | GraphicsSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 13 7 | m_Deferred: 8 | m_Mode: 1 9 | m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} 10 | m_DeferredReflections: 11 | m_Mode: 1 12 | m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} 13 | m_ScreenSpaceShadows: 14 | m_Mode: 1 15 | m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} 16 | m_LegacyDeferred: 17 | m_Mode: 1 18 | m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} 19 | m_DepthNormals: 20 | m_Mode: 1 21 | m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} 22 | m_MotionVectors: 23 | m_Mode: 1 24 | m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} 25 | m_LightHalo: 26 | m_Mode: 1 27 | m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} 28 | m_LensFlare: 29 | m_Mode: 1 30 | m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} 31 | m_AlwaysIncludedShaders: 32 | - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} 33 | - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} 34 | - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} 35 | - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} 36 | - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} 37 | - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} 38 | m_PreloadedShaders: [] 39 | m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, 40 | type: 0} 41 | m_CustomRenderPipeline: {fileID: 0} 42 | m_TransparencySortMode: 0 43 | m_TransparencySortAxis: {x: 0, y: 0, z: 1} 44 | m_DefaultRenderingPath: 1 45 | m_DefaultMobileRenderingPath: 1 46 | m_TierSettings: [] 47 | m_LightmapStripping: 0 48 | m_FogStripping: 0 49 | m_InstancingStripping: 0 50 | m_LightmapKeepPlain: 1 51 | m_LightmapKeepDirCombined: 1 52 | m_LightmapKeepDynamicPlain: 1 53 | m_LightmapKeepDynamicDirCombined: 1 54 | m_LightmapKeepShadowMask: 1 55 | m_LightmapKeepSubtractive: 1 56 | m_FogKeepLinear: 1 57 | m_FogKeepExp: 1 58 | m_FogKeepExp2: 1 59 | m_AlbedoSwatchInfos: [] 60 | m_LightsUseLinearIntensity: 0 61 | m_LightsUseColorTemperature: 0 62 | m_LogWhenShaderIsCompiled: 0 63 | m_AllowEnlightenSupportForUpgradedProject: 0 64 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/ProjectSettings/InputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!13 &1 4 | InputManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Axes: 8 | - serializedVersion: 3 9 | m_Name: Horizontal 10 | descriptiveName: 11 | descriptiveNegativeName: 12 | negativeButton: left 13 | positiveButton: right 14 | altNegativeButton: a 15 | altPositiveButton: d 16 | gravity: 3 17 | dead: 0.001 18 | sensitivity: 3 19 | snap: 1 20 | invert: 0 21 | type: 0 22 | axis: 0 23 | joyNum: 0 24 | - serializedVersion: 3 25 | m_Name: Vertical 26 | descriptiveName: 27 | descriptiveNegativeName: 28 | negativeButton: down 29 | positiveButton: up 30 | altNegativeButton: s 31 | altPositiveButton: w 32 | gravity: 3 33 | dead: 0.001 34 | sensitivity: 3 35 | snap: 1 36 | invert: 0 37 | type: 0 38 | axis: 0 39 | joyNum: 0 40 | - serializedVersion: 3 41 | m_Name: Fire1 42 | descriptiveName: 43 | descriptiveNegativeName: 44 | negativeButton: 45 | positiveButton: left ctrl 46 | altNegativeButton: 47 | altPositiveButton: mouse 0 48 | gravity: 1000 49 | dead: 0.001 50 | sensitivity: 1000 51 | snap: 0 52 | invert: 0 53 | type: 0 54 | axis: 0 55 | joyNum: 0 56 | - serializedVersion: 3 57 | m_Name: Fire2 58 | descriptiveName: 59 | descriptiveNegativeName: 60 | negativeButton: 61 | positiveButton: left alt 62 | altNegativeButton: 63 | altPositiveButton: mouse 1 64 | gravity: 1000 65 | dead: 0.001 66 | sensitivity: 1000 67 | snap: 0 68 | invert: 0 69 | type: 0 70 | axis: 0 71 | joyNum: 0 72 | - serializedVersion: 3 73 | m_Name: Fire3 74 | descriptiveName: 75 | descriptiveNegativeName: 76 | negativeButton: 77 | positiveButton: left shift 78 | altNegativeButton: 79 | altPositiveButton: mouse 2 80 | gravity: 1000 81 | dead: 0.001 82 | sensitivity: 1000 83 | snap: 0 84 | invert: 0 85 | type: 0 86 | axis: 0 87 | joyNum: 0 88 | - serializedVersion: 3 89 | m_Name: Jump 90 | descriptiveName: 91 | descriptiveNegativeName: 92 | negativeButton: 93 | positiveButton: space 94 | altNegativeButton: 95 | altPositiveButton: 96 | gravity: 1000 97 | dead: 0.001 98 | sensitivity: 1000 99 | snap: 0 100 | invert: 0 101 | type: 0 102 | axis: 0 103 | joyNum: 0 104 | - serializedVersion: 3 105 | m_Name: Mouse X 106 | descriptiveName: 107 | descriptiveNegativeName: 108 | negativeButton: 109 | positiveButton: 110 | altNegativeButton: 111 | altPositiveButton: 112 | gravity: 0 113 | dead: 0 114 | sensitivity: 0.1 115 | snap: 0 116 | invert: 0 117 | type: 1 118 | axis: 0 119 | joyNum: 0 120 | - serializedVersion: 3 121 | m_Name: Mouse Y 122 | descriptiveName: 123 | descriptiveNegativeName: 124 | negativeButton: 125 | positiveButton: 126 | altNegativeButton: 127 | altPositiveButton: 128 | gravity: 0 129 | dead: 0 130 | sensitivity: 0.1 131 | snap: 0 132 | invert: 0 133 | type: 1 134 | axis: 1 135 | joyNum: 0 136 | - serializedVersion: 3 137 | m_Name: Mouse ScrollWheel 138 | descriptiveName: 139 | descriptiveNegativeName: 140 | negativeButton: 141 | positiveButton: 142 | altNegativeButton: 143 | altPositiveButton: 144 | gravity: 0 145 | dead: 0 146 | sensitivity: 0.1 147 | snap: 0 148 | invert: 0 149 | type: 1 150 | axis: 2 151 | joyNum: 0 152 | - serializedVersion: 3 153 | m_Name: Horizontal 154 | descriptiveName: 155 | descriptiveNegativeName: 156 | negativeButton: 157 | positiveButton: 158 | altNegativeButton: 159 | altPositiveButton: 160 | gravity: 0 161 | dead: 0.19 162 | sensitivity: 1 163 | snap: 0 164 | invert: 0 165 | type: 2 166 | axis: 0 167 | joyNum: 0 168 | - serializedVersion: 3 169 | m_Name: Vertical 170 | descriptiveName: 171 | descriptiveNegativeName: 172 | negativeButton: 173 | positiveButton: 174 | altNegativeButton: 175 | altPositiveButton: 176 | gravity: 0 177 | dead: 0.19 178 | sensitivity: 1 179 | snap: 0 180 | invert: 1 181 | type: 2 182 | axis: 1 183 | joyNum: 0 184 | - serializedVersion: 3 185 | m_Name: Fire1 186 | descriptiveName: 187 | descriptiveNegativeName: 188 | negativeButton: 189 | positiveButton: joystick button 0 190 | altNegativeButton: 191 | altPositiveButton: 192 | gravity: 1000 193 | dead: 0.001 194 | sensitivity: 1000 195 | snap: 0 196 | invert: 0 197 | type: 0 198 | axis: 0 199 | joyNum: 0 200 | - serializedVersion: 3 201 | m_Name: Fire2 202 | descriptiveName: 203 | descriptiveNegativeName: 204 | negativeButton: 205 | positiveButton: joystick button 1 206 | altNegativeButton: 207 | altPositiveButton: 208 | gravity: 1000 209 | dead: 0.001 210 | sensitivity: 1000 211 | snap: 0 212 | invert: 0 213 | type: 0 214 | axis: 0 215 | joyNum: 0 216 | - serializedVersion: 3 217 | m_Name: Fire3 218 | descriptiveName: 219 | descriptiveNegativeName: 220 | negativeButton: 221 | positiveButton: joystick button 2 222 | altNegativeButton: 223 | altPositiveButton: 224 | gravity: 1000 225 | dead: 0.001 226 | sensitivity: 1000 227 | snap: 0 228 | invert: 0 229 | type: 0 230 | axis: 0 231 | joyNum: 0 232 | - serializedVersion: 3 233 | m_Name: Jump 234 | descriptiveName: 235 | descriptiveNegativeName: 236 | negativeButton: 237 | positiveButton: joystick button 3 238 | altNegativeButton: 239 | altPositiveButton: 240 | gravity: 1000 241 | dead: 0.001 242 | sensitivity: 1000 243 | snap: 0 244 | invert: 0 245 | type: 0 246 | axis: 0 247 | joyNum: 0 248 | - serializedVersion: 3 249 | m_Name: Submit 250 | descriptiveName: 251 | descriptiveNegativeName: 252 | negativeButton: 253 | positiveButton: return 254 | altNegativeButton: 255 | altPositiveButton: joystick button 0 256 | gravity: 1000 257 | dead: 0.001 258 | sensitivity: 1000 259 | snap: 0 260 | invert: 0 261 | type: 0 262 | axis: 0 263 | joyNum: 0 264 | - serializedVersion: 3 265 | m_Name: Submit 266 | descriptiveName: 267 | descriptiveNegativeName: 268 | negativeButton: 269 | positiveButton: enter 270 | altNegativeButton: 271 | altPositiveButton: space 272 | gravity: 1000 273 | dead: 0.001 274 | sensitivity: 1000 275 | snap: 0 276 | invert: 0 277 | type: 0 278 | axis: 0 279 | joyNum: 0 280 | - serializedVersion: 3 281 | m_Name: Cancel 282 | descriptiveName: 283 | descriptiveNegativeName: 284 | negativeButton: 285 | positiveButton: escape 286 | altNegativeButton: 287 | altPositiveButton: joystick button 1 288 | gravity: 1000 289 | dead: 0.001 290 | sensitivity: 1000 291 | snap: 0 292 | invert: 0 293 | type: 0 294 | axis: 0 295 | joyNum: 0 296 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/ProjectSettings/NavMeshAreas.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!126 &1 4 | NavMeshProjectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | areas: 8 | - name: Walkable 9 | cost: 1 10 | - name: Not Walkable 11 | cost: 1 12 | - name: Jump 13 | cost: 2 14 | - name: 15 | cost: 1 16 | - name: 17 | cost: 1 18 | - name: 19 | cost: 1 20 | - name: 21 | cost: 1 22 | - name: 23 | cost: 1 24 | - name: 25 | cost: 1 26 | - name: 27 | cost: 1 28 | - name: 29 | cost: 1 30 | - name: 31 | cost: 1 32 | - name: 33 | cost: 1 34 | - name: 35 | cost: 1 36 | - name: 37 | cost: 1 38 | - name: 39 | cost: 1 40 | - name: 41 | cost: 1 42 | - name: 43 | cost: 1 44 | - name: 45 | cost: 1 46 | - name: 47 | cost: 1 48 | - name: 49 | cost: 1 50 | - name: 51 | cost: 1 52 | - name: 53 | cost: 1 54 | - name: 55 | cost: 1 56 | - name: 57 | cost: 1 58 | - name: 59 | cost: 1 60 | - name: 61 | cost: 1 62 | - name: 63 | cost: 1 64 | - name: 65 | cost: 1 66 | - name: 67 | cost: 1 68 | - name: 69 | cost: 1 70 | - name: 71 | cost: 1 72 | m_LastAgentTypeID: -887442657 73 | m_Settings: 74 | - serializedVersion: 2 75 | agentTypeID: 0 76 | agentRadius: 0.5 77 | agentHeight: 2 78 | agentSlope: 45 79 | agentClimb: 0.75 80 | ledgeDropHeight: 0 81 | maxJumpAcrossDistance: 0 82 | minRegionArea: 2 83 | manualCellSize: 0 84 | cellSize: 0.16666667 85 | manualTileSize: 0 86 | tileSize: 256 87 | accuratePlacement: 0 88 | debug: 89 | m_Flags: 0 90 | m_SettingNames: 91 | - Humanoid 92 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/ProjectSettings/PackageManagerSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &1 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 61 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} 13 | m_Name: 14 | m_EditorClassIdentifier: 15 | m_EnablePreviewPackages: 0 16 | m_EnablePackageDependencies: 0 17 | m_AdvancedSettingsExpanded: 1 18 | m_ScopedRegistriesSettingsExpanded: 1 19 | oneTimeWarningShown: 0 20 | m_Registries: 21 | - m_Id: main 22 | m_Name: 23 | m_Url: https://packages.unity.com 24 | m_Scopes: [] 25 | m_IsDefault: 1 26 | m_Capabilities: 7 27 | m_UserSelectedRegistryName: 28 | m_UserAddingNewScopedRegistry: 0 29 | m_RegistryInfoDraft: 30 | m_ErrorMessage: 31 | m_Original: 32 | m_Id: 33 | m_Name: 34 | m_Url: 35 | m_Scopes: [] 36 | m_IsDefault: 0 37 | m_Capabilities: 0 38 | m_Modified: 0 39 | m_Name: 40 | m_Url: 41 | m_Scopes: 42 | - 43 | m_SelectedScopeIndex: 0 44 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/ProjectSettings/Physics2DSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!19 &1 4 | Physics2DSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 4 7 | m_Gravity: {x: 0, y: -9.81} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_VelocityIterations: 8 10 | m_PositionIterations: 3 11 | m_VelocityThreshold: 1 12 | m_MaxLinearCorrection: 0.2 13 | m_MaxAngularCorrection: 8 14 | m_MaxTranslationSpeed: 100 15 | m_MaxRotationSpeed: 360 16 | m_BaumgarteScale: 0.2 17 | m_BaumgarteTimeOfImpactScale: 0.75 18 | m_TimeToSleep: 0.5 19 | m_LinearSleepTolerance: 0.01 20 | m_AngularSleepTolerance: 2 21 | m_DefaultContactOffset: 0.01 22 | m_JobOptions: 23 | serializedVersion: 2 24 | useMultithreading: 0 25 | useConsistencySorting: 0 26 | m_InterpolationPosesPerJob: 100 27 | m_NewContactsPerJob: 30 28 | m_CollideContactsPerJob: 100 29 | m_ClearFlagsPerJob: 200 30 | m_ClearBodyForcesPerJob: 200 31 | m_SyncDiscreteFixturesPerJob: 50 32 | m_SyncContinuousFixturesPerJob: 50 33 | m_FindNearestContactsPerJob: 100 34 | m_UpdateTriggerContactsPerJob: 100 35 | m_IslandSolverCostThreshold: 100 36 | m_IslandSolverBodyCostScale: 1 37 | m_IslandSolverContactCostScale: 10 38 | m_IslandSolverJointCostScale: 10 39 | m_IslandSolverBodiesPerJob: 50 40 | m_IslandSolverContactsPerJob: 50 41 | m_AutoSimulation: 1 42 | m_QueriesHitTriggers: 1 43 | m_QueriesStartInColliders: 1 44 | m_CallbacksOnDisable: 1 45 | m_ReuseCollisionCallbacks: 1 46 | m_AutoSyncTransforms: 0 47 | m_AlwaysShowColliders: 0 48 | m_ShowColliderSleep: 1 49 | m_ShowColliderContacts: 0 50 | m_ShowColliderAABB: 0 51 | m_ContactArrowScale: 0.2 52 | m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} 53 | m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} 54 | m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} 55 | m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} 56 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 57 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/ProjectSettings/PresetManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1386491679 &1 4 | PresetManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_DefaultPresets: {} 8 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/ProjectSettings/ProjectVersion.txt: -------------------------------------------------------------------------------- 1 | m_EditorVersion: 2020.3.0f1 2 | m_EditorVersionWithRevision: 2020.3.0f1 (c7b5465681fb) 3 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/ProjectSettings/TagManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!78 &1 4 | TagManager: 5 | serializedVersion: 2 6 | tags: [] 7 | layers: 8 | - Default 9 | - TransparentFX 10 | - Ignore Raycast 11 | - 12 | - Water 13 | - UI 14 | - 15 | - 16 | - 17 | - 18 | - 19 | - 20 | - 21 | - 22 | - 23 | - 24 | - 25 | - 26 | - 27 | - 28 | - 29 | - 30 | - 31 | - 32 | - 33 | - 34 | - 35 | - 36 | - 37 | - 38 | - 39 | - 40 | m_SortingLayers: 41 | - name: Default 42 | uniqueID: 0 43 | locked: 0 44 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/ProjectSettings/TimeManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!5 &1 4 | TimeManager: 5 | m_ObjectHideFlags: 0 6 | Fixed Timestep: 0.02 7 | Maximum Allowed Timestep: 0.33333334 8 | m_TimeScale: 1 9 | Maximum Particle Timestep: 0.03 10 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/ProjectSettings/UnityConnectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!310 &1 4 | UnityConnectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 1 7 | m_Enabled: 0 8 | m_TestMode: 0 9 | m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events 10 | m_EventUrl: https://cdp.cloud.unity3d.com/v1/events 11 | m_ConfigUrl: https://config.uca.cloud.unity3d.com 12 | m_TestInitMode: 0 13 | CrashReportingSettings: 14 | m_EventUrl: https://perf-events.cloud.unity3d.com 15 | m_Enabled: 0 16 | m_LogBufferSize: 10 17 | m_CaptureEditorExceptions: 1 18 | UnityPurchasingSettings: 19 | m_Enabled: 0 20 | m_TestMode: 0 21 | UnityAnalyticsSettings: 22 | m_Enabled: 0 23 | m_TestMode: 0 24 | m_InitializeOnStartup: 1 25 | UnityAdsSettings: 26 | m_Enabled: 0 27 | m_InitializeOnStartup: 1 28 | m_TestMode: 0 29 | m_IosGameId: 30 | m_AndroidGameId: 31 | m_GameIds: {} 32 | m_GameId: 33 | PerformanceReportingSettings: 34 | m_Enabled: 0 35 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/ProjectSettings/VFXManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!937362698 &1 4 | VFXManager: 5 | m_ObjectHideFlags: 0 6 | m_IndirectShader: {fileID: 0} 7 | m_CopyBufferShader: {fileID: 0} 8 | m_SortShader: {fileID: 0} 9 | m_StripUpdateShader: {fileID: 0} 10 | m_RenderPipeSettingsPath: 11 | m_FixedTimeStep: 0.016666668 12 | m_MaxDeltaTime: 0.05 13 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/ProjectSettings/VersionControlSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!890905787 &1 4 | VersionControlSettings: 5 | m_ObjectHideFlags: 0 6 | m_Mode: Visible Meta Files 7 | m_CollabEditorSettings: 8 | inProgressEnabled: 1 9 | -------------------------------------------------------------------------------- /src/U8XmlParserUnity/ProjectSettings/XRSettings.asset: -------------------------------------------------------------------------------- 1 | { 2 | "m_SettingKeys": [ 3 | "VR Device Disabled", 4 | "VR Device User Alert" 5 | ], 6 | "m_SettingValues": [ 7 | "False", 8 | "False" 9 | ] 10 | } -------------------------------------------------------------------------------- /src/UnitTest/CommentTest.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using Xunit; 3 | using U8Xml; 4 | 5 | namespace UnitTest 6 | { 7 | public class CommentTest 8 | { 9 | [Fact] 10 | public void CommentAtEnd() 11 | { 12 | using var xml = XmlParser.Parse( 13 | @" 14 | "); 15 | Assert.Equal("foo", xml.Root.Name.ToString()); 16 | } 17 | 18 | [Fact] 19 | public void CommentAtHead() 20 | { 21 | using var xml = XmlParser.Parse( 22 | @" 23 | "); 24 | Assert.Equal("foo", xml.Root.Name.ToString()); 25 | } 26 | 27 | [Fact] 28 | public void CommentInNode() 29 | { 30 | using var xml = XmlParser.Parse( 31 | @" 32 | 33 | "); 34 | Assert.Equal("foo", xml.Root.Name.ToString()); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/UnitTest/Data.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using StringLiteral; 4 | 5 | namespace UnitTest 6 | { 7 | internal static partial class Data 8 | { 9 | [Utf8( 10 | @" 11 | 13 | 14 | 15 | 16 | 17 | ]> 18 | <あいうえお ほげ=""3""> 19 | <かきくけこ>さしすせそ 20 | 21 | A && -3 < B]]> 22 | 23 | ")] 24 | private static partial ReadOnlySpan Xml1(); 25 | public static ReadOnlySpan Sample1 => Xml1(); 26 | 27 | [Utf8( 28 | @" 29 | 30 | <きらら 出版社=""芳文社""> 31 | <まんがタイムきららMAX> 32 | <ご注文はうさぎですか? 作者=""Koi""> 33 | <ラビットハウス 種類=""カフェ""> 34 | <香風智乃 age=""13"" tall=""144""/> 35 | <保登心愛 age='15' tall='154'/> 36 | 37 | 38 | 39 | <まんがタイムきららキャラット> 40 | <まちカドまぞく 作者='伊藤いづも'> 41 | <多魔市> 42 | <吉田優子 愛称=""シャミ子"">これで勝ったと思うなよぉ 43 | <千代田桃 愛称=""モモ"">シャミ子が悪いんだよ 44 | 45 | 46 | 47 | ")] 48 | private static partial ReadOnlySpan Xml2(); 49 | public static ReadOnlySpan Sample2 => Xml2(); 50 | 51 | [Utf8(@"")] 52 | private static partial ReadOnlySpan ErrorXml1(); 53 | public static ReadOnlySpan ErrorSample1 => ErrorXml1(); 54 | 55 | [Utf8(@"")] 56 | private static partial ReadOnlySpan ErrorXml2(); 57 | public static ReadOnlySpan ErrorSample2 => ErrorXml2(); 58 | 59 | [Utf8(@"")] 60 | private static partial ReadOnlySpan ErrorXml3(); 61 | public static ReadOnlySpan ErrorSample3 => ErrorXml3(); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/UnitTest/DataLocationTest.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using U8Xml; 4 | using Xunit; 5 | 6 | namespace UnitTest 7 | { 8 | public class DataLocationTest 9 | { 10 | [Fact] 11 | public void RangeTest() 12 | { 13 | const string xmlString = 14 | @" 15 | foo 16 | あいう 17 | 18 | 19 | 20 | This is 21 | a multi 22 | line 23 | text 24 | "; 25 | using var xml = XmlParser.Parse(xmlString); 26 | 27 | // Range of nodes 28 | foreach(var node in xml.GetAllNodes(null)) { 29 | Assert.True(xml.AsRawString(xml.GetRange(node)).ReferenceEquals(node.AsRawString())); 30 | } 31 | 32 | // Range of attributes 33 | { 34 | var attr = xml.Root.FindAttribute("xyz"); 35 | var attrStr = attr.AsRawString(); 36 | Assert.True(xml.AsRawString(xml.GetRange(attr)).ReferenceEquals(attrStr)); 37 | Assert.Equal("xyz=\"321\"", attrStr.ToString()); 38 | } 39 | { 40 | var attr = xml.Root.FindChild("bbb").FindChild("ccc").FindAttribute("zzz"); 41 | var attrStr = attr.AsRawString(); 42 | Assert.True(xml.AsRawString(xml.GetRange(attr)).ReferenceEquals(attrStr)); 43 | Assert.Equal("zzz='98765'", attrStr.ToString()); 44 | } 45 | 46 | // Range of RawString 47 | { 48 | var str = xml.Root.FindChild("aaa").InnerText; 49 | Assert.True(xml.AsRawString(xml.GetRange(str)).ReferenceEquals(str)); 50 | Assert.Equal("あいう", str.ToString()); 51 | } 52 | { 53 | var str = xml.Root.FindChild("ddd").InnerText; 54 | Assert.True(xml.AsRawString(xml.GetRange(str)).ReferenceEquals(str)); 55 | Assert.Equal(@"This is 56 | a multi 57 | line 58 | text", str.ToString()); 59 | } 60 | } 61 | 62 | [Fact] 63 | public void LocationTest() 64 | { 65 | const string xmlString = 66 | @" 67 | foo 68 | あいう 69 | 70 | 71 | 72 | This is 73 | a multi 74 | line 75 | text 76 | "; 77 | 78 | using var xml = XmlParser.Parse(xmlString); 79 | 80 | var cases = new[] 81 | { 82 | ( 83 | // ... 84 | Node: xml.Root, 85 | Answer: (Start: new DataLinePosition(0, 0), End: new DataLinePosition(10, 7)) 86 | ), 87 | ( 88 | // foo --- 3 characters, 3 bytes 89 | Node: xml.Root.GetChildren(XmlNodeType.TextNode).First(), 90 | Answer: (Start: new DataLinePosition(1, 4), End: new DataLinePosition(1, 7)) 91 | ), 92 | ( 93 | // あいう --- 14 characters, 20 bytes 94 | Node: xml.Root.FindChild("aaa"), 95 | Answer: (Start: new DataLinePosition(2, 4), End: new DataLinePosition(2, 4 + 14)) 96 | ), 97 | ( 98 | // あいう --- 3 characters, 9 bytes 99 | Node: xml.Root.FindChild("aaa").GetChildren(XmlNodeType.TextNode).First(), 100 | Answer: (Start: new DataLinePosition(2, 9), End: new DataLinePosition(2, 9 + 3)) 101 | ), 102 | ( 103 | // ... 104 | Node: xml.Root.FindChild("ddd"), 105 | Answer: (Start: new DataLinePosition(6, 4), End: new DataLinePosition(9, 10)) 106 | ), 107 | }; 108 | 109 | { 110 | var (node, answer) = cases[0]; 111 | var location = xml.GetLocation(node); 112 | Assert.Equal(answer.Start, location.Start); 113 | Assert.Equal(answer.End, location.End); 114 | Assert.Equal(xml.GetRange(node), location.Range); 115 | Assert.Equal(node.AsRawString(), xml.AsRawString(location.Range)); 116 | } 117 | { 118 | var (node, answer) = cases[1]; 119 | var location = xml.GetLocation(node); 120 | Assert.Equal(answer.Start, location.Start); 121 | Assert.Equal(answer.End, location.End); 122 | Assert.Equal(xml.GetRange(node), location.Range); 123 | Assert.Equal(node.AsRawString(), xml.AsRawString(location.Range)); 124 | } 125 | { 126 | var (node, answer) = cases[2]; 127 | var location = xml.GetLocation(node); 128 | Assert.Equal(answer.Start, location.Start); 129 | Assert.Equal(answer.End, location.End); 130 | Assert.Equal(xml.GetRange(node), location.Range); 131 | Assert.Equal(node.AsRawString(), xml.AsRawString(location.Range)); 132 | } 133 | { 134 | var (node, answer) = cases[3]; 135 | var location = xml.GetLocation(node); 136 | Assert.Equal(answer.Start, location.Start); 137 | Assert.Equal(answer.End, location.End); 138 | Assert.Equal(xml.GetRange(node), location.Range); 139 | Assert.Equal(node.AsRawString(), xml.AsRawString(location.Range)); 140 | } 141 | { 142 | var (node, answer) = cases[4]; 143 | var location = xml.GetLocation(node); 144 | Assert.Equal(answer.Start, location.Start); 145 | Assert.Equal(answer.End, location.End); 146 | Assert.Equal(xml.GetRange(node), location.Range); 147 | Assert.Equal(node.AsRawString(), xml.AsRawString(location.Range)); 148 | } 149 | } 150 | 151 | [Fact] 152 | public unsafe void LocationOfEnd() 153 | { 154 | // 01234567 155 | // _ 156 | // | 157 | // `--> next character of the end 158 | // 159 | // No exceptions if call GetRange and GetLocation here. 160 | 161 | using var xml = XmlParser.Parse(""); 162 | 163 | var xmlRawString = xml.AsRawString(); 164 | var str = xmlRawString.Slice(7); 165 | 166 | // str is empty, str.Ptr is next character of the end 167 | Assert.Equal(0, str.Length); 168 | Assert.Equal(new IntPtr(xmlRawString.GetPtr() + 7), str.Ptr); 169 | 170 | var range = xml.GetRange(str); 171 | Assert.Equal(new DataRange(7, 0), range); 172 | 173 | var location = xml.GetLocation(str); 174 | Assert.Equal(new DataLinePosition(0, 7), location.Start); 175 | Assert.Equal(new DataLinePosition(0, 7), location.End); 176 | Assert.Equal(new DataRange(7, 0), location.Range); 177 | } 178 | } 179 | } 180 | -------------------------------------------------------------------------------- /src/UnitTest/DtdParseTest.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using Xunit; 4 | using U8Xml; 5 | 6 | namespace UnitTest 7 | { 8 | public class DtdParseTest 9 | { 10 | [Theory] 11 | [InlineData( 12 | @" 13 | 14 | 15 | ")] 16 | [InlineData("")] 17 | public void ExternalDtd_PUBLIC(string xmlString) 18 | { 19 | // No exceptions, but the external dtd is not read. 20 | 21 | using var xml = XmlParser.Parse(xmlString); 22 | Assert.True(xml.DocumentType.HasValue); 23 | var doctype = xml.DocumentType.Value; 24 | Assert.Equal("html", doctype.Name.ToString()); 25 | Assert.Equal("", doctype.InternalSubset.ToString()); 26 | Assert.False(doctype.AsRawString().IsEmpty); 27 | } 28 | 29 | [Theory] 30 | [InlineData( 31 | @" 32 | 33 | 34 | ")] 35 | [InlineData("")] 36 | public void ExternalDtd_SYSTEM(string xmlString) 37 | { 38 | // No exceptions, but the external dtd is not read. 39 | 40 | using var xml = XmlParser.Parse(xmlString); 41 | Assert.True(xml.DocumentType.HasValue); 42 | var doctype = xml.DocumentType.Value; 43 | Assert.Equal("data", doctype.Name.ToString()); 44 | Assert.Equal("", doctype.InternalSubset.ToString()); 45 | Assert.False(doctype.AsRawString().IsEmpty); 46 | } 47 | 48 | [Theory] 49 | [InlineData( 50 | @" 51 | 52 | 53 | ")] 54 | [InlineData("")] 55 | [InlineData("")] 56 | public void Dtd_InternalSubset(string xmlString) 57 | { 58 | using var xml = XmlParser.Parse(xmlString); 59 | Assert.True(xml.DocumentType.HasValue); 60 | var doctype = xml.DocumentType.Value; 61 | Assert.Equal("data", doctype.Name.ToString()); 62 | Assert.Equal("", doctype.InternalSubset.ToString()); 63 | Assert.False(doctype.AsRawString().IsEmpty); 64 | } 65 | 66 | [Theory] 67 | [InlineData( 68 | @" 69 | 71 | ]> 72 | &foo;")] 73 | public void Dtd_InternalSubset2(string xmlString) 74 | { 75 | using var xml = XmlParser.Parse(xmlString); 76 | Assert.True(xml.DocumentType.HasValue); 77 | var doctype = xml.DocumentType.Value; 78 | Assert.Equal("data", doctype.Name.ToString()); 79 | Assert.Equal(@"", doctype.InternalSubset.Trim().ToString()); 80 | Assert.False(doctype.AsRawString().IsEmpty); 81 | 82 | Assert.Equal("aaa", xml.EntityTable.ResolveToString(xml.Root.InnerText)); 83 | } 84 | 85 | [Theory] 86 | [InlineData( 87 | @" 88 | 90 | 91 | ]> 92 | &bar;")] 93 | public void Dtd_ExternalEntity(string xmlString) 94 | { 95 | // U8XmlParser does not throw an exception even if xml containing external entity references. 96 | // However, it does not read the external file. 97 | // Thus, we cannot resolve the entity. 98 | 99 | 100 | // No exceptions to parse xml 101 | using var xml = XmlParser.Parse(xmlString); 102 | Assert.True(xml.DocumentType.HasValue); 103 | var doctype = xml.DocumentType.Value; 104 | Assert.Equal("data", doctype.Name.ToString()); 105 | Assert.Equal(@" 106 | ", doctype.InternalSubset.Trim().ToString()); 107 | Assert.False(doctype.AsRawString().IsEmpty); 108 | 109 | 110 | var entities = xml.EntityTable; 111 | var data = xml.Root; 112 | 113 | // We can resolve the entity in the internal subset. 114 | Assert.Equal("aaa", entities.ResolveToString(data.FindAttribute("x").Value)); 115 | 116 | // External entity references can not be resolved. 117 | Assert.Equal(XmlEntityResolverState.CannotResolve, entities.CheckNeedToResolve(data.InnerText, out _)); 118 | Assert.Throws(() => entities.ResolveToString(data.InnerText)); 119 | } 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /src/UnitTest/FileParserTest.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using System.Text; 4 | using Xunit; 5 | using U8Xml; 6 | using U8Xml.Unsafes; 7 | 8 | namespace UnitTest 9 | { 10 | public class FileParserTest 11 | { 12 | [Theory] 13 | [InlineData(@"TestFiles/test_utf8.xml")] 14 | public void ParseFile(string filePath) 15 | { 16 | using(var xml = XmlParser.ParseFile(filePath)) { 17 | CheckFileContents(xml.Root); 18 | } 19 | } 20 | 21 | [Theory] 22 | [InlineData(@"TestFiles/test_utf8.xml", 0)] 23 | [InlineData(@"TestFiles/test_utf8_with_bom.xml", 1)] 24 | [InlineData(@"TestFiles/test_utf16_le.xml", 2)] 25 | [InlineData(@"TestFiles/test_utf16_be.xml", 3)] 26 | public void ParseFileWithEncoding(string filePath, int encodingNum) 27 | { 28 | var encoding = encodingNum switch 29 | { 30 | 0 => Encoding.UTF8, 31 | 1 => Encoding.UTF8, 32 | 2 => Encoding.Unicode, 33 | 3 => Encoding.BigEndianUnicode, 34 | _ => throw new NotImplementedException(), 35 | }; 36 | 37 | using(var xml = XmlParser.ParseFile(filePath, encoding)) { 38 | CheckFileContents(xml.Root); 39 | } 40 | } 41 | 42 | [Theory] 43 | [InlineData(@"TestFiles/test_utf8.xml")] 44 | public void ParseFileUnsafe(string filePath) 45 | { 46 | using(var xml = XmlParserUnsafe.ParseFileUnsafe(filePath)) { 47 | CheckFileContents(xml.Root); 48 | } 49 | } 50 | 51 | [Theory] 52 | [InlineData(@"TestFiles/test_utf8.xml", 0)] 53 | [InlineData(@"TestFiles/test_utf8_with_bom.xml", 1)] 54 | [InlineData(@"TestFiles/test_utf16_le.xml", 2)] 55 | [InlineData(@"TestFiles/test_utf16_be.xml", 3)] 56 | public void ParseFileUnsafeWithEncoding(string filePath, int encodingNum) 57 | { 58 | var encoding = encodingNum switch 59 | { 60 | 0 => Encoding.UTF8, 61 | 1 => Encoding.UTF8, 62 | 2 => Encoding.Unicode, 63 | 3 => Encoding.BigEndianUnicode, 64 | _ => throw new NotImplementedException(), 65 | }; 66 | 67 | using(var xml = XmlParserUnsafe.ParseFileUnsafe(filePath, encoding)) { 68 | CheckFileContents(xml.Root); 69 | } 70 | } 71 | 72 | private static void CheckFileContents(XmlNode root) 73 | { 74 | Assert.Equal("Sample", root.Name.ToString()); 75 | Assert.Equal("香風智乃", root.FindAttribute("TestString").Value.ToString()); 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/UnitTest/NodeInfo.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using U8Xml; 6 | 7 | namespace UnitTest 8 | { 9 | internal sealed class NodeInfo : IEquatable 10 | { 11 | public readonly string Name; 12 | public readonly string InnerText; 13 | public readonly ReadOnlyMemory<(string name, string value)> Attr; 14 | public readonly ReadOnlyMemory Children; 15 | 16 | public NodeInfo(XmlNode node) 17 | { 18 | Name = node.Name.ToString(); 19 | InnerText = node.InnerText.ToString(); 20 | Attr = node.Attributes.Select(attr => (attr.Name.ToString(), attr.Value.ToString())).ToArray(); 21 | Children = node.Children.Select(c => new NodeInfo(c)).ToArray(); 22 | } 23 | 24 | public NodeInfo(string name, string innerText, (string attrName, string attrValue)[]? attrs, params NodeInfo[]? children) 25 | { 26 | Name = name; 27 | InnerText = innerText; 28 | Attr = attrs; 29 | Children = children; 30 | } 31 | 32 | public override bool Equals(object? obj) => obj is NodeInfo info && Equals(info); 33 | 34 | public bool Equals(NodeInfo? other) 35 | { 36 | var result = other is not null && 37 | Name == other.Name && 38 | InnerText == other.InnerText; 39 | if(result == false) { return false; } 40 | 41 | if(Attr.Span.Length != other!.Attr.Span.Length) { return false; } 42 | var attr1 = Attr.Span; 43 | var attr2 = other.Attr.Span; 44 | for(int i = 0; i < attr1.Length; i++) { 45 | result &= attr1[i].Equals(attr2[i]); 46 | } 47 | if(result == false) { return false; } 48 | 49 | if(Children.Length != other!.Children.Length) { return false; } 50 | var span1 = Children.Span; 51 | var span2 = other.Children.Span; 52 | for(int i = 0; i < span1.Length; i++) { 53 | result &= span1[i].Equals(span2[i]); 54 | } 55 | return result; 56 | } 57 | 58 | public override int GetHashCode() => HashCode.Combine(Name, InnerText, Attr); 59 | } 60 | 61 | internal sealed class NodeInfoComparer : IEqualityComparer 62 | { 63 | public static readonly NodeInfoComparer Default = new NodeInfoComparer(); 64 | 65 | public bool Equals(NodeInfo? x, NodeInfo? y) => x is null ? y is null : x.Equals(y); 66 | 67 | public int GetHashCode(NodeInfo obj) => 1; // It's bad but legal. 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/UnitTest/NodeStringTest.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using Xunit; 3 | using U8Xml; 4 | 5 | namespace UnitTest 6 | { 7 | public class NodeStringTest 8 | { 9 | [Fact] 10 | public void NodeAsString() 11 | { 12 | const string XmlString = 13 | @" 14 | 15 | 16 | 17 | 18 | abc 19 | 20 | 21 | "; 22 | 23 | using var xml = XmlParser.Parse(XmlString); 24 | Assert.True(xml.AsRawString() == XmlString); 25 | 26 | var root = xml.Root; 27 | Assert.True(root.AsRawString() == 28 | @" 29 | 30 | 31 | 32 | abc 33 | 34 | 35 | "); 36 | 37 | var foo = xml.Root.FindChild("foo"); 38 | Assert.True(foo.AsRawString() == 39 | @" 40 | 41 | 42 | abc 43 | 44 | "); 45 | 46 | var bar1 = foo.FindChild("bar1"); 47 | Assert.True(bar1.AsRawString() == @""); 48 | 49 | var bar2 = foo.FindChild("bar2"); 50 | Assert.True(bar2.AsRawString() == 51 | @" 52 | abc 53 | "); 54 | 55 | var baz = bar2.FindChild("baz"); 56 | Assert.True(baz.AsRawString() == @"abc"); 57 | } 58 | 59 | [Fact] 60 | public void TextNodeAsString() 61 | { 62 | const string XmlString = @"abc"; 63 | 64 | using var xml = XmlParser.Parse(XmlString); 65 | var textNode = xml.Root.GetChildren(XmlNodeType.TextNode).First(); 66 | 67 | Assert.Equal(XmlNodeType.TextNode, textNode.NodeType); 68 | Assert.Equal("abc", textNode.InnerText.ToString()); 69 | Assert.Equal("abc", textNode.AsRawString().ToString()); 70 | } 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/UnitTest/ParseAttributeTest.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using Xunit; 4 | using U8Xml; 5 | 6 | namespace UnitTest 7 | { 8 | public class ParseAttributeTest 9 | { 10 | [Fact] 11 | public void ParseAttribute() 12 | { 13 | var xmlString = 14 | @" 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 26 | 28 | 31 | "; 32 | 33 | using var xml = XmlParser.Parse(xmlString); 34 | var root = xml.Root; 35 | 36 | ReadOnlySpan name_abc = stackalloc byte[3] { (byte)'a', (byte)'b', (byte)'c' }; 37 | ReadOnlySpan value_123 = stackalloc byte[3] { (byte)'1', (byte)'2', (byte)'3' }; 38 | 39 | foreach(var n in root.Children) { 40 | var (name, value) = n.FindAttribute(name_abc); 41 | Assert.True(value == value_123); 42 | Assert.True(name == name_abc); 43 | } 44 | } 45 | 46 | [Fact] 47 | public void ParseAttributeFail() 48 | { 49 | Assert.Throws(() => 50 | { 51 | using var xml = XmlParser.Parse(@""); 52 | }); 53 | 54 | Assert.Throws(() => 55 | { 56 | using var xml = XmlParser.Parse(@""); 57 | }); 58 | 59 | Assert.Throws(() => 60 | { 61 | using var xml = XmlParser.Parse(@""); 67 | }); 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/UnitTest/TestCases.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using System; 3 | using System.Linq; 4 | using System.IO; 5 | using U8Xml; 6 | using U8Xml.Unsafes; 7 | using System.Text; 8 | using System.Collections.Generic; 9 | using U8Xml.Internal; 10 | 11 | namespace UnitTest 12 | { 13 | internal static class TestCases 14 | { 15 | public static IEnumerable> GetTestCases(ReadOnlySpan xml) 16 | { 17 | var xmlBytes = xml.ToArray(); 18 | return new Func[] 19 | { 20 | // from ReadOnlySpan 21 | () => XmlParser.Parse(xmlBytes.ToArray()), 22 | // from string 23 | () => XmlParser.Parse(UTF8ExceptionFallbackEncoding.Instance.GetString(xmlBytes.ToArray())), 24 | // from ReadOnlySpan 25 | () => XmlParser.Parse(UTF8ExceptionFallbackEncoding.Instance.GetString(xmlBytes.ToArray()).AsSpan()), 26 | // from Stream 27 | () => XmlParser.Parse(new MemoryStream(xmlBytes.ToArray())), 28 | // from Stream, fileSizeHint 29 | () => 30 | { 31 | var ms = new MemoryStream(xmlBytes.ToArray()); 32 | return XmlParser.Parse(ms, (int)ms.Length); 33 | }, 34 | // from Stream, Encoding 35 | ReEncoding(xmlBytes.ToArray(), UTF8ExceptionFallbackEncoding.Instance), 36 | ReEncoding(xmlBytes.ToArray(), Encoding.Unicode), 37 | ReEncoding(xmlBytes.ToArray(), Encoding.BigEndianUnicode), 38 | ReEncoding(xmlBytes.ToArray(), Encoding.UTF32), 39 | }; 40 | } 41 | 42 | public static IEnumerable> GetUnsafeTestCases(ReadOnlySpan xml) 43 | { 44 | var xmlBytes = xml.ToArray(); 45 | return new Func[] 46 | { 47 | // from ReadOnlySpan 48 | () => XmlParserUnsafe.ParseUnsafe(xmlBytes.ToArray()), 49 | // from Stream 50 | () => XmlParserUnsafe.ParseUnsafe(new MemoryStream(xmlBytes.ToArray())), 51 | // from Stream, fileSizeHint 52 | () => 53 | { 54 | var ms = new MemoryStream(xmlBytes.ToArray()); 55 | return XmlParserUnsafe.ParseUnsafe(ms, (int)ms.Length); 56 | }, 57 | }; 58 | } 59 | 60 | private static Func ReEncoding(ReadOnlySpan xml, Encoding encoding) 61 | { 62 | var bytes = Encoding.Convert(UTF8ExceptionFallbackEncoding.Instance, encoding, xml.ToArray()); 63 | var ms = new MemoryStream(bytes); 64 | return () => XmlParser.Parse(ms, encoding); 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/UnitTest/TestFiles/test_utf16_be.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ikorin24/U8XmlParser/e3cd36118d4e770c09e6ab34f385718d2933403c/src/UnitTest/TestFiles/test_utf16_be.xml -------------------------------------------------------------------------------- /src/UnitTest/TestFiles/test_utf16_le.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ikorin24/U8XmlParser/e3cd36118d4e770c09e6ab34f385718d2933403c/src/UnitTest/TestFiles/test_utf16_le.xml -------------------------------------------------------------------------------- /src/UnitTest/TestFiles/test_utf8.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | sample data, id 0 5 | 6 | 7 | sample data, id 0 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/UnitTest/TestFiles/test_utf8_with_bom.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | sample data, id 0 5 | 6 | 7 | sample data, id 0 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/UnitTest/UnitTest.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0;net5.0;netcoreapp3.1;net48 5 | enable 6 | 9.0 7 | true 8 | false 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | runtime; build; native; contentfiles; analyzers; buildtransitive 18 | all 19 | 20 | 21 | runtime; build; native; contentfiles; analyzers; buildtransitive 22 | all 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | Always 37 | 38 | 39 | Always 40 | 41 | 42 | Always 43 | 44 | 45 | Always 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /src/UnitTest/XmlAttributesTest.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using Xunit; 3 | using U8Xml; 4 | 5 | namespace UnitTest 6 | { 7 | public class XmlAttributesTest 8 | { 9 | [Fact] 10 | public void CopyTo() 11 | { 12 | const string XmlString = 13 | @" 14 | 15 | 16 | "; 17 | 18 | using(var xml = XmlParser.Parse(XmlString)) { 19 | var root = xml.Root; 20 | var count = root.Attributes.Count; 21 | Assert.Equal(4, count); 22 | var copies = new XmlAttribute[count]; 23 | root.Attributes.CopyTo(copies); 24 | return; 25 | } 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/UnitTest/XmlDeclarationTest.cs: -------------------------------------------------------------------------------- 1 | #nullable enable 2 | using Xunit; 3 | using U8Xml; 4 | using System; 5 | 6 | namespace UnitTest 7 | { 8 | public class XmlDeclarationTest 9 | { 10 | [Fact] 11 | public void NoXmlDeclaration() 12 | { 13 | // No errors. 14 | const string XmlString = @""; 15 | using var xml = XmlParser.Parse(XmlString); 16 | } 17 | 18 | [Fact] 19 | public void ValidXmlDeclaration() 20 | { 21 | // No errors. 22 | const string XmlString = 23 | @" 24 | "; 25 | using var xml = XmlParser.Parse(XmlString); 26 | } 27 | 28 | [Fact] 29 | public void MultiXmlDeclaration() 30 | { 31 | const string XmlString = 32 | @" 33 | 34 | "; 35 | Assert.Throws(() => 36 | { 37 | using var xml = XmlParser.Parse(XmlString); 38 | }); 39 | } 40 | 41 | [Fact] 42 | public void InvalidPosition() 43 | { 44 | const string XmlString = 45 | @" 46 | "; 47 | Assert.Throws(() => 48 | { 49 | using var xml = XmlParser.Parse(XmlString); 50 | }); 51 | } 52 | } 53 | } 54 | --------------------------------------------------------------------------------