com.wallstop-studios.unity-helpers 2.0.0-rc81.7 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.config/dotnet-tools.json +10 -10
- package/.csharpierignore +1 -0
- package/.csharpierrc.json +3 -0
- package/.editorconfig +184 -184
- package/.gitattributes +87 -63
- package/.githooks/pre-commit +75 -0
- package/.githooks/pre-push +50 -0
- package/.github/dependabot.yml +32 -10
- package/.github/scripts/check-markdown-links.ps1 +77 -0
- package/.github/scripts/check_markdown_links.py +89 -0
- package/.github/scripts/check_markdown_url_encoding.py +74 -0
- package/.github/scripts/validate_markdown_links.py +194 -0
- package/.github/workflows/csharpier-autofix.yml +152 -0
- package/.github/workflows/format-on-demand.yml +305 -0
- package/.github/workflows/lint-doc-links.yml +30 -0
- package/.github/workflows/markdown-json.yml +45 -0
- package/.github/workflows/npm-publish.yml +75 -75
- package/.github/workflows/prettier-autofix.yml +195 -0
- package/.github/workflows/update-dotnet-tools.yml +80 -0
- package/.github/workflows/yaml-format-lint.yml +41 -0
- package/.lychee.toml +26 -0
- package/.markdownlint.json +21 -0
- package/.markdownlint.jsonc +21 -0
- package/.markdownlintignore +8 -0
- package/.pre-commit-config.yaml +47 -22
- package/.prettierignore +22 -0
- package/.prettierrc.json +20 -0
- package/.yamllint.yaml +31 -0
- package/AGENTS.md +56 -0
- package/{Third Party Notices.md.meta → AGENTS.md.meta} +7 -7
- package/CHANGELOG.md +11 -0
- package/CHANGELOG.md.meta +7 -7
- package/CONTRIBUTING.md +49 -0
- package/CONTRIBUTING.md.meta +7 -0
- package/DATA_STRUCTURES.md +324 -0
- package/DATA_STRUCTURES.md.meta +7 -0
- package/Docs/Images/attribute_resolution.svg +40 -0
- package/Docs/Images/attribute_resolution.svg.meta +7 -0
- package/Docs/Images/bitset.svg +47 -0
- package/Docs/Images/bitset.svg.meta +7 -0
- package/Docs/Images/concave_hull.svg +30 -0
- package/Docs/Images/concave_hull.svg.meta +7 -0
- package/Docs/Images/convex_hull.svg +29 -0
- package/Docs/Images/convex_hull.svg.meta +7 -0
- package/Docs/Images/cyclic_buffer.svg +37 -0
- package/Docs/Images/cyclic_buffer.svg.meta +7 -0
- package/Docs/Images/data_distribution_decision.svg +88 -0
- package/Docs/Images/data_distribution_decision.svg.meta +7 -0
- package/Docs/Images/deque.svg +64 -0
- package/Docs/Images/deque.svg.meta +7 -0
- package/Docs/Images/deque_queue.svg +107 -0
- package/Docs/Images/deque_queue.svg.meta +7 -0
- package/Docs/Images/disjoint_set.svg +47 -0
- package/Docs/Images/disjoint_set.svg.meta +7 -0
- package/Docs/Images/effects_pipeline.svg +59 -0
- package/Docs/Images/effects_pipeline.svg.meta +7 -0
- package/Docs/Images/geometry_edge_cases.svg +61 -0
- package/Docs/Images/geometry_edge_cases.svg.meta +7 -0
- package/Docs/Images/heap.svg +56 -0
- package/Docs/Images/heap.svg.meta +7 -0
- package/Docs/Images/kdtree_2d.svg +38 -0
- package/Docs/Images/kdtree_2d.svg.meta +7 -0
- package/Docs/Images/kdtree_3d.svg +83 -0
- package/Docs/Images/kdtree_3d.svg.meta +7 -0
- package/Docs/Images/octree_3d.svg +79 -0
- package/Docs/Images/octree_3d.svg.meta +7 -0
- package/Docs/Images/polyline_simplify.svg +18 -0
- package/Docs/Images/polyline_simplify.svg.meta +7 -0
- package/Docs/Images/quadtree_2d.svg +37 -0
- package/Docs/Images/quadtree_2d.svg.meta +7 -0
- package/Docs/Images/query_boundaries.svg +38 -0
- package/Docs/Images/query_boundaries.svg.meta +7 -0
- package/Docs/Images/random_generators.svg +105 -0
- package/Docs/Images/random_generators.svg.meta +7 -0
- package/Docs/Images/reflection_scan.svg +33 -0
- package/Docs/Images/reflection_scan.svg.meta +7 -0
- package/Docs/Images/relational_wiring.svg +75 -0
- package/Docs/Images/relational_wiring.svg.meta +7 -0
- package/Docs/Images/rtree_2d.svg +27 -0
- package/Docs/Images/rtree_2d.svg.meta +7 -0
- package/Docs/Images/rtree_3d.svg +79 -0
- package/Docs/Images/rtree_3d.svg.meta +7 -0
- package/Docs/Images/serialization_flow.svg +50 -0
- package/Docs/Images/serialization_flow.svg.meta +7 -0
- package/Docs/Images/singletons_lifecycle.svg +54 -0
- package/Docs/Images/singletons_lifecycle.svg.meta +7 -0
- package/Docs/Images/sparse_set.svg +54 -0
- package/Docs/Images/sparse_set.svg.meta +7 -0
- package/Docs/Images/trie.svg +55 -0
- package/Docs/Images/trie.svg.meta +7 -0
- package/Docs/Images.meta +8 -0
- package/Docs.meta +8 -0
- package/EDITOR_TOOLS_GUIDE.md +1980 -0
- package/EDITOR_TOOLS_GUIDE.md.meta +7 -0
- package/EFFECTS_SYSTEM.md +242 -0
- package/EFFECTS_SYSTEM.md.meta +7 -0
- package/EFFECTS_SYSTEM_TUTORIAL.md +467 -0
- package/EFFECTS_SYSTEM_TUTORIAL.md.meta +7 -0
- package/Editor/AnimationEventEditor.cs +1570 -874
- package/Editor/AnimationEventEditor.cs.meta +11 -11
- package/Editor/AssemblyInfo.cs +4 -0
- package/Editor/AssemblyInfo.cs.meta +3 -0
- package/Editor/AssetProcessors/SpriteLabelProcessor.cs +138 -111
- package/Editor/AssetProcessors/SpriteLabelProcessor.cs.meta +2 -2
- package/Editor/AssetProcessors.meta +2 -2
- package/Editor/Core/Helper/AnimationEventHelpers.cs +230 -0
- package/{Runtime/Core/DataStructure/ISpatialTree.cs.meta → Editor/Core/Helper/AnimationEventHelpers.cs.meta} +11 -11
- package/Editor/Core/Helper.meta +8 -0
- package/Editor/Core.meta +8 -0
- package/Editor/CustomDrawers/IntDropdownDrawer.cs +46 -46
- package/Editor/CustomDrawers/IntDropdownDrawer.cs.meta +2 -2
- package/Editor/CustomDrawers/StringInListeDrawer.cs +135 -135
- package/Editor/CustomDrawers/StringInListeDrawer.cs.meta +2 -2
- package/Editor/CustomDrawers/WShowIfPropertyDrawer.cs +105 -105
- package/Editor/CustomDrawers/WShowIfPropertyDrawer.cs.meta +2 -2
- package/Editor/CustomDrawers.meta +2 -2
- package/Editor/CustomEditors/MatchColliderToSpriteEditor.cs +32 -32
- package/Editor/CustomEditors/MatchColliderToSpriteEditor.cs.meta +2 -2
- package/Editor/CustomEditors/PersistentDirectoryGUI.cs +808 -799
- package/Editor/CustomEditors/PersistentDirectoryGUI.cs.meta +2 -2
- package/Editor/CustomEditors/PolygonCollider2DOptimizerEditor.cs +38 -40
- package/Editor/CustomEditors/PolygonCollider2DOptimizerEditor.cs.meta +2 -2
- package/Editor/CustomEditors/SourceFolderEntryDrawer.cs +685 -413
- package/Editor/CustomEditors/SourceFolderEntryDrawer.cs.meta +2 -2
- package/Editor/CustomEditors/TexturePlatformOverrideEntryDrawer.cs +155 -0
- package/{Runtime/Core/DataStructure/KDTree.cs.meta → Editor/CustomEditors/TexturePlatformOverrideEntryDrawer.cs.meta} +11 -11
- package/Editor/CustomEditors.meta +2 -2
- package/Editor/Extensions/SerializedPropertyExtensions.cs +217 -190
- package/Editor/Extensions/SerializedPropertyExtensions.cs.meta +2 -2
- package/Editor/Extensions/UnityExtensions.cs +50 -26
- package/Editor/Extensions/UnityExtensions.cs.meta +2 -2
- package/Editor/Extensions.meta +2 -2
- package/Editor/FitTextureSizeWindow.cs +809 -332
- package/Editor/FitTextureSizeWindow.cs.meta +2 -2
- package/Editor/Persistence/MultiFileSelectorPersistenceManager.cs +62 -0
- package/{Runtime/Core/DataStructure/QuadTree.cs.meta → Editor/Persistence/MultiFileSelectorPersistenceManager.cs.meta} +11 -11
- package/Editor/Persistence/MultiFileSelectorPersistenceWindow.cs +65 -0
- package/Editor/Persistence/MultiFileSelectorPersistenceWindow.cs.meta +11 -0
- package/Editor/Persistence.meta +8 -0
- package/Editor/PersistentDirectorySettings.cs +581 -248
- package/Editor/PersistentDirectorySettings.cs.meta +2 -2
- package/Editor/PrefabChecker.cs +1396 -741
- package/Editor/PrefabChecker.cs.meta +11 -11
- package/Editor/Sprites/AnimationCopier.cs +1594 -789
- package/Editor/Sprites/AnimationCopier.cs.meta +2 -2
- package/Editor/Sprites/AnimationCreator.cs +1573 -881
- package/Editor/Sprites/AnimationCreator.cs.meta +11 -11
- package/Editor/Sprites/AnimationViewerWindow.cs +1670 -1522
- package/Editor/Sprites/AnimationViewerWindow.cs.meta +2 -2
- package/Editor/Sprites/ScriptableSpriteAtlas.cs +251 -178
- package/Editor/Sprites/ScriptableSpriteAtlas.cs.meta +2 -2
- package/Editor/Sprites/ScriptableSpriteAtlasEditor.cs +1470 -1026
- package/Editor/Sprites/ScriptableSpriteAtlasEditor.cs.meta +2 -2
- package/Editor/Sprites/SpriteCropper.cs +1013 -523
- package/Editor/Sprites/SpriteCropper.cs.meta +2 -2
- package/Editor/Sprites/SpritePivotAdjustor.cs +605 -265
- package/Editor/Sprites/SpritePivotAdjustor.cs.meta +2 -2
- package/Editor/Sprites/SpriteSettingsApplier.cs +942 -918
- package/Editor/Sprites/SpriteSettingsApplier.cs.meta +2 -2
- package/Editor/Sprites/SpriteSettingsApplierAPI.cs +441 -0
- package/Editor/Sprites/SpriteSettingsApplierAPI.cs.meta +11 -0
- package/Editor/Sprites/SpriteSettingsProfileCollection.cs +12 -0
- package/Editor/Sprites/SpriteSettingsProfileCollection.cs.meta +11 -0
- package/Editor/Sprites/SpriteSheetAnimationCreator.cs +1586 -1537
- package/Editor/Sprites/SpriteSheetAnimationCreator.cs.meta +2 -2
- package/Editor/Sprites/TexturePlatformNameHelper.cs +89 -0
- package/Editor/Sprites/TexturePlatformNameHelper.cs.meta +11 -0
- package/Editor/Sprites/TextureResizerWizard.cs +456 -175
- package/Editor/Sprites/TextureResizerWizard.cs.meta +2 -2
- package/Editor/Sprites/TextureSettingsApplierAPI.cs +359 -0
- package/Editor/Sprites/TextureSettingsApplierAPI.cs.meta +11 -0
- package/Editor/Sprites/TextureSettingsApplierWindow.cs +668 -0
- package/Editor/Sprites/TextureSettingsApplierWindow.cs.meta +11 -0
- package/Editor/Sprites.meta +2 -2
- package/Editor/Styles/AnimationViewer.uss +115 -115
- package/Editor/Styles/AnimationViewer.uss.meta +2 -2
- package/Editor/Styles/AnimationViewer.uxml +56 -56
- package/Editor/Styles/AnimationViewer.uxml.meta +2 -2
- package/Editor/Styles/SpriteSheetAnimationCreator.uss +10 -0
- package/Editor/Styles/SpriteSheetAnimationCreator.uss.meta +11 -0
- package/Editor/Styles.meta +2 -2
- package/Editor/Tags/AttributeMetadataCacheEditor.cs +46 -0
- package/Editor/Tags/AttributeMetadataCacheEditor.cs.meta +11 -0
- package/Editor/Tags/AttributeMetadataCacheGenerator.cs +258 -0
- package/Editor/Tags/AttributeMetadataCacheGenerator.cs.meta +11 -0
- package/Editor/Tags.meta +8 -0
- package/Editor/Tools/ImageBlurTool.cs +522 -409
- package/Editor/Tools/ImageBlurTool.cs.meta +2 -2
- package/Editor/Tools.meta +2 -2
- package/Editor/Utils/DxReadOnlyPropertyDrawer.cs +26 -26
- package/Editor/Utils/DxReadOnlyPropertyDrawer.cs.meta +11 -11
- package/Editor/Utils/EditorUi.cs +228 -0
- package/Editor/Utils/EditorUi.cs.meta +11 -0
- package/Editor/Utils/EditorUtilities.cs +22 -22
- package/Editor/Utils/EditorUtilities.cs.meta +11 -11
- package/Editor/Utils/ScriptableObjectSingletonCreator.cs +633 -52
- package/Editor/Utils/ScriptableObjectSingletonCreator.cs.meta +2 -2
- package/Editor/Utils.meta +8 -8
- package/Editor/Visuals/EnhancedImageEditor.cs +160 -160
- package/Editor/Visuals/EnhancedImageEditor.cs.meta +11 -11
- package/Editor/Visuals.meta +2 -2
- package/Editor/WallstopStudios.UnityHelpers.Editor.asmdef +14 -18
- package/Editor/WallstopStudios.UnityHelpers.Editor.asmdef.meta +7 -7
- package/Editor.meta +8 -8
- package/GETTING_STARTED.md +409 -0
- package/GETTING_STARTED.md.meta +7 -0
- package/GLOSSARY.md +313 -0
- package/GLOSSARY.md.meta +7 -0
- package/HULLS.md +45 -0
- package/HULLS.md.meta +7 -0
- package/INDEX.md +429 -0
- package/INDEX.md.meta +7 -0
- package/LICENSE +21 -21
- package/LICENSE.md +7 -7
- package/LICENSE.md.meta +7 -7
- package/LICENSE.meta +7 -7
- package/MATH_AND_EXTENSIONS.md +316 -0
- package/MATH_AND_EXTENSIONS.md.meta +7 -0
- package/RANDOM_PERFORMANCE.md +140 -0
- package/RANDOM_PERFORMANCE.md.meta +7 -0
- package/README.md +1183 -188
- package/README.md.meta +7 -7
- package/REFLECTION_HELPERS.md +272 -0
- package/REFLECTION_HELPERS.md.meta +7 -0
- package/RELATIONAL_COMPONENTS.md +552 -0
- package/RELATIONAL_COMPONENTS.md.meta +7 -0
- package/Runtime/AssemblyInfo.cs +9 -0
- package/Runtime/AssemblyInfo.cs.meta +11 -0
- package/Runtime/Binaries/Microsoft.Bcl.AsyncInterfaces.dll +0 -0
- package/Runtime/Binaries/Microsoft.Bcl.AsyncInterfaces.dll.meta +33 -33
- package/Runtime/Binaries/Microsoft.Bcl.AsyncInterfaces.xml +499 -278
- package/Runtime/Binaries/Microsoft.Bcl.AsyncInterfaces.xml.meta +7 -7
- package/Runtime/Binaries/System.IO.Pipelines.dll +0 -0
- package/Runtime/Binaries/System.IO.Pipelines.dll.meta +33 -0
- package/Runtime/Binaries/System.IO.Pipelines.xml +702 -0
- package/Runtime/Binaries/System.IO.Pipelines.xml.meta +7 -0
- package/Runtime/Binaries/System.Text.Encodings.Web.dll +0 -0
- package/Runtime/Binaries/System.Text.Encodings.Web.dll.meta +33 -33
- package/Runtime/Binaries/System.Text.Encodings.Web.xml +1084 -1079
- package/Runtime/Binaries/System.Text.Encodings.Web.xml.meta +7 -7
- package/Runtime/Binaries/System.Text.Json.dll +0 -0
- package/Runtime/Binaries/System.Text.Json.dll.meta +33 -33
- package/Runtime/Binaries/System.Text.Json.xml +10217 -8116
- package/Runtime/Binaries/System.Text.Json.xml.meta +7 -7
- package/Runtime/Binaries.meta +8 -8
- package/Runtime/Core/Attributes/AnimationEventAttribute.cs +10 -138
- package/Runtime/Core/Attributes/AnimationEventAttribute.cs.meta +11 -11
- package/Runtime/Core/Attributes/BaseRelationalComponentAttribute.cs +841 -0
- package/Runtime/Core/Attributes/BaseRelationalComponentAttribute.cs.meta +11 -0
- package/Runtime/Core/Attributes/ChildComponentAttribute.cs +284 -226
- package/Runtime/Core/Attributes/ChildComponentAttribute.cs.meta +11 -11
- package/Runtime/Core/Attributes/DxReadOnlyAttribute.cs +6 -6
- package/Runtime/Core/Attributes/DxReadOnlyAttribute.cs.meta +11 -11
- package/Runtime/Core/Attributes/EnumDisplayNameAttribute.cs +15 -15
- package/Runtime/Core/Attributes/EnumDisplayNameAttribute.cs.meta +2 -2
- package/Runtime/Core/Attributes/IRelationalComponentAssigner.cs +36 -0
- package/Runtime/Core/Attributes/IRelationalComponentAssigner.cs.meta +11 -0
- package/Runtime/Core/Attributes/IntDropdownAttribute.cs +14 -14
- package/Runtime/Core/Attributes/IntDropdownAttribute.cs.meta +2 -2
- package/Runtime/Core/Attributes/KSerializableAttribute.cs +19 -19
- package/Runtime/Core/Attributes/KSerializableAttribute.cs.meta +11 -11
- package/Runtime/Core/Attributes/NotNullAttribute.cs +30 -32
- package/Runtime/Core/Attributes/NotNullAttribute.cs.meta +11 -11
- package/Runtime/Core/Attributes/ParentComponentAttribute.cs +376 -0
- package/Runtime/Core/Attributes/{ParentComponent.cs.meta → ParentComponentAttribute.cs.meta} +11 -11
- package/Runtime/Core/Attributes/RelationalComponentAssigner.cs +152 -0
- package/Runtime/Core/Attributes/RelationalComponentAssigner.cs.meta +11 -0
- package/Runtime/Core/Attributes/RelationalComponentExtensions.cs +61 -14
- package/Runtime/Core/Attributes/RelationalComponentExtensions.cs.meta +11 -11
- package/Runtime/Core/Attributes/RelationalComponentInitializer.cs +331 -0
- package/Runtime/Core/Attributes/RelationalComponentInitializer.cs.meta +11 -0
- package/Runtime/Core/Attributes/ScriptableSingletonPathAttribute.cs +15 -15
- package/Runtime/Core/Attributes/ScriptableSingletonPathAttribute.cs.meta +2 -2
- package/Runtime/Core/Attributes/SiblingComponentAttribute.cs +264 -137
- package/Runtime/Core/Attributes/SiblingComponentAttribute.cs.meta +11 -11
- package/Runtime/Core/Attributes/ValidateAssignmentAttribute.cs +115 -106
- package/Runtime/Core/Attributes/ValidateAssignmentAttribute.cs.meta +11 -11
- package/Runtime/Core/Attributes/ValueHelpers.cs +10 -0
- package/Runtime/Core/Attributes/ValueHelpers.cs.meta +3 -0
- package/Runtime/Core/Attributes/WShowIfAttribute.cs +24 -24
- package/Runtime/Core/Attributes/WShowIfAttribute.cs.meta +2 -2
- package/Runtime/Core/Attributes.meta +8 -8
- package/Runtime/Core/DataStructure/Adapters/FastVector2Int.cs +192 -92
- package/Runtime/Core/DataStructure/Adapters/FastVector2Int.cs.meta +11 -11
- package/Runtime/Core/DataStructure/Adapters/FastVector3Int.cs +268 -185
- package/Runtime/Core/DataStructure/Adapters/FastVector3Int.cs.meta +11 -11
- package/Runtime/Core/DataStructure/Adapters/KGuid.cs +360 -305
- package/Runtime/Core/DataStructure/Adapters/KGuid.cs.meta +11 -11
- package/Runtime/Core/DataStructure/Adapters/KVector2.cs +146 -80
- package/Runtime/Core/DataStructure/Adapters/KVector2.cs.meta +11 -11
- package/Runtime/Core/DataStructure/Adapters.meta +8 -8
- package/Runtime/Core/DataStructure/BitSet.cs +626 -0
- package/Runtime/Core/DataStructure/BitSet.cs.meta +11 -0
- package/Runtime/Core/DataStructure/BoundingBox3D.cs +405 -0
- package/Runtime/Core/DataStructure/BoundingBox3D.cs.meta +11 -0
- package/Runtime/Core/DataStructure/Circle.cs +203 -50
- package/Runtime/Core/DataStructure/Circle.cs.meta +11 -11
- package/Runtime/Core/DataStructure/CyclicBuffer.cs +488 -266
- package/Runtime/Core/DataStructure/CyclicBuffer.cs.meta +11 -11
- package/Runtime/Core/DataStructure/Deque.cs +561 -0
- package/Runtime/Core/DataStructure/Deque.cs.meta +11 -0
- package/Runtime/Core/DataStructure/DisjointSet.cs +483 -0
- package/Runtime/Core/DataStructure/DisjointSet.cs.meta +11 -0
- package/Runtime/Core/DataStructure/Heap.cs +514 -0
- package/Runtime/Core/DataStructure/Heap.cs.meta +11 -0
- package/Runtime/Core/DataStructure/{ISpatialTree.cs → ISpatialTree2D.cs} +25 -21
- package/Runtime/Core/DataStructure/ISpatialTree2D.cs.meta +11 -0
- package/Runtime/Core/DataStructure/ISpatialTree3D.cs +33 -0
- package/Runtime/Core/DataStructure/ISpatialTree3D.cs.meta +11 -0
- package/Runtime/Core/DataStructure/ImmutableBitSet.cs +398 -0
- package/Runtime/Core/DataStructure/ImmutableBitSet.cs.meta +3 -0
- package/Runtime/Core/DataStructure/KDTree2D.cs +852 -0
- package/Runtime/Core/DataStructure/KDTree2D.cs.meta +11 -0
- package/Runtime/Core/DataStructure/KDTree3D.cs +911 -0
- package/Runtime/Core/DataStructure/KDTree3D.cs.meta +11 -0
- package/Runtime/Core/DataStructure/OctTree3D.cs +983 -0
- package/Runtime/Core/DataStructure/OctTree3D.cs.meta +11 -0
- package/Runtime/Core/DataStructure/PriorityQueue.cs +194 -0
- package/Runtime/Core/DataStructure/PriorityQueue.cs.meta +11 -0
- package/Runtime/Core/DataStructure/QuadTree2D.cs +722 -0
- package/Runtime/Core/DataStructure/QuadTree2D.cs.meta +11 -0
- package/Runtime/Core/DataStructure/RTree2D.cs +704 -0
- package/Runtime/Core/DataStructure/{RTree.cs.meta → RTree2D.cs.meta} +11 -11
- package/Runtime/Core/DataStructure/RTree3D.cs +775 -0
- package/Runtime/Core/DataStructure/RTree3D.cs.meta +11 -0
- package/Runtime/Core/DataStructure/SparseSet.cs +597 -0
- package/Runtime/Core/DataStructure/SparseSet.cs.meta +11 -0
- package/Runtime/Core/DataStructure/SpatialHash2D.cs +312 -0
- package/Runtime/Core/DataStructure/SpatialHash2D.cs.meta +3 -0
- package/Runtime/Core/DataStructure/SpatialHash3D.cs +341 -0
- package/Runtime/Core/DataStructure/SpatialHash3D.cs.meta +11 -0
- package/Runtime/Core/DataStructure/Sphere.cs +264 -0
- package/Runtime/Core/DataStructure/Sphere.cs.meta +11 -0
- package/Runtime/Core/DataStructure/StringWrapper.cs +115 -91
- package/Runtime/Core/DataStructure/StringWrapper.cs.meta +11 -11
- package/Runtime/Core/DataStructure/TimedCache.cs +88 -66
- package/Runtime/Core/DataStructure/TimedCache.cs.meta +11 -11
- package/Runtime/Core/DataStructure/Trie.cs +660 -359
- package/Runtime/Core/DataStructure/Trie.cs.meta +2 -2
- package/Runtime/Core/DataStructure.meta +8 -8
- package/Runtime/Core/Extension/AnimatorExtensions.cs +40 -25
- package/Runtime/Core/Extension/AnimatorExtensions.cs.meta +11 -11
- package/Runtime/Core/Extension/AsyncOperationExtensions.cs +404 -110
- package/Runtime/Core/Extension/AsyncOperationExtensions.cs.meta +2 -2
- package/Runtime/Core/Extension/CircleExtensions.cs +125 -25
- package/Runtime/Core/Extension/CircleExtensions.cs.meta +11 -11
- package/Runtime/Core/Extension/ColorExtensions.cs +983 -644
- package/Runtime/Core/Extension/ColorExtensions.cs.meta +11 -11
- package/Runtime/Core/Extension/DictionaryExtensions.cs +606 -299
- package/Runtime/Core/Extension/DictionaryExtensions.cs.meta +11 -11
- package/Runtime/Core/Extension/DirectionExtensions.cs +377 -213
- package/Runtime/Core/Extension/DirectionExtensions.cs.meta +11 -11
- package/Runtime/Core/Extension/EnumExtensions.cs +535 -137
- package/Runtime/Core/Extension/EnumExtensions.cs.meta +2 -2
- package/Runtime/Core/Extension/IEnumerableExtensions.cs +341 -124
- package/Runtime/Core/Extension/IEnumerableExtensions.cs.meta +11 -11
- package/Runtime/Core/Extension/IListExtensions.cs +767 -248
- package/Runtime/Core/Extension/IListExtensions.cs.meta +11 -11
- package/Runtime/Core/Extension/IReadonlyListExtensions.cs +687 -37
- package/Runtime/Core/Extension/IReadonlyListExtensions.cs.meta +2 -2
- package/Runtime/Core/Extension/ProtoEqualityExtensions.cs +292 -0
- package/Runtime/Core/Extension/ProtoEqualityExtensions.cs.meta +3 -0
- package/Runtime/Core/Extension/RandomExtensions.cs +1006 -109
- package/Runtime/Core/Extension/RandomExtensions.cs.meta +11 -11
- package/Runtime/Core/Extension/StringExtensions.cs +1635 -239
- package/Runtime/Core/Extension/StringExtensions.cs.meta +11 -11
- package/Runtime/Core/Extension/UnityExtensions.cs +4555 -1689
- package/Runtime/Core/Extension/UnityExtensions.cs.meta +11 -11
- package/Runtime/Core/Extension/WallstopStudiosLogger.cs +287 -245
- package/Runtime/Core/Extension/WallstopStudiosLogger.cs.meta +11 -11
- package/Runtime/Core/Extension.meta +8 -8
- package/Runtime/Core/Helper/ArrayConverter.cs +73 -39
- package/Runtime/Core/Helper/ArrayConverter.cs.meta +2 -2
- package/Runtime/Core/Helper/AssignUtilities.cs +33 -14
- package/Runtime/Core/Helper/AssignUtilities.cs.meta +11 -11
- package/Runtime/Core/Helper/DirectoryHelper.cs +210 -196
- package/Runtime/Core/Helper/DirectoryHelper.cs.meta +2 -2
- package/Runtime/Core/Helper/Enumerables.cs +51 -17
- package/Runtime/Core/Helper/Enumerables.cs.meta +11 -11
- package/Runtime/Core/Helper/FileHelper.cs +97 -77
- package/Runtime/Core/Helper/FileHelper.cs.meta +2 -2
- package/Runtime/Core/Helper/FormattingHelpers.cs +49 -38
- package/Runtime/Core/Helper/FormattingHelpers.cs.meta +2 -2
- package/Runtime/Core/Helper/FuncBasedComparer.cs +29 -0
- package/Runtime/Core/Helper/FuncBasedComparer.cs.meta +3 -0
- package/Runtime/Core/Helper/Geometry.cs +65 -43
- package/Runtime/Core/Helper/Geometry.cs.meta +11 -11
- package/Runtime/Core/Helper/Helpers.cs +1271 -831
- package/Runtime/Core/Helper/Helpers.cs.meta +11 -11
- package/Runtime/Core/Helper/IterationHelpers.cs +83 -32
- package/Runtime/Core/Helper/IterationHelpers.cs.meta +11 -11
- package/Runtime/Core/Helper/LifetimeHelpers.cs +20 -13
- package/Runtime/Core/Helper/LifetimeHelpers.cs.meta +11 -11
- package/Runtime/Core/Helper/LineHelper.cs +259 -194
- package/Runtime/Core/Helper/LineHelper.cs.meta +2 -2
- package/Runtime/Core/Helper/Logging/UnityLogTagFormatter.cs +549 -539
- package/Runtime/Core/Helper/Logging/UnityLogTagFormatter.cs.meta +2 -2
- package/Runtime/Core/Helper/Logging.meta +2 -2
- package/Runtime/Core/Helper/Objects.cs +477 -769
- package/Runtime/Core/Helper/Objects.cs.meta +11 -11
- package/Runtime/Core/Helper/Partials/LogHelpers.cs +13 -13
- package/Runtime/Core/Helper/Partials/LogHelpers.cs.meta +2 -2
- package/Runtime/Core/Helper/Partials/MathHelpers.cs +45 -30
- package/Runtime/Core/Helper/Partials/MathHelpers.cs.meta +2 -2
- package/Runtime/Core/Helper/Partials/ObjectHelpers.cs +509 -400
- package/Runtime/Core/Helper/Partials/ObjectHelpers.cs.meta +2 -2
- package/Runtime/Core/Helper/Partials/TransformHelpers.cs +393 -377
- package/Runtime/Core/Helper/Partials/TransformHelpers.cs.meta +2 -2
- package/Runtime/Core/Helper/Partials.meta +2 -2
- package/Runtime/Core/Helper/PathHelper.cs +42 -15
- package/Runtime/Core/Helper/PathHelper.cs.meta +2 -2
- package/Runtime/Core/Helper/ReflectionHelpers.cs +5298 -1963
- package/Runtime/Core/Helper/ReflectionHelpers.cs.meta +2 -2
- package/Runtime/Core/Helper/ReverseComparer.cs +33 -0
- package/Runtime/Core/Helper/ReverseComparer.cs.meta +3 -0
- package/Runtime/Core/Helper/SceneHelper.cs +251 -224
- package/Runtime/Core/Helper/SceneHelper.cs.meta +2 -2
- package/Runtime/Core/Helper/SpriteHelpers.cs +52 -41
- package/Runtime/Core/Helper/SpriteHelpers.cs.meta +11 -11
- package/Runtime/Core/Helper/StringInList.cs +61 -35
- package/Runtime/Core/Helper/StringInList.cs.meta +11 -11
- package/Runtime/Core/Helper/TestAssemblyHelper.cs +134 -0
- package/Runtime/Core/Helper/TestAssemblyHelper.cs.meta +11 -0
- package/Runtime/Core/Helper/UnityMainThreadDispatcher.cs +144 -82
- package/Runtime/Core/Helper/UnityMainThreadDispatcher.cs.meta +2 -2
- package/Runtime/Core/Helper/WallMath.cs +672 -166
- package/Runtime/Core/Helper/WallMath.cs.meta +11 -11
- package/Runtime/Core/Helper.meta +8 -8
- package/Runtime/Core/Math/Line2D.cs +263 -0
- package/Runtime/Core/Math/Line2D.cs.meta +11 -0
- package/Runtime/Core/Math/Line3D.cs +452 -0
- package/Runtime/Core/Math/Line3D.cs.meta +11 -0
- package/Runtime/Core/Math/Parabola.cs +241 -47
- package/Runtime/Core/Math/Parabola.cs.meta +11 -11
- package/Runtime/Core/Math/PointPolygonCheck.cs +175 -36
- package/Runtime/Core/Math/PointPolygonCheck.cs.meta +11 -11
- package/Runtime/Core/Math/Range.cs +157 -92
- package/Runtime/Core/Math/Range.cs.meta +11 -11
- package/Runtime/Core/Math.meta +8 -8
- package/Runtime/Core/Model/Direction.cs +25 -43
- package/Runtime/Core/Model/Direction.cs.meta +11 -11
- package/Runtime/Core/Model.meta +8 -8
- package/Runtime/Core/OneOf/FastOneOf.cs +252 -152
- package/Runtime/Core/OneOf/FastOneOf.cs.meta +11 -11
- package/Runtime/Core/OneOf/FastOneOf2.cs +198 -0
- package/Runtime/Core/OneOf/FastOneOf2.cs.meta +11 -0
- package/Runtime/Core/OneOf/FastOneOf4.cs +324 -0
- package/Runtime/Core/OneOf/FastOneOf4.cs.meta +11 -0
- package/Runtime/Core/OneOf/None.cs +30 -4
- package/Runtime/Core/OneOf/None.cs.meta +11 -11
- package/Runtime/Core/OneOf.meta +8 -8
- package/Runtime/Core/Random/AbstractRandom.cs +1318 -655
- package/Runtime/Core/Random/AbstractRandom.cs.meta +11 -11
- package/Runtime/Core/Random/DotNetRandom.cs +118 -54
- package/Runtime/Core/Random/DotNetRandom.cs.meta +2 -2
- package/Runtime/Core/Random/IRandom.cs +203 -161
- package/Runtime/Core/Random/IRandom.cs.meta +11 -11
- package/Runtime/Core/Random/IllusionFlow.cs +171 -107
- package/Runtime/Core/Random/IllusionFlow.cs.meta +2 -2
- package/Runtime/Core/Random/LinearCongruentialGenerator.cs +90 -49
- package/Runtime/Core/Random/LinearCongruentialGenerator.cs.meta +2 -2
- package/Runtime/Core/Random/NativePcgRandom.cs +139 -97
- package/Runtime/Core/Random/NativePcgRandom.cs.meta +11 -11
- package/Runtime/Core/Random/PRNG.cs +21 -7
- package/Runtime/Core/Random/PRNG.cs.meta +2 -2
- package/Runtime/Core/Random/PcgRandom.cs +243 -149
- package/Runtime/Core/Random/PcgRandom.cs.meta +11 -11
- package/Runtime/Core/Random/PerlinNoise.cs +369 -369
- package/Runtime/Core/Random/PerlinNoise.cs.meta +2 -2
- package/Runtime/Core/Random/RandomComparer.cs +34 -0
- package/Runtime/Core/Random/RandomComparer.cs.meta +3 -0
- package/Runtime/Core/Random/RandomState.cs +206 -131
- package/Runtime/Core/Random/RandomState.cs.meta +11 -11
- package/Runtime/Core/Random/RandomUtilities.cs +55 -26
- package/Runtime/Core/Random/RandomUtilities.cs.meta +11 -11
- package/Runtime/Core/Random/RomuDuo.cs +171 -116
- package/Runtime/Core/Random/RomuDuo.cs.meta +2 -2
- package/Runtime/Core/Random/SplitMix64.cs +134 -94
- package/Runtime/Core/Random/SplitMix64.cs.meta +2 -2
- package/Runtime/Core/Random/SquirrelRandom.cs +127 -84
- package/Runtime/Core/Random/SquirrelRandom.cs.meta +11 -11
- package/Runtime/Core/Random/SystemRandom.cs +203 -162
- package/Runtime/Core/Random/SystemRandom.cs.meta +11 -11
- package/Runtime/Core/Random/ThreadLocalRandom.cs +25 -12
- package/Runtime/Core/Random/ThreadLocalRandom.cs.meta +11 -11
- package/Runtime/Core/Random/UnityRandom.cs +109 -57
- package/Runtime/Core/Random/UnityRandom.cs.meta +11 -11
- package/Runtime/Core/Random/WyRandom.cs +158 -121
- package/Runtime/Core/Random/WyRandom.cs.meta +2 -2
- package/Runtime/Core/Random/XorShiftRandom.cs +106 -52
- package/Runtime/Core/Random/XorShiftRandom.cs.meta +11 -11
- package/Runtime/Core/Random/XoroShiroRandom.cs +184 -119
- package/Runtime/Core/Random/XoroShiroRandom.cs.meta +2 -2
- package/Runtime/Core/Random.meta +8 -8
- package/Runtime/Core/Serialization/JsonConverters/AnimationCurveConverter.cs +248 -0
- package/Runtime/Core/Serialization/JsonConverters/AnimationCurveConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/BitSetConverter.cs +119 -0
- package/Runtime/Core/Serialization/JsonConverters/BitSetConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/BoundingSphereConverter.cs +74 -0
- package/Runtime/Core/Serialization/JsonConverters/BoundingSphereConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/BoundsConverter.cs +132 -0
- package/Runtime/Core/Serialization/JsonConverters/BoundsConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/BoundsIntConverter.cs +135 -0
- package/Runtime/Core/Serialization/JsonConverters/BoundsIntConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/Color32Converter.cs +98 -0
- package/Runtime/Core/Serialization/JsonConverters/Color32Converter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/ColorBlockConverter.cs +123 -0
- package/Runtime/Core/Serialization/JsonConverters/ColorBlockConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/ColorConverter.cs +88 -88
- package/Runtime/Core/Serialization/JsonConverters/ColorConverter.cs.meta +2 -2
- package/Runtime/Core/Serialization/JsonConverters/CyclicBufferConverterFactory.cs +112 -0
- package/Runtime/Core/Serialization/JsonConverters/CyclicBufferConverterFactory.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/DequeConverterFactory.cs +62 -0
- package/Runtime/Core/Serialization/JsonConverters/DequeConverterFactory.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/FastVector2IntConverter.cs +72 -0
- package/Runtime/Core/Serialization/JsonConverters/FastVector2IntConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/FastVector3IntConverter.cs +80 -0
- package/Runtime/Core/Serialization/JsonConverters/FastVector3IntConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/GameObjectConverter.cs +44 -36
- package/Runtime/Core/Serialization/JsonConverters/GameObjectConverter.cs.meta +2 -2
- package/Runtime/Core/Serialization/JsonConverters/GradientConverter.cs +245 -0
- package/Runtime/Core/Serialization/JsonConverters/GradientConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/Hash128Converter.cs +92 -0
- package/Runtime/Core/Serialization/JsonConverters/Hash128Converter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/ImmutableBitSetConverter.cs +119 -0
- package/Runtime/Core/Serialization/JsonConverters/ImmutableBitSetConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/KVector2Converter.cs +72 -0
- package/Runtime/Core/Serialization/JsonConverters/KVector2Converter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/LayerMaskConverter.cs +95 -0
- package/Runtime/Core/Serialization/JsonConverters/LayerMaskConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/Matrix4x4Converter.cs +237 -218
- package/Runtime/Core/Serialization/JsonConverters/Matrix4x4Converter.cs.meta +2 -2
- package/Runtime/Core/Serialization/JsonConverters/MinMaxCurveConverter.cs +142 -0
- package/Runtime/Core/Serialization/JsonConverters/MinMaxCurveConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/MinMaxGradientConverter.cs +135 -0
- package/Runtime/Core/Serialization/JsonConverters/MinMaxGradientConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/PlaneConverter.cs +79 -0
- package/Runtime/Core/Serialization/JsonConverters/PlaneConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/PoseConverter.cs +76 -0
- package/Runtime/Core/Serialization/JsonConverters/PoseConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/QuaternionConverter.cs +88 -0
- package/Runtime/Core/Serialization/JsonConverters/QuaternionConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/RangeConverterFactory.cs +106 -0
- package/Runtime/Core/Serialization/JsonConverters/RangeConverterFactory.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/RangeIntConverter.cs +71 -0
- package/Runtime/Core/Serialization/JsonConverters/RangeIntConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/Ray2DConverter.cs +80 -0
- package/Runtime/Core/Serialization/JsonConverters/Ray2DConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/RayConverter.cs +76 -0
- package/Runtime/Core/Serialization/JsonConverters/RayConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/RaycastHitConverter.cs +115 -0
- package/Runtime/Core/Serialization/JsonConverters/RaycastHitConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/RectConverter.cs +84 -0
- package/Runtime/Core/Serialization/JsonConverters/RectConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/RectIntConverter.cs +88 -0
- package/Runtime/Core/Serialization/JsonConverters/RectIntConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/RectOffsetConverter.cs +87 -0
- package/Runtime/Core/Serialization/JsonConverters/RectOffsetConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/RenderTextureDescriptorConverter.cs +264 -0
- package/Runtime/Core/Serialization/JsonConverters/RenderTextureDescriptorConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/ResolutionConverter.cs +158 -0
- package/Runtime/Core/Serialization/JsonConverters/ResolutionConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/SceneConverter.cs +103 -0
- package/Runtime/Core/Serialization/JsonConverters/SceneConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/SphericalHarmonicsL2Converter.cs +121 -0
- package/Runtime/Core/Serialization/JsonConverters/SphericalHarmonicsL2Converter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/TouchConverter.cs +54 -0
- package/Runtime/Core/Serialization/JsonConverters/TouchConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/TypeConverter.cs +30 -28
- package/Runtime/Core/Serialization/JsonConverters/TypeConverter.cs.meta +2 -2
- package/Runtime/Core/Serialization/JsonConverters/Vector2Converter.cs +72 -74
- package/Runtime/Core/Serialization/JsonConverters/Vector2Converter.cs.meta +11 -11
- package/Runtime/Core/Serialization/JsonConverters/Vector2IntConverter.cs +72 -0
- package/Runtime/Core/Serialization/JsonConverters/Vector2IntConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/Vector3Converter.cs +80 -81
- package/Runtime/Core/Serialization/JsonConverters/Vector3Converter.cs.meta +11 -11
- package/Runtime/Core/Serialization/JsonConverters/Vector3IntConverter.cs +80 -0
- package/Runtime/Core/Serialization/JsonConverters/Vector3IntConverter.cs.meta +11 -0
- package/Runtime/Core/Serialization/JsonConverters/Vector4Converter.cs +88 -88
- package/Runtime/Core/Serialization/JsonConverters/Vector4Converter.cs.meta +2 -2
- package/Runtime/Core/Serialization/JsonConverters.meta +8 -8
- package/Runtime/Core/Serialization/ProtobufUnitySurrogates.cs +383 -0
- package/Runtime/Core/Serialization/ProtobufUnitySurrogates.cs.meta +11 -0
- package/Runtime/Core/Serialization/Serializer.cs +2121 -195
- package/Runtime/Core/Serialization/Serializer.cs.meta +11 -11
- package/Runtime/Core/Serialization.meta +8 -8
- package/Runtime/Core/Threading/SingleThreadedThreadPool.cs +228 -228
- package/Runtime/Core/Threading/SingleThreadedThreadPool.cs.meta +11 -11
- package/Runtime/Core/Threading.meta +8 -8
- package/Runtime/Core.meta +8 -8
- package/Runtime/Integrations/VContainer/AssemblyInfo.cs +9 -0
- package/Runtime/Integrations/VContainer/AssemblyInfo.cs.meta +3 -0
- package/Runtime/Integrations/VContainer/ObjectResolverRelationalExtensions.cs +281 -0
- package/Runtime/Integrations/VContainer/ObjectResolverRelationalExtensions.cs.meta +11 -0
- package/Runtime/Integrations/VContainer/RelationalComponentEntryPoint.cs +189 -0
- package/Runtime/Integrations/VContainer/RelationalComponentEntryPoint.cs.meta +11 -0
- package/Runtime/Integrations/VContainer/RelationalComponentsBuilderExtensions.cs +90 -0
- package/Runtime/Integrations/VContainer/RelationalComponentsBuilderExtensions.cs.meta +11 -0
- package/Runtime/Integrations/VContainer/RelationalObjectPools.cs +114 -0
- package/Runtime/Integrations/VContainer/RelationalObjectPools.cs.meta +11 -0
- package/Runtime/Integrations/VContainer/RelationalSceneAssignmentOptions.cs +95 -0
- package/Runtime/Integrations/VContainer/RelationalSceneAssignmentOptions.cs.meta +11 -0
- package/Runtime/Integrations/VContainer/RelationalSceneLoadListener.cs +241 -0
- package/Runtime/Integrations/VContainer/RelationalSceneLoadListener.cs.meta +11 -0
- package/Runtime/Integrations/VContainer/WallstopStudios.UnityHelpers.Integration.VContainer.asmdef +30 -0
- package/Runtime/Integrations/VContainer/WallstopStudios.UnityHelpers.Integration.VContainer.asmdef.meta +7 -0
- package/Runtime/Integrations/VContainer.meta +8 -0
- package/Runtime/Integrations/Zenject/AssemblyInfo.cs +9 -0
- package/Runtime/Integrations/Zenject/AssemblyInfo.cs.meta +3 -0
- package/Runtime/Integrations/Zenject/DiContainerRelationalExtensions.cs +247 -0
- package/Runtime/Integrations/Zenject/DiContainerRelationalExtensions.cs.meta +11 -0
- package/Runtime/Integrations/Zenject/RelationalComponentSceneInitializer.cs +182 -0
- package/Runtime/Integrations/Zenject/RelationalComponentSceneInitializer.cs.meta +11 -0
- package/Runtime/Integrations/Zenject/RelationalComponentsInstaller.cs +94 -0
- package/Runtime/Integrations/Zenject/RelationalComponentsInstaller.cs.meta +11 -0
- package/Runtime/Integrations/Zenject/RelationalMemoryPools.cs +44 -0
- package/Runtime/Integrations/Zenject/RelationalMemoryPools.cs.meta +11 -0
- package/Runtime/Integrations/Zenject/RelationalSceneAssignmentOptions.cs +93 -0
- package/Runtime/Integrations/Zenject/RelationalSceneAssignmentOptions.cs.meta +11 -0
- package/Runtime/Integrations/Zenject/RelationalSceneLoadListener.cs +243 -0
- package/Runtime/Integrations/Zenject/RelationalSceneLoadListener.cs.meta +11 -0
- package/Runtime/Integrations/Zenject/WallstopStudios.UnityHelpers.Integration.Zenject.asmdef +30 -0
- package/Runtime/Integrations/Zenject/WallstopStudios.UnityHelpers.Integration.Zenject.asmdef.meta +7 -0
- package/Runtime/Integrations/Zenject.meta +8 -0
- package/Runtime/Integrations.meta +8 -0
- package/Runtime/Protobuf-Net/System.Collections.Immutable.dll.meta +33 -33
- package/Runtime/Protobuf-Net/System.Runtime.CompilerServices.Unsafe.dll.meta +33 -33
- package/Runtime/Protobuf-Net/protobuf-net.Core.dll.meta +33 -33
- package/Runtime/Protobuf-Net/protobuf-net.dll.meta +33 -33
- package/Runtime/Protobuf-Net.meta +8 -8
- package/Runtime/Tags/AlwaysIncludeInAttributeMetadataCacheAttribute.cs +11 -0
- package/Runtime/Tags/AlwaysIncludeInAttributeMetadataCacheAttribute.cs.meta +11 -0
- package/Runtime/Tags/Attribute.cs +399 -205
- package/Runtime/Tags/Attribute.cs.meta +2 -2
- package/Runtime/Tags/AttributeEffect.cs +372 -281
- package/Runtime/Tags/AttributeEffect.cs.meta +2 -2
- package/Runtime/Tags/AttributeMetadataCache.cs +500 -0
- package/Runtime/Tags/AttributeMetadataCache.cs.meta +11 -0
- package/Runtime/Tags/AttributeMetadataFilters.cs +108 -0
- package/Runtime/Tags/AttributeMetadataFilters.cs.meta +11 -0
- package/Runtime/Tags/AttributeModification.cs +132 -48
- package/Runtime/Tags/AttributeModification.cs.meta +2 -2
- package/Runtime/Tags/AttributeUtilities.cs +376 -209
- package/Runtime/Tags/AttributeUtilities.cs.meta +2 -2
- package/Runtime/Tags/AttributesComponent.cs +237 -163
- package/Runtime/Tags/AttributesComponent.cs.meta +2 -2
- package/Runtime/Tags/CollisionSenses.cs +117 -91
- package/Runtime/Tags/CollisionSenses.cs.meta +2 -2
- package/Runtime/Tags/CosmeticEffectComponent.cs +112 -50
- package/Runtime/Tags/CosmeticEffectComponent.cs.meta +2 -2
- package/Runtime/Tags/CosmeticEffectData.cs +109 -63
- package/Runtime/Tags/CosmeticEffectData.cs.meta +2 -2
- package/Runtime/Tags/EffectHandle.cs +150 -65
- package/Runtime/Tags/EffectHandle.cs.meta +2 -2
- package/Runtime/Tags/EffectHandler.cs +470 -393
- package/Runtime/Tags/EffectHandler.cs.meta +2 -2
- package/Runtime/Tags/ModificationAction.cs +60 -9
- package/Runtime/Tags/ModificationAction.cs.meta +2 -2
- package/Runtime/Tags/ModifierDurationType.cs +71 -13
- package/Runtime/Tags/ModifierDurationType.cs.meta +2 -2
- package/Runtime/Tags/TagHandler.cs +373 -158
- package/Runtime/Tags/TagHandler.cs.meta +2 -2
- package/Runtime/Tags.meta +2 -2
- package/Runtime/Utils/AnimationEventEqualityComparer.cs +198 -161
- package/Runtime/Utils/AnimationEventEqualityComparer.cs.meta +11 -11
- package/Runtime/Utils/AnimatorEnumStateMachine.cs +110 -88
- package/Runtime/Utils/AnimatorEnumStateMachine.cs.meta +11 -11
- package/Runtime/Utils/Ascii85.cs +132 -115
- package/Runtime/Utils/Ascii85.cs.meta +2 -2
- package/Runtime/Utils/Buffers.cs +1151 -550
- package/Runtime/Utils/Buffers.cs.meta +11 -11
- package/Runtime/Utils/CenterPointOffset.cs +35 -30
- package/Runtime/Utils/CenterPointOffset.cs.meta +2 -2
- package/Runtime/Utils/ChildSpawner.cs +250 -157
- package/Runtime/Utils/ChildSpawner.cs.meta +2 -2
- package/Runtime/Utils/CircleLineRenderer.cs +142 -142
- package/Runtime/Utils/CircleLineRenderer.cs.meta +11 -11
- package/Runtime/Utils/CollisionProxy.cs +48 -48
- package/Runtime/Utils/CollisionProxy.cs.meta +2 -2
- package/Runtime/Utils/CoroutineHandler.cs +4 -4
- package/Runtime/Utils/CoroutineHandler.cs.meta +2 -2
- package/Runtime/Utils/DeferredDisposalResult.cs +20 -23
- package/Runtime/Utils/DeferredDisposalResult.cs.meta +2 -2
- package/Runtime/Utils/LZMA.cs +276 -53
- package/Runtime/Utils/LZMA.cs.meta +2 -2
- package/Runtime/Utils/MatchColliderToSprite.cs +104 -104
- package/Runtime/Utils/MatchColliderToSprite.cs.meta +2 -2
- package/Runtime/Utils/MatchTransform.cs +99 -82
- package/Runtime/Utils/MatchTransform.cs.meta +2 -2
- package/Runtime/Utils/Oscillator.cs +27 -27
- package/Runtime/Utils/Oscillator.cs.meta +11 -11
- package/Runtime/Utils/PolygonCollider2DOptimizer.cs +104 -83
- package/Runtime/Utils/PolygonCollider2DOptimizer.cs.meta +2 -2
- package/Runtime/Utils/RuntimeSingleton.cs +139 -89
- package/Runtime/Utils/RuntimeSingleton.cs.meta +11 -11
- package/Runtime/Utils/ScriptableObjectSingleton.cs +225 -85
- package/Runtime/Utils/ScriptableObjectSingleton.cs.meta +2 -2
- package/Runtime/Utils/SerializedStringComparer.cs +107 -107
- package/Runtime/Utils/SerializedStringComparer.cs.meta +2 -2
- package/Runtime/Utils/SetTextureImportData.cs +71 -69
- package/Runtime/Utils/SetTextureImportData.cs.meta +11 -11
- package/Runtime/Utils/SevenZip/Common/CRC.cs +70 -70
- package/Runtime/Utils/SevenZip/Common/CRC.cs.meta +11 -11
- package/Runtime/Utils/SevenZip/Common/InBuffer.cs +84 -84
- package/Runtime/Utils/SevenZip/Common/InBuffer.cs.meta +11 -11
- package/Runtime/Utils/SevenZip/Common/OutBuffer.cs +70 -70
- package/Runtime/Utils/SevenZip/Common/OutBuffer.cs.meta +11 -11
- package/Runtime/Utils/SevenZip/Common.meta +2 -2
- package/Runtime/Utils/SevenZip/Compress/LZ/IMatchFinder.cs +28 -28
- package/Runtime/Utils/SevenZip/Compress/LZ/IMatchFinder.cs.meta +11 -11
- package/Runtime/Utils/SevenZip/Compress/LZ/LzBinTree.cs +454 -454
- package/Runtime/Utils/SevenZip/Compress/LZ/LzBinTree.cs.meta +11 -11
- package/Runtime/Utils/SevenZip/Compress/LZ/LzInWindow.cs +179 -179
- package/Runtime/Utils/SevenZip/Compress/LZ/LzInWindow.cs.meta +11 -11
- package/Runtime/Utils/SevenZip/Compress/LZ/LzOutWindow.cs +137 -137
- package/Runtime/Utils/SevenZip/Compress/LZ/LzOutWindow.cs.meta +11 -11
- package/Runtime/Utils/SevenZip/Compress/LZ.meta +8 -8
- package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaBase.cs +110 -110
- package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaBase.cs.meta +11 -11
- package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaDecoder.cs +525 -527
- package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaDecoder.cs.meta +11 -11
- package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaEncoder.cs +1891 -1904
- package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaEncoder.cs.meta +11 -11
- package/Runtime/Utils/SevenZip/Compress/LZMA.meta +8 -8
- package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoder.cs +242 -242
- package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoder.cs.meta +11 -11
- package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoderBit.cs +146 -149
- package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoderBit.cs.meta +11 -11
- package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoderBitTree.cs +177 -177
- package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoderBitTree.cs.meta +11 -11
- package/Runtime/Utils/SevenZip/Compress/RangeCoder.meta +8 -8
- package/Runtime/Utils/SevenZip/Compress.meta +8 -8
- package/Runtime/Utils/SevenZip/ICoder.cs +177 -177
- package/Runtime/Utils/SevenZip/ICoder.cs.meta +11 -11
- package/Runtime/Utils/SevenZip.meta +2 -2
- package/Runtime/Utils/SpriteRendererMetadata.cs +346 -370
- package/Runtime/Utils/SpriteRendererMetadata.cs.meta +2 -2
- package/Runtime/Utils/SpriteRendererSyncer.cs +100 -100
- package/Runtime/Utils/SpriteRendererSyncer.cs.meta +2 -2
- package/Runtime/Utils/StartTracker.cs +15 -15
- package/Runtime/Utils/StartTracker.cs.meta +2 -2
- package/Runtime/Utils/TextureScale.cs +364 -179
- package/Runtime/Utils/TextureScale.cs.meta +2 -2
- package/Runtime/Utils/TypeNameSorter.cs +17 -17
- package/Runtime/Utils/TypeNameSorter.cs.meta +2 -2
- package/Runtime/Utils/UnityObjectNameComparer.cs +89 -89
- package/Runtime/Utils/UnityObjectNameComparer.cs.meta +2 -2
- package/Runtime/Utils.meta +8 -8
- package/Runtime/Visuals/AnimatedSpriteLayer.cs +217 -130
- package/Runtime/Visuals/AnimatedSpriteLayer.cs.meta +2 -2
- package/Runtime/Visuals/UGUI/EnhancedImage.cs +224 -85
- package/Runtime/Visuals/UGUI/EnhancedImage.cs.meta +2 -2
- package/Runtime/Visuals/UGUI.meta +2 -2
- package/Runtime/Visuals/UIToolkit/LayeredImage.cs +784 -484
- package/Runtime/Visuals/UIToolkit/LayeredImage.cs.meta +2 -2
- package/Runtime/Visuals/UIToolkit/MultiFileSelectorElement.cs +945 -322
- package/Runtime/Visuals/UIToolkit/MultiFileSelectorElement.cs.meta +2 -2
- package/Runtime/Visuals/UIToolkit.meta +2 -2
- package/Runtime/Visuals.meta +2 -2
- package/Runtime/WallstopStudios.UnityHelpers.asmdef +22 -14
- package/Runtime/WallstopStudios.UnityHelpers.asmdef.meta +7 -7
- package/Runtime.meta +8 -8
- package/SERIALIZATION.md +663 -0
- package/SERIALIZATION.md.meta +7 -0
- package/SINGLETONS.md +427 -0
- package/SINGLETONS.md.meta +7 -0
- package/SPATIAL_TREES_2D_GUIDE.md +261 -0
- package/SPATIAL_TREES_2D_GUIDE.md.meta +7 -0
- package/SPATIAL_TREES_3D_GUIDE.md +214 -0
- package/SPATIAL_TREES_3D_GUIDE.md.meta +7 -0
- package/SPATIAL_TREE_2D_PERFORMANCE.md +241 -0
- package/SPATIAL_TREE_2D_PERFORMANCE.md.meta +7 -0
- package/SPATIAL_TREE_3D_PERFORMANCE.md +243 -0
- package/SPATIAL_TREE_3D_PERFORMANCE.md.meta +7 -0
- package/SPATIAL_TREE_SEMANTICS.md +106 -0
- package/SPATIAL_TREE_SEMANTICS.md.meta +7 -0
- package/Samples~/DI - VContainer/Prefabs/RelationalConsumer.prefab +77 -0
- package/Samples~/DI - VContainer/Prefabs/RelationalConsumer.prefab.meta +8 -0
- package/Samples~/DI - VContainer/Prefabs/Spawner.prefab +47 -0
- package/Samples~/DI - VContainer/Prefabs/Spawner.prefab.meta +8 -0
- package/Samples~/DI - VContainer/Prefabs.meta +9 -0
- package/Samples~/DI - VContainer/README.md +515 -0
- package/Samples~/DI - VContainer/README.md.meta +8 -0
- package/Samples~/DI - VContainer/Scenes/VContainer_Sample.unity +120 -0
- package/Samples~/DI - VContainer/Scenes/VContainer_Sample.unity.meta +8 -0
- package/Samples~/DI - VContainer/Scenes.meta +9 -0
- package/Samples~/DI - VContainer/Scripts/GameLifetimeScope.cs +42 -0
- package/Samples~/DI - VContainer/Scripts/GameLifetimeScope.cs.meta +12 -0
- package/Samples~/DI - VContainer/Scripts/RelationalConsumer.cs +24 -0
- package/Samples~/DI - VContainer/Scripts/RelationalConsumer.cs.meta +12 -0
- package/Samples~/DI - VContainer/Scripts/Samples.UnityHelpers.DI.VContainer.asmdef +37 -0
- package/Samples~/DI - VContainer/Scripts/Samples.UnityHelpers.DI.VContainer.asmdef.meta +8 -0
- package/Samples~/DI - VContainer/Scripts/Spawner.cs +130 -0
- package/Samples~/DI - VContainer/Scripts/Spawner.cs.meta +12 -0
- package/Samples~/DI - VContainer/Scripts.meta +9 -0
- package/Samples~/DI - VContainer.meta +9 -0
- package/Samples~/DI - Zenject/Prefabs/RelationalConsumer.prefab +77 -0
- package/Samples~/DI - Zenject/Prefabs/RelationalConsumer.prefab.meta +8 -0
- package/Samples~/DI - Zenject/Prefabs/SpawnerZenject.prefab +47 -0
- package/Samples~/DI - Zenject/Prefabs/SpawnerZenject.prefab.meta +8 -0
- package/Samples~/DI - Zenject/Prefabs.meta +9 -0
- package/Samples~/DI - Zenject/README.md +553 -0
- package/Samples~/DI - Zenject/README.md.meta +7 -0
- package/Samples~/DI - Zenject/Scenes/Zenject_Sample.unity +164 -0
- package/Samples~/DI - Zenject/Scenes/Zenject_Sample.unity.meta +8 -0
- package/Samples~/DI - Zenject/Scenes.meta +9 -0
- package/Samples~/DI - Zenject/Scripts/RelationalConsumer.cs +22 -0
- package/Samples~/DI - Zenject/Scripts/RelationalConsumer.cs.meta +12 -0
- package/Samples~/DI - Zenject/Scripts/RelationalConsumerPool.cs +37 -0
- package/Samples~/DI - Zenject/Scripts/RelationalConsumerPool.cs.meta +12 -0
- package/Samples~/DI - Zenject/Scripts/Samples.UnityHelpers.DI.Zenject.asmdef +36 -0
- package/Samples~/DI - Zenject/Scripts/Samples.UnityHelpers.DI.Zenject.asmdef.meta +8 -0
- package/Samples~/DI - Zenject/Scripts/SceneContextPlaceholder.cs +47 -0
- package/Samples~/DI - Zenject/Scripts/SceneContextPlaceholder.cs.meta +12 -0
- package/Samples~/DI - Zenject/Scripts/SpawnerZenject.cs +91 -0
- package/Samples~/DI - Zenject/Scripts/SpawnerZenject.cs.meta +12 -0
- package/Samples~/DI - Zenject/Scripts.meta +9 -0
- package/Samples~/DI - Zenject.meta +9 -0
- package/Samples~/Random - PRNG/README.md +13 -0
- package/Samples~/Random - PRNG/README.md.meta +8 -0
- package/Samples~/Random - PRNG/Scripts/RandomPrngDemo.cs +28 -0
- package/Samples~/Random - PRNG/Scripts/RandomPrngDemo.cs.meta +12 -0
- package/Samples~/Random - PRNG/Scripts/Samples.UnityHelpers.Random.Prng.asmdef +17 -0
- package/Samples~/Random - PRNG/Scripts/Samples.UnityHelpers.Random.Prng.asmdef.meta +8 -0
- package/Samples~/Random - PRNG/Scripts.meta +9 -0
- package/Samples~/Random - PRNG.meta +9 -0
- package/Samples~/Relational Components - Basic/README.md +21 -0
- package/Samples~/Relational Components - Basic/README.md.meta +8 -0
- package/Samples~/Relational Components - Basic/Scripts/RelationalBasicConsumer.cs +37 -0
- package/Samples~/Relational Components - Basic/Scripts/RelationalBasicConsumer.cs.meta +12 -0
- package/Samples~/Relational Components - Basic/Scripts/Samples.UnityHelpers.Relational.Basic.asmdef +17 -0
- package/Samples~/Relational Components - Basic/Scripts/Samples.UnityHelpers.Relational.Basic.asmdef.meta +8 -0
- package/Samples~/Relational Components - Basic/Scripts.meta +9 -0
- package/Samples~/Relational Components - Basic.meta +9 -0
- package/Samples~/Serialization - JSON/README.md +14 -0
- package/Samples~/Serialization - JSON/README.md.meta +8 -0
- package/Samples~/Serialization - JSON/Scripts/JsonSerializationDemo.cs +50 -0
- package/Samples~/Serialization - JSON/Scripts/JsonSerializationDemo.cs.meta +12 -0
- package/Samples~/Serialization - JSON/Scripts/Samples.UnityHelpers.Serialization.Json.asmdef +17 -0
- package/Samples~/Serialization - JSON/Scripts/Samples.UnityHelpers.Serialization.Json.asmdef.meta +8 -0
- package/Samples~/Serialization - JSON/Scripts.meta +9 -0
- package/Samples~/Serialization - JSON.meta +9 -0
- package/Samples~/Spatial Structures - 2D and 3D/README.md +14 -0
- package/Samples~/Spatial Structures - 2D and 3D/README.md.meta +8 -0
- package/Samples~/Spatial Structures - 2D and 3D/Scripts/Samples.UnityHelpers.SpatialStructures.asmdef +17 -0
- package/Samples~/Spatial Structures - 2D and 3D/Scripts/Samples.UnityHelpers.SpatialStructures.asmdef.meta +8 -0
- package/Samples~/Spatial Structures - 2D and 3D/Scripts/SpatialStructuresDemo.cs +62 -0
- package/Samples~/Spatial Structures - 2D and 3D/Scripts/SpatialStructuresDemo.cs.meta +12 -0
- package/Samples~/Spatial Structures - 2D and 3D/Scripts.meta +9 -0
- package/Samples~/Spatial Structures - 2D and 3D.meta +9 -0
- package/Samples~/UGUI - EnhancedImage/README.md +13 -0
- package/Samples~/UGUI - EnhancedImage/README.md.meta +8 -0
- package/Samples~/UGUI - EnhancedImage/Scripts/EnhancedImageDemo.cs +36 -0
- package/Samples~/UGUI - EnhancedImage/Scripts/EnhancedImageDemo.cs.meta +12 -0
- package/Samples~/UGUI - EnhancedImage/Scripts/Samples.UnityHelpers.UGUI.EnhancedImage.asmdef +17 -0
- package/Samples~/UGUI - EnhancedImage/Scripts/Samples.UnityHelpers.UGUI.EnhancedImage.asmdef.meta +8 -0
- package/Samples~/UGUI - EnhancedImage/Scripts.meta +9 -0
- package/Samples~/UGUI - EnhancedImage.meta +9 -0
- package/Samples~/UI Toolkit - MultiFile Selector (Editor)/README.md +13 -0
- package/Samples~/UI Toolkit - MultiFile Selector (Editor)/README.md.meta +8 -0
- package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts/Editor/MultiFileSelectorSampleWindow.cs +45 -0
- package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts/Editor/MultiFileSelectorSampleWindow.cs.meta +12 -0
- package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts/Editor/Samples.UnityHelpers.UIToolkit.Editor.asmdef +19 -0
- package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts/Editor/Samples.UnityHelpers.UIToolkit.Editor.asmdef.meta +8 -0
- package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts/Editor.meta +9 -0
- package/Samples~/UI Toolkit - MultiFile Selector (Editor)/Scripts.meta +9 -0
- package/Samples~/UI Toolkit - MultiFile Selector (Editor).meta +9 -0
- package/Shaders/Materials/BackgroundMask-Material.mat +59 -59
- package/Shaders/Materials/BackgroundMask-Material.mat.meta +8 -8
- package/Shaders/Materials.meta +8 -8
- package/Shaders/ShaderGraph/BackgroundMask.shadergraph +1653 -1653
- package/Shaders/ShaderGraph/BackgroundMask.shadergraph.meta +10 -10
- package/Shaders/ShaderGraph/DebugDisplayValue.shadersubgraph +835 -835
- package/Shaders/ShaderGraph/DebugDisplayValue.shadersubgraph.meta +10 -10
- package/Shaders/ShaderGraph.meta +8 -8
- package/Shaders/Support/EnhancedImageSupport.shader +64 -0
- package/Shaders/Support/EnhancedImageSupport.shader.meta +9 -0
- package/Shaders/Support.meta +8 -0
- package/Shaders.meta +8 -8
- package/Styles/Elements/Progress/ArcedProgressBar.cs +345 -345
- package/Styles/Elements/Progress/ArcedProgressBar.cs.meta +2 -2
- package/Styles/Elements/Progress/CircularProgressBar.cs +307 -307
- package/Styles/Elements/Progress/CircularProgressBar.cs.meta +2 -2
- package/Styles/Elements/Progress/GlitchProgressBar.cs +416 -416
- package/Styles/Elements/Progress/GlitchProgressBar.cs.meta +2 -2
- package/Styles/Elements/Progress/LiquidProgressBar.cs +632 -632
- package/Styles/Elements/Progress/LiquidProgressBar.cs.meta +2 -2
- package/Styles/Elements/Progress/MarchingAntsProgressBar.cs +722 -722
- package/Styles/Elements/Progress/MarchingAntsProgressBar.cs.meta +2 -2
- package/Styles/Elements/Progress/RegularProgressBar.cs +405 -405
- package/Styles/Elements/Progress/RegularProgressBar.cs.meta +2 -2
- package/Styles/Elements/Progress/WigglyProgressBar.cs +837 -837
- package/Styles/Elements/Progress/WigglyProgressBar.cs.meta +2 -2
- package/Styles/Elements/Progress.meta +2 -2
- package/Styles/Elements.meta +2 -2
- package/Styles/USS/ArcedProgressBar.uss +18 -18
- package/Styles/USS/ArcedProgressBar.uss.meta +2 -2
- package/Styles/USS/CirclularProgressBar.uss +17 -17
- package/Styles/USS/CirclularProgressBar.uss.meta +2 -2
- package/Styles/USS/RegularProgressBar.uss +32 -32
- package/Styles/USS/RegularProgressBar.uss.meta +2 -2
- package/Styles/USS/WigglyProgressBar.uss +16 -16
- package/Styles/USS/WigglyProgressBar.uss.meta +2 -2
- package/Styles/USS.meta +2 -2
- package/Styles/WallstopStudios.UnityHelpers.Styles.asmdef +14 -17
- package/Styles/WallstopStudios.UnityHelpers.Styles.asmdef.meta +7 -7
- package/Styles.meta +2 -2
- package/THIRD_PARTY_NOTICES.md +74 -0
- package/THIRD_PARTY_NOTICES.md.meta +7 -0
- package/Tests/Editor/Attributes/AnimationEventHelpersTests.cs +171 -0
- package/Tests/Editor/Attributes/AnimationEventHelpersTests.cs.meta +11 -0
- package/Tests/Editor/Attributes.meta +8 -0
- package/Tests/Editor/Core/Attributes/RelationalComponentAssignerTests.cs +118 -0
- package/Tests/Editor/Core/Attributes/RelationalComponentAssignerTests.cs.meta +11 -0
- package/Tests/Editor/Core/Attributes.meta +8 -0
- package/Tests/Editor/Core.meta +8 -0
- package/Tests/Editor/Extensions/SerializedPropertyExtensionsTests.cs +194 -0
- package/Tests/Editor/Extensions/SerializedPropertyExtensionsTests.cs.meta +3 -0
- package/Tests/Editor/Extensions.meta +3 -0
- package/Tests/Editor/Helper/DummyScriptableObject.cs +6 -0
- package/Tests/Editor/Helper/DummyScriptableObject.cs.meta +3 -0
- package/Tests/Editor/Helper/HelpersTests.cs +101 -0
- package/Tests/Editor/Helper/HelpersTests.cs.meta +3 -0
- package/Tests/Editor/Helper/ObjectHelpersEditorTests.cs +63 -0
- package/Tests/Editor/Helper/ObjectHelpersEditorTests.cs.meta +11 -0
- package/Tests/Editor/Helper/PromptScope.cs +28 -0
- package/Tests/Editor/Helper/PromptScope.cs.meta +11 -0
- package/Tests/Editor/Helper/ReflectionHelpersEditorTests.cs +105 -0
- package/Tests/Editor/Helper/ReflectionHelpersEditorTests.cs.meta +11 -0
- package/Tests/Editor/Helper/SpriteHelpersTests.cs +334 -0
- package/Tests/Editor/Helper/SpriteHelpersTests.cs.meta +3 -0
- package/Tests/Editor/Helper/SpriteSettingsApplierAdditionalTests.cs +183 -0
- package/Tests/Editor/Helper/SpriteSettingsApplierAdditionalTests.cs.meta +11 -0
- package/Tests/Editor/Helper/SpriteSettingsApplierTests.cs +161 -0
- package/Tests/Editor/Helper/SpriteSettingsApplierTests.cs.meta +11 -0
- package/Tests/Editor/Helper.meta +3 -0
- package/Tests/Editor/Integrations/VContainer/VContainerIntegrationCompilationTests.cs +40 -0
- package/Tests/Editor/Integrations/VContainer/VContainerIntegrationCompilationTests.cs.meta +11 -0
- package/Tests/Editor/Integrations/VContainer/VContainerRelationalEntryPointTests.cs +81 -0
- package/Tests/Editor/Integrations/VContainer/VContainerRelationalEntryPointTests.cs.meta +11 -0
- package/Tests/Editor/Integrations/VContainer/VContainerRelationalHelpersTests.cs +170 -0
- package/Tests/Editor/Integrations/VContainer/VContainerRelationalHelpersTests.cs.meta +11 -0
- package/Tests/Editor/Integrations/VContainer/WallstopStudios.UnityHelpers.Tests.Editor.VContainer.asmdef +37 -0
- package/Tests/Editor/Integrations/VContainer/WallstopStudios.UnityHelpers.Tests.Editor.VContainer.asmdef.meta +7 -0
- package/Tests/Editor/Integrations/VContainer.meta +8 -0
- package/Tests/Editor/Integrations/Zenject/WallstopStudios.UnityHelpers.Tests.Editor.Zenject.asmdef +37 -0
- package/Tests/Editor/Integrations/Zenject/WallstopStudios.UnityHelpers.Tests.Editor.Zenject.asmdef.meta +7 -0
- package/Tests/Editor/Integrations/Zenject/ZenjectIntegrationCompilationTests.cs +40 -0
- package/Tests/Editor/Integrations/Zenject/ZenjectIntegrationCompilationTests.cs.meta +11 -0
- package/Tests/Editor/Integrations/Zenject/ZenjectRelationalHelpersTests.cs +131 -0
- package/Tests/Editor/Integrations/Zenject/ZenjectRelationalHelpersTests.cs.meta +11 -0
- package/Tests/Editor/Integrations/Zenject/ZenjectRelationalInitializerTests.cs +80 -0
- package/Tests/Editor/Integrations/Zenject/ZenjectRelationalInitializerTests.cs.meta +11 -0
- package/Tests/Editor/Integrations/Zenject.meta +8 -0
- package/Tests/Editor/Integrations.meta +8 -0
- package/Tests/Editor/MultiFileSelectorElementTests.cs +265 -0
- package/Tests/Editor/MultiFileSelectorElementTests.cs.meta +11 -0
- package/Tests/Editor/MultiFileSelectorPersistenceManagerTests.cs +100 -0
- package/Tests/Editor/MultiFileSelectorPersistenceManagerTests.cs.meta +11 -0
- package/Tests/Editor/PersistentDirectorySettingsTests.cs +59 -0
- package/Tests/Editor/PersistentDirectorySettingsTests.cs.meta +11 -0
- package/Tests/Editor/PrefabCheckerReportTests.cs +32 -0
- package/Tests/Editor/PrefabCheckerReportTests.cs.meta +11 -0
- package/Tests/Editor/Sprites/AnimationCopierFilterTests.cs +64 -0
- package/Tests/Editor/Sprites/AnimationCopierFilterTests.cs.meta +11 -0
- package/Tests/Editor/Sprites/AnimationCopierWindowTests.cs +199 -0
- package/Tests/Editor/Sprites/AnimationCopierWindowTests.cs.meta +11 -0
- package/Tests/Editor/Sprites/AnimationViewerWindowTests.cs +38 -0
- package/Tests/Editor/Sprites/AnimationViewerWindowTests.cs.meta +11 -0
- package/Tests/Editor/Sprites/ScriptableSpriteAtlasEditorTests.cs +108 -0
- package/Tests/Editor/Sprites/ScriptableSpriteAtlasEditorTests.cs.meta +11 -0
- package/Tests/Editor/Sprites/SpriteCropperAdditionalTests.cs +323 -0
- package/Tests/Editor/Sprites/SpriteCropperAdditionalTests.cs.meta +11 -0
- package/Tests/Editor/Sprites/SpriteCropperTests.cs +162 -0
- package/Tests/Editor/Sprites/SpriteCropperTests.cs.meta +11 -0
- package/Tests/Editor/Sprites/SpritePivotAdjusterAdditionalTests.cs +227 -0
- package/Tests/Editor/Sprites/SpritePivotAdjusterAdditionalTests.cs.meta +11 -0
- package/Tests/Editor/Sprites/SpritePivotAdjusterTests.cs +113 -0
- package/Tests/Editor/Sprites/SpritePivotAdjusterTests.cs.meta +11 -0
- package/Tests/Editor/Sprites/TexturePlatformNameHelperTests.cs +46 -0
- package/Tests/Editor/Sprites/TexturePlatformNameHelperTests.cs.meta +11 -0
- package/Tests/Editor/Sprites/TextureResizerWizardTests.cs +248 -0
- package/Tests/Editor/Sprites/TextureResizerWizardTests.cs.meta +11 -0
- package/Tests/Editor/Sprites/TextureSettingsApplierAPITests.cs +180 -0
- package/Tests/Editor/Sprites/TextureSettingsApplierAPITests.cs.meta +11 -0
- package/Tests/Editor/Sprites/TextureSettingsApplierWizardAdditionalTests.cs +295 -0
- package/Tests/Editor/Sprites/TextureSettingsApplierWizardAdditionalTests.cs.meta +11 -0
- package/Tests/Editor/Sprites/TextureSettingsApplierWizardTests.cs +134 -0
- package/Tests/Editor/Sprites/TextureSettingsApplierWizardTests.cs.meta +11 -0
- package/Tests/Editor/Sprites.meta +8 -0
- package/Tests/Editor/TestComponents/PrewarmTesterComponent.cs +10 -0
- package/Tests/Editor/TestComponents/PrewarmTesterComponent.cs.meta +11 -0
- package/Tests/Editor/TestComponents.meta +8 -0
- package/Tests/Editor/Tools/ImageBlurToolTests.cs +47 -0
- package/Tests/Editor/Tools/ImageBlurToolTests.cs.meta +11 -0
- package/Tests/Editor/Tools.meta +8 -0
- package/Tests/Editor/Utils/CommonTestBase.cs +250 -0
- package/Tests/Editor/Utils/CommonTestBase.cs.meta +11 -0
- package/Tests/Editor/Utils/ScriptableObjectSingletonCreatorEditorTests.cs +306 -0
- package/Tests/Editor/Utils/ScriptableObjectSingletonCreatorEditorTests.cs.meta +9 -0
- package/Tests/Editor/Utils/ScriptableObjectSingletonCreatorTests.cs +183 -0
- package/Tests/Editor/Utils/ScriptableObjectSingletonCreatorTests.cs.meta +11 -0
- package/Tests/Editor/Utils/ScriptableObjectSingletonTests.cs +466 -0
- package/Tests/Editor/Utils/ScriptableObjectSingletonTests.cs.meta +11 -0
- package/Tests/Editor/Utils.meta +3 -0
- package/Tests/Editor/WallstopStudios.UnityHelpers.Tests.Editor.asmdef +19 -0
- package/Tests/Editor/WallstopStudios.UnityHelpers.Tests.Editor.asmdef.meta +7 -0
- package/Tests/Editor/Windows/FitTextureSizeWindowTests.cs +773 -0
- package/Tests/Editor/Windows/FitTextureSizeWindowTests.cs.meta +11 -0
- package/Tests/Editor/Windows/PrefabCheckerFolderAdditionTests.cs +96 -0
- package/Tests/Editor/Windows/PrefabCheckerFolderAdditionTests.cs.meta +11 -0
- package/Tests/Editor/Windows/PrefabCheckerTests.cs +81 -0
- package/Tests/Editor/Windows/PrefabCheckerTests.cs.meta +11 -0
- package/Tests/Editor/Windows.meta +8 -0
- package/Tests/Editor.meta +8 -0
- package/Tests/Runtime/AssemblyInfo.cs +4 -0
- package/Tests/Runtime/AssemblyInfo.cs.meta +3 -0
- package/Tests/Runtime/Attributes/ChildComponentTests.cs +766 -81
- package/Tests/Runtime/Attributes/ChildComponentTests.cs.meta +2 -2
- package/Tests/Runtime/Attributes/Components/ExpectChildSpriteRenderers.cs +28 -28
- package/Tests/Runtime/Attributes/Components/ExpectChildSpriteRenderers.cs.meta +2 -2
- package/Tests/Runtime/Attributes/Components/ExpectParentSpriteRenderers.cs +28 -28
- package/Tests/Runtime/Attributes/Components/ExpectParentSpriteRenderers.cs.meta +2 -2
- package/Tests/Runtime/{Components → Attributes/Components}/RelationalComponentTesterComplex.cs +34 -34
- package/Tests/Runtime/{Components → Attributes/Components}/RelationalComponentTesterComplex.cs.meta +2 -2
- package/Tests/Runtime/Attributes/Components/RelationalComponentsTesterSimple.cs +37 -0
- package/Tests/Runtime/{Components → Attributes/Components}/RelationalComponentsTesterSimple.cs.meta +2 -2
- package/Tests/Runtime/Attributes/Components.meta +2 -2
- package/Tests/Runtime/Attributes/MiscRuntimeAttributeTests.cs +75 -0
- package/Tests/Runtime/Attributes/MiscRuntimeAttributeTests.cs.meta +11 -0
- package/Tests/Runtime/Attributes/NotNullAttributeTests.cs +26 -0
- package/Tests/Runtime/Attributes/NotNullAttributeTests.cs.meta +3 -0
- package/Tests/Runtime/Attributes/ParentComponentTests.cs +565 -68
- package/Tests/Runtime/Attributes/ParentComponentTests.cs.meta +2 -2
- package/Tests/Runtime/Attributes/RelationalComponentAdvancedTests.cs +614 -0
- package/Tests/Runtime/Attributes/RelationalComponentAdvancedTests.cs.meta +11 -0
- package/Tests/Runtime/Attributes/RelationalComponentBackwardCompatibilityTests.cs +478 -0
- package/Tests/Runtime/Attributes/RelationalComponentBackwardCompatibilityTests.cs.meta +11 -0
- package/Tests/Runtime/Attributes/RelationalComponentExtensionsTests.cs +56 -0
- package/Tests/Runtime/Attributes/RelationalComponentExtensionsTests.cs.meta +11 -0
- package/Tests/Runtime/Attributes/RelationalComponentHashSetTests.cs +226 -0
- package/Tests/Runtime/Attributes/RelationalComponentHashSetTests.cs.meta +11 -0
- package/Tests/Runtime/Attributes/RelationalComponentInitializerTests.cs +98 -0
- package/Tests/Runtime/Attributes/RelationalComponentInitializerTests.cs.meta +11 -0
- package/Tests/Runtime/Attributes/RelationalComponentTagAndNameFilterEdgeTests.cs +234 -0
- package/Tests/Runtime/Attributes/RelationalComponentTagAndNameFilterEdgeTests.cs.meta +11 -0
- package/Tests/Runtime/Attributes/SiblingComponentTests.cs +721 -0
- package/Tests/Runtime/Attributes/SiblingComponentTests.cs.meta +11 -0
- package/Tests/Runtime/Attributes/ValidateAssignmentAttributeTests.cs +96 -0
- package/Tests/Runtime/Attributes/ValidateAssignmentAttributeTests.cs.meta +11 -0
- package/Tests/Runtime/Attributes.meta +2 -2
- package/Tests/Runtime/Core/Random/RandomComparerTests.cs +166 -0
- package/Tests/Runtime/Core/Random/RandomComparerTests.cs.meta +11 -0
- package/Tests/Runtime/Core/Random.meta +8 -0
- package/Tests/Runtime/Core/Threading/SingleThreadedThreadPoolTests.cs +56 -56
- package/Tests/Runtime/Core/Threading/SingleThreadedThreadPoolTests.cs.meta +2 -2
- package/Tests/Runtime/Core/Threading.meta +2 -2
- package/Tests/Runtime/Core.meta +2 -2
- package/Tests/Runtime/DataStructures/BalancedKDTree2DTests.cs +562 -0
- package/Tests/Runtime/DataStructures/{BalancedKDTreeTests.cs.meta → BalancedKDTree2DTests.cs.meta} +11 -11
- package/Tests/Runtime/DataStructures/BalancedKDTree3DTests.cs +10 -0
- package/Tests/Runtime/DataStructures/BalancedKDTree3DTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/BitSetTests.cs +1400 -0
- package/Tests/Runtime/DataStructures/BitSetTests.cs.meta +3 -0
- package/Tests/Runtime/DataStructures/BoundingBox3DTests.cs +1215 -0
- package/Tests/Runtime/DataStructures/BoundingBox3DTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/CircleTests.cs +965 -0
- package/Tests/Runtime/DataStructures/CircleTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/CyclicBufferTests.cs +2083 -324
- package/Tests/Runtime/DataStructures/CyclicBufferTests.cs.meta +2 -2
- package/Tests/Runtime/DataStructures/DequeTests.cs +790 -0
- package/Tests/Runtime/DataStructures/DequeTests.cs.meta +3 -0
- package/Tests/Runtime/DataStructures/DisjointSetTests.cs +1114 -0
- package/Tests/Runtime/DataStructures/DisjointSetTests.cs.meta +3 -0
- package/Tests/Runtime/DataStructures/FastOneOfTests.cs +966 -0
- package/Tests/Runtime/DataStructures/FastOneOfTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/FastVector2IntTests.cs +286 -0
- package/Tests/Runtime/DataStructures/FastVector2IntTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/FastVector3IntTests.cs +414 -0
- package/Tests/Runtime/DataStructures/FastVector3IntTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/HeapTests.cs +1953 -0
- package/Tests/Runtime/DataStructures/HeapTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/ImmutableBitSetTests.cs +833 -0
- package/Tests/Runtime/DataStructures/ImmutableBitSetTests.cs.meta +3 -0
- package/Tests/Runtime/DataStructures/KDTree3DTestsBase.cs +297 -0
- package/Tests/Runtime/DataStructures/KDTree3DTestsBase.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/OctTree3DTests.cs +351 -0
- package/Tests/Runtime/DataStructures/OctTree3DTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/PriorityQueueTests.cs +71 -0
- package/Tests/Runtime/DataStructures/PriorityQueueTests.cs.meta +3 -0
- package/Tests/Runtime/DataStructures/ProtobufSerializationTests.cs +475 -0
- package/Tests/Runtime/DataStructures/ProtobufSerializationTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/QuadTree2DTests.cs +660 -0
- package/Tests/Runtime/DataStructures/QuadTree2DTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/RTree2DTests.cs +823 -0
- package/Tests/Runtime/DataStructures/RTree2DTests.cs.meta +3 -0
- package/Tests/Runtime/DataStructures/RTree3DTests.cs +270 -0
- package/Tests/Runtime/DataStructures/RTree3DTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/SparseSetTests.cs +1146 -0
- package/Tests/Runtime/DataStructures/SparseSetTests.cs.meta +3 -0
- package/Tests/Runtime/DataStructures/SpatialHashTests.cs +992 -0
- package/Tests/Runtime/DataStructures/SpatialHashTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/SpatialTree2DBoundsConsistencyTests.cs +351 -0
- package/Tests/Runtime/DataStructures/SpatialTree2DBoundsConsistencyTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/SpatialTree2DBoundsEdgeTests.cs +127 -0
- package/Tests/Runtime/DataStructures/SpatialTree2DBoundsEdgeTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/SpatialTree2DBoundsFuzzTests.cs +218 -0
- package/Tests/Runtime/DataStructures/SpatialTree2DBoundsFuzzTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/SpatialTree2DTests.cs +396 -0
- package/Tests/Runtime/DataStructures/SpatialTree2DTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/SpatialTree3DBoundsConsistencyTests.cs +281 -0
- package/Tests/Runtime/DataStructures/SpatialTree3DBoundsConsistencyTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/SpatialTree3DBoundsEdgeTests.cs +127 -0
- package/Tests/Runtime/DataStructures/SpatialTree3DBoundsEdgeTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/SpatialTree3DBoundsFuzzTests.cs +170 -0
- package/Tests/Runtime/DataStructures/SpatialTree3DBoundsFuzzTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/SpatialTree3DTests.cs +474 -0
- package/Tests/Runtime/DataStructures/SpatialTree3DTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/SphereTests.cs +806 -0
- package/Tests/Runtime/DataStructures/SphereTests.cs.meta +3 -0
- package/Tests/Runtime/DataStructures/StringWrapperTests.cs +333 -0
- package/Tests/Runtime/DataStructures/StringWrapperTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/TimedCacheTests.cs +669 -0
- package/Tests/Runtime/DataStructures/TimedCacheTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/TrieTests.cs +3385 -0
- package/Tests/Runtime/DataStructures/TrieTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures/UnbalancedKDTree2DTests.cs +565 -0
- package/Tests/Runtime/DataStructures/{UnbalancedKDTreeTests.cs.meta → UnbalancedKDTree2DTests.cs.meta} +11 -11
- package/Tests/Runtime/DataStructures/UnbalancedKDTree3DTests.cs +10 -0
- package/Tests/Runtime/DataStructures/UnbalancedKDTree3DTests.cs.meta +11 -0
- package/Tests/Runtime/DataStructures.meta +8 -8
- package/Tests/Runtime/Extensions/AnimatorExtensionsTests.cs +28 -0
- package/Tests/Runtime/Extensions/AnimatorExtensionsTests.cs.meta +11 -0
- package/Tests/Runtime/Extensions/AsyncOperationExtensionsTests.cs +667 -0
- package/Tests/Runtime/Extensions/AsyncOperationExtensionsTests.cs.meta +11 -0
- package/Tests/Runtime/Extensions/CircleExtensionsTests.cs +230 -0
- package/Tests/Runtime/Extensions/CircleExtensionsTests.cs.meta +11 -0
- package/Tests/Runtime/Extensions/ColorExtensionsTests.cs +55 -0
- package/Tests/Runtime/Extensions/ColorExtensionsTests.cs.meta +11 -0
- package/Tests/Runtime/Extensions/DictionaryExtensionTests.cs +724 -438
- package/Tests/Runtime/Extensions/DictionaryExtensionTests.cs.meta +2 -2
- package/Tests/Runtime/Extensions/DirectionExtensionsComprehensiveTests.cs +403 -0
- package/Tests/Runtime/Extensions/DirectionExtensionsComprehensiveTests.cs.meta +11 -0
- package/Tests/Runtime/Extensions/DirectionExtensionsTests.cs +69 -0
- package/Tests/Runtime/Extensions/DirectionExtensionsTests.cs.meta +11 -0
- package/Tests/Runtime/Extensions/EnumExtensionTests.cs +809 -153
- package/Tests/Runtime/Extensions/EnumExtensionTests.cs.meta +2 -2
- package/Tests/Runtime/Extensions/IEnumerableExtensionsTests.cs +191 -0
- package/Tests/Runtime/Extensions/IEnumerableExtensionsTests.cs.meta +11 -0
- package/Tests/Runtime/Extensions/IListExtensionTests.cs +955 -169
- package/Tests/Runtime/Extensions/IListExtensionTests.cs.meta +2 -2
- package/Tests/Runtime/Extensions/IReadonlyListExtensionTests.cs +266 -58
- package/Tests/Runtime/Extensions/IReadonlyListExtensionTests.cs.meta +2 -2
- package/Tests/Runtime/Extensions/LoggingExtensionTests.cs +721 -718
- package/Tests/Runtime/Extensions/LoggingExtensionTests.cs.meta +2 -2
- package/Tests/Runtime/Extensions/ProtoEqualityExtensionsTests.cs +565 -0
- package/Tests/Runtime/Extensions/ProtoEqualityExtensionsTests.cs.meta +3 -0
- package/Tests/Runtime/Extensions/ProtoEqualityPolymorphismTests.cs +100 -0
- package/Tests/Runtime/Extensions/ProtoEqualityPolymorphismTests.cs.meta +11 -0
- package/Tests/Runtime/Extensions/RandomExtensionTests.cs +719 -27
- package/Tests/Runtime/Extensions/RandomExtensionTests.cs.meta +2 -2
- package/Tests/Runtime/Extensions/StringExtensionTests.cs +2592 -31
- package/Tests/Runtime/Extensions/StringExtensionTests.cs.meta +2 -2
- package/Tests/Runtime/Extensions/UnityExtensionsBasicTests.cs +166 -0
- package/Tests/Runtime/Extensions/UnityExtensionsBasicTests.cs.meta +11 -0
- package/Tests/Runtime/Extensions/UnityExtensionsComprehensiveTests.cs +1446 -0
- package/Tests/Runtime/Extensions/UnityExtensionsComprehensiveTests.cs.meta +11 -0
- package/Tests/Runtime/Extensions/UnityExtensionsMathTests.cs +1779 -0
- package/Tests/Runtime/Extensions/UnityExtensionsMathTests.cs.meta +11 -0
- package/Tests/Runtime/Extensions/UnityExtensionsVector2HullTests.cs +292 -0
- package/Tests/Runtime/Extensions/UnityExtensionsVector2HullTests.cs.meta +11 -0
- package/Tests/Runtime/Extensions/UnityLogTagFormatterEdgeTests.cs +260 -0
- package/Tests/Runtime/Extensions/UnityLogTagFormatterEdgeTests.cs.meta +11 -0
- package/Tests/Runtime/Extensions.meta +2 -2
- package/Tests/Runtime/Helper/ArrayConverterTests.cs +19 -19
- package/Tests/Runtime/Helper/ArrayConverterTests.cs.meta +2 -2
- package/Tests/Runtime/Helper/AssignUtilitiesTests.cs +38 -0
- package/Tests/Runtime/Helper/AssignUtilitiesTests.cs.meta +11 -0
- package/Tests/Runtime/Helper/DirectoryHelperTests.cs +347 -0
- package/Tests/Runtime/Helper/DirectoryHelperTests.cs.meta +11 -0
- package/Tests/Runtime/Helper/EnumerablesTests.cs +45 -0
- package/Tests/Runtime/Helper/EnumerablesTests.cs.meta +11 -0
- package/Tests/Runtime/Helper/FileHelperTests.cs +481 -0
- package/Tests/Runtime/Helper/FileHelperTests.cs.meta +11 -0
- package/Tests/Runtime/Helper/FormattingHelpersTests.cs +353 -0
- package/Tests/Runtime/Helper/FormattingHelpersTests.cs.meta +11 -0
- package/Tests/Runtime/Helper/FuncBasedComparerTests.cs +27 -0
- package/Tests/Runtime/Helper/FuncBasedComparerTests.cs.meta +11 -0
- package/Tests/Runtime/Helper/GeometryTests.cs +517 -0
- package/Tests/Runtime/Helper/GeometryTests.cs.meta +3 -0
- package/Tests/Runtime/Helper/HelpersTests.cs +749 -0
- package/Tests/Runtime/Helper/HelpersTests.cs.meta +11 -0
- package/Tests/Runtime/Helper/IterationHelpersTests.cs +173 -0
- package/Tests/Runtime/Helper/IterationHelpersTests.cs.meta +11 -0
- package/Tests/Runtime/Helper/LineHelperTests.cs +662 -0
- package/Tests/Runtime/Helper/LineHelperTests.cs.meta +11 -0
- package/Tests/Runtime/Helper/ObjectHelperTests.cs +444 -432
- package/Tests/Runtime/Helper/ObjectHelperTests.cs.meta +2 -2
- package/Tests/Runtime/Helper/ObjectsTests.cs +363 -0
- package/Tests/Runtime/Helper/ObjectsTests.cs.meta +3 -0
- package/Tests/Runtime/Helper/PathHelperTests.cs +183 -0
- package/Tests/Runtime/Helper/PathHelperTests.cs.meta +11 -0
- package/Tests/Runtime/Helper/ReflectionHelperTests.cs +2199 -1493
- package/Tests/Runtime/Helper/ReflectionHelperTests.cs.meta +2 -2
- package/Tests/Runtime/Helper/ReflectionHelpersMemberLookupTests.cs +192 -0
- package/Tests/Runtime/Helper/ReflectionHelpersMemberLookupTests.cs.meta +11 -0
- package/Tests/Runtime/Helper/ReflectionHelpersTypeScanningTests.cs +58 -0
- package/Tests/Runtime/Helper/ReflectionHelpersTypeScanningTests.cs.meta +11 -0
- package/Tests/Runtime/Helper/SceneHelperTests.cs +77 -94
- package/Tests/Runtime/Helper/SceneHelperTests.cs.meta +2 -2
- package/Tests/Runtime/Helper/UnityMainThreadDispatcherTests.cs +45 -0
- package/Tests/Runtime/Helper/UnityMainThreadDispatcherTests.cs.meta +11 -0
- package/Tests/Runtime/Helper/WallMathTests.cs +1884 -233
- package/Tests/Runtime/Helper/WallMathTests.cs.meta +2 -2
- package/Tests/Runtime/Helper.meta +2 -2
- package/Tests/Runtime/Integrations/VContainer/RelationalComponentsVContainerTests.cs +601 -0
- package/Tests/Runtime/Integrations/VContainer/RelationalComponentsVContainerTests.cs.meta +11 -0
- package/Tests/Runtime/Integrations/VContainer/RelationalObjectPoolsVContainerTests.cs +86 -0
- package/Tests/Runtime/Integrations/VContainer/RelationalObjectPoolsVContainerTests.cs.meta +11 -0
- package/Tests/Runtime/Integrations/VContainer/WallstopStudios.UnityHelpers.Tests.Runtime.VContainer.asmdef +38 -0
- package/Tests/Runtime/Integrations/VContainer/WallstopStudios.UnityHelpers.Tests.Runtime.VContainer.asmdef.meta +7 -0
- package/Tests/Runtime/Integrations/VContainer.meta +8 -0
- package/Tests/Runtime/Integrations/Zenject/RelationalComponentsZenjectTests.cs +619 -0
- package/Tests/Runtime/Integrations/Zenject/RelationalComponentsZenjectTests.cs.meta +11 -0
- package/Tests/Runtime/Integrations/Zenject/WallstopStudios.UnityHelpers.Tests.Runtime.Zenject.asmdef +38 -0
- package/Tests/Runtime/Integrations/Zenject/WallstopStudios.UnityHelpers.Tests.Runtime.Zenject.asmdef.meta +7 -0
- package/Tests/Runtime/Integrations/Zenject.meta +8 -0
- package/Tests/Runtime/Integrations.meta +8 -0
- package/Tests/Runtime/Math/Line2DTests.cs +594 -0
- package/Tests/Runtime/Math/Line2DTests.cs.meta +11 -0
- package/Tests/Runtime/Math/Line3DTests.cs +655 -0
- package/Tests/Runtime/Math/Line3DTests.cs.meta +11 -0
- package/Tests/Runtime/Math/LineTests.cs +480 -0
- package/Tests/Runtime/Math/LineTests.cs.meta +11 -0
- package/Tests/Runtime/Math/ParabolaTests.cs +477 -0
- package/Tests/Runtime/Math/ParabolaTests.cs.meta +11 -0
- package/Tests/Runtime/Math/PointPolygonCheckTests.cs +939 -0
- package/Tests/Runtime/Math/PointPolygonCheckTests.cs.meta +11 -0
- package/Tests/Runtime/Math/RangeTests.cs +197 -0
- package/Tests/Runtime/Math/RangeTests.cs.meta +11 -0
- package/Tests/Runtime/Math.meta +8 -0
- package/Tests/Runtime/Performance/BenchmarkReadmeUpdater.cs +81 -0
- package/Tests/Runtime/Performance/BenchmarkReadmeUpdater.cs.meta +11 -0
- package/Tests/Runtime/Performance/JsonSerializationPerformanceTests.cs +421 -0
- package/Tests/Runtime/Performance/JsonSerializationPerformanceTests.cs.meta +3 -0
- package/Tests/Runtime/Performance/ListExtensionPerformanceTests.cs +76 -76
- package/Tests/Runtime/Performance/ListExtensionPerformanceTests.cs.meta +2 -2
- package/Tests/Runtime/Performance/ProtoEqualsPerformanceTests.cs +161 -0
- package/Tests/Runtime/Performance/ProtoEqualsPerformanceTests.cs.meta +11 -0
- package/Tests/Runtime/Performance/ProtoSerializationPerformanceTests.cs +207 -0
- package/Tests/Runtime/Performance/ProtoSerializationPerformanceTests.cs.meta +3 -0
- package/Tests/Runtime/Performance/RandomPerformanceTests.cs +195 -181
- package/Tests/Runtime/Performance/RandomPerformanceTests.cs.meta +11 -11
- package/Tests/Runtime/Performance/RelationComponentPerformanceTests.cs +60 -61
- package/Tests/Runtime/Performance/RelationComponentPerformanceTests.cs.meta +2 -2
- package/Tests/Runtime/Performance/SpatialTree2DPerformanceTests.cs +697 -0
- package/Tests/Runtime/Performance/SpatialTree2DPerformanceTests.cs.meta +11 -0
- package/Tests/Runtime/Performance/SpatialTree3DPerformanceTests.cs +653 -0
- package/Tests/Runtime/Performance/SpatialTree3DPerformanceTests.cs.meta +11 -0
- package/Tests/Runtime/Performance.meta +8 -8
- package/Tests/Runtime/Random/DotNetRandomTests.cs +9 -9
- package/Tests/Runtime/Random/DotNetRandomTests.cs.meta +2 -2
- package/Tests/Runtime/Random/IllusionFlowTests.cs +12 -12
- package/Tests/Runtime/Random/IllusionFlowTests.cs.meta +2 -2
- package/Tests/Runtime/Random/LinearCongruentialGeneratorTests.cs +12 -12
- package/Tests/Runtime/Random/LinearCongruentialGeneratorTests.cs.meta +2 -2
- package/Tests/Runtime/Random/PcgRandomTests.cs +9 -9
- package/Tests/Runtime/Random/PcgRandomTests.cs.meta +11 -11
- package/Tests/Runtime/Random/RandomProtoSerializationTests.cs +494 -0
- package/Tests/Runtime/Random/RandomProtoSerializationTests.cs.meta +3 -0
- package/Tests/Runtime/Random/RandomStateSerializationTests.cs +304 -0
- package/Tests/Runtime/Random/RandomStateSerializationTests.cs.meta +4 -0
- package/Tests/Runtime/Random/RandomTestBase.cs +836 -787
- package/Tests/Runtime/Random/RandomTestBase.cs.meta +11 -11
- package/Tests/Runtime/Random/RomuDuoRandomTests.cs +9 -9
- package/Tests/Runtime/Random/RomuDuoRandomTests.cs.meta +2 -2
- package/Tests/Runtime/Random/SplitMix64RandomTests.cs +9 -9
- package/Tests/Runtime/Random/SplitMix64RandomTests.cs.meta +2 -2
- package/Tests/Runtime/Random/SquirrelRandomTests.cs +14 -14
- package/Tests/Runtime/Random/SquirrelRandomTests.cs.meta +11 -11
- package/Tests/Runtime/Random/SystemRandomTests.cs +10 -10
- package/Tests/Runtime/Random/SystemRandomTests.cs.meta +11 -11
- package/Tests/Runtime/Random/UnityRandomTests.cs +9 -9
- package/Tests/Runtime/Random/UnityRandomTests.cs.meta +11 -11
- package/Tests/Runtime/Random/WyRandomTests.cs +9 -9
- package/Tests/Runtime/Random/WyRandomTests.cs.meta +2 -2
- package/Tests/Runtime/Random/XorShiftRandomTests.cs +9 -9
- package/Tests/Runtime/Random/XorShiftRandomTests.cs.meta +11 -11
- package/Tests/Runtime/Random/XoroShiroRandomTests.cs +9 -9
- package/Tests/Runtime/Random/XoroShiroRandomTests.cs.meta +2 -2
- package/Tests/Runtime/Random.meta +8 -8
- package/Tests/Runtime/RuntimeTestTimeouts.cs +3 -0
- package/Tests/Runtime/RuntimeTestTimeouts.cs.meta +11 -0
- package/Tests/Runtime/Scenes/Test1.unity +723 -723
- package/Tests/Runtime/Scenes/Test1.unity.meta +7 -7
- package/Tests/Runtime/Scenes/Test2.unity +723 -723
- package/Tests/Runtime/Scenes/Test2.unity.meta +7 -7
- package/Tests/Runtime/Scenes.meta +2 -2
- package/Tests/Runtime/Serialization/AdaptersJsonTests.cs +67 -0
- package/Tests/Runtime/Serialization/AdaptersJsonTests.cs.meta +11 -0
- package/Tests/Runtime/Serialization/BitSetJsonTests.cs +50 -0
- package/Tests/Runtime/Serialization/BitSetJsonTests.cs.meta +11 -0
- package/Tests/Runtime/Serialization/CyclicBufferJsonTests.cs +67 -0
- package/Tests/Runtime/Serialization/CyclicBufferJsonTests.cs.meta +11 -0
- package/Tests/Runtime/Serialization/DequeJsonTests.cs +70 -0
- package/Tests/Runtime/Serialization/DequeJsonTests.cs.meta +11 -0
- package/Tests/Runtime/Serialization/ImmutableBitSetJsonTests.cs +25 -0
- package/Tests/Runtime/Serialization/ImmutableBitSetJsonTests.cs.meta +11 -0
- package/Tests/Runtime/Serialization/JsonConverterAdditionalTests.cs +30 -0
- package/Tests/Runtime/Serialization/JsonConverterAdditionalTests.cs.meta +11 -0
- package/Tests/Runtime/Serialization/JsonConverterTests.cs +1153 -0
- package/Tests/Runtime/Serialization/JsonConverterTests.cs.meta +11 -0
- package/Tests/Runtime/Serialization/JsonRoundtripComprehensiveTests.cs +239 -0
- package/Tests/Runtime/Serialization/JsonRoundtripComprehensiveTests.cs.meta +11 -0
- package/Tests/Runtime/Serialization/JsonSerializationCorrectnessTests.cs +458 -0
- package/Tests/Runtime/Serialization/JsonSerializationCorrectnessTests.cs.meta +3 -0
- package/Tests/Runtime/Serialization/JsonSerializationTest.cs +167 -156
- package/Tests/Runtime/Serialization/JsonSerializationTest.cs.meta +2 -2
- package/Tests/Runtime/Serialization/MathJsonTests.cs +79 -0
- package/Tests/Runtime/Serialization/MathJsonTests.cs.meta +11 -0
- package/Tests/Runtime/Serialization/ProtoInterfaceResolutionEdgeTests.cs +76 -0
- package/Tests/Runtime/Serialization/ProtoInterfaceResolutionEdgeTests.cs.meta +11 -0
- package/Tests/Runtime/Serialization/ProtoRootRegistrationTests.cs +80 -0
- package/Tests/Runtime/Serialization/ProtoRootRegistrationTests.cs.meta +11 -0
- package/Tests/Runtime/Serialization/ProtoRoundtripComprehensiveTests.cs +257 -0
- package/Tests/Runtime/Serialization/ProtoRoundtripComprehensiveTests.cs.meta +11 -0
- package/Tests/Runtime/Serialization/ProtoSerializationCorrectnessTests.cs +471 -0
- package/Tests/Runtime/Serialization/ProtoSerializationCorrectnessTests.cs.meta +3 -0
- package/Tests/Runtime/Serialization/ProtoSerializationTests.cs +169 -0
- package/Tests/Runtime/Serialization/ProtoSerializationTests.cs.meta +11 -0
- package/Tests/Runtime/Serialization/ProtoSerializeBehaviorTests.cs +62 -0
- package/Tests/Runtime/Serialization/ProtoSerializeBehaviorTests.cs.meta +11 -0
- package/Tests/Runtime/Serialization/SerializerAdditionalTests.cs +907 -0
- package/Tests/Runtime/Serialization/SerializerAdditionalTests.cs.meta +3 -0
- package/Tests/Runtime/Serialization/SerializerFileIoTests.cs +105 -0
- package/Tests/Runtime/Serialization/SerializerFileIoTests.cs.meta +11 -0
- package/Tests/Runtime/Serialization/TypeConverterTests.cs +34 -0
- package/Tests/Runtime/Serialization/TypeConverterTests.cs.meta +11 -0
- package/Tests/Runtime/Serialization/UnityEngineObjectJsonTests.cs +247 -0
- package/Tests/Runtime/Serialization/UnityEngineObjectJsonTests.cs.meta +11 -0
- package/Tests/Runtime/Serialization.meta +2 -2
- package/Tests/Runtime/Tags/AttributeComponentTests.cs +174 -0
- package/Tests/Runtime/Tags/AttributeComponentTests.cs.meta +3 -0
- package/Tests/Runtime/Tags/AttributeDataTests.cs +312 -0
- package/Tests/Runtime/Tags/AttributeDataTests.cs.meta +11 -0
- package/Tests/Runtime/Tags/AttributeUtilitiesTests.cs +405 -0
- package/Tests/Runtime/Tags/AttributeUtilitiesTests.cs.meta +3 -0
- package/Tests/Runtime/Tags/CosmeticAndCollisionTests.cs +147 -0
- package/Tests/Runtime/Tags/CosmeticAndCollisionTests.cs.meta +11 -0
- package/Tests/Runtime/Tags/CosmeticEffectDataTests.cs +60 -0
- package/Tests/Runtime/Tags/CosmeticEffectDataTests.cs.meta +3 -0
- package/Tests/Runtime/Tags/EffectHandleTests.cs +61 -0
- package/Tests/Runtime/Tags/EffectHandleTests.cs.meta +3 -0
- package/Tests/Runtime/Tags/EffectHandlerTests.cs +270 -0
- package/Tests/Runtime/Tags/EffectHandlerTests.cs.meta +3 -0
- package/Tests/Runtime/Tags/Helpers/RecordingCosmeticComponent.cs +39 -0
- package/Tests/Runtime/Tags/Helpers/RecordingCosmeticComponent.cs.meta +3 -0
- package/Tests/Runtime/Tags/Helpers/TagTestBase.cs +49 -0
- package/Tests/Runtime/Tags/Helpers/TagTestBase.cs.meta +3 -0
- package/Tests/Runtime/Tags/Helpers/TestAttributesComponent.cs +28 -0
- package/Tests/Runtime/Tags/Helpers/TestAttributesComponent.cs.meta +3 -0
- package/Tests/Runtime/Tags/Helpers.meta +3 -0
- package/Tests/Runtime/Tags/TagHandlerTests.cs +108 -0
- package/Tests/Runtime/Tags/TagHandlerTests.cs.meta +3 -0
- package/Tests/Runtime/Tags.meta +8 -0
- package/Tests/Runtime/TestUtils/CommonTestBase.cs +301 -0
- package/Tests/Runtime/TestUtils/CommonTestBase.cs.meta +11 -0
- package/Tests/Runtime/TestUtils/GCAssert.cs +55 -0
- package/Tests/Runtime/TestUtils/GCAssert.cs.meta +11 -0
- package/Tests/Runtime/TestUtils/SpatialAssert.cs +33 -0
- package/Tests/Runtime/TestUtils/SpatialAssert.cs.meta +11 -0
- package/Tests/Runtime/TestUtils/SpatialDiagnostics.cs +195 -0
- package/Tests/Runtime/TestUtils/SpatialDiagnostics.cs.meta +11 -0
- package/Tests/Runtime/TestUtils.meta +8 -0
- package/Tests/Runtime/Utils/AnimationEventEqualityComparerTests.cs +144 -0
- package/Tests/Runtime/Utils/AnimationEventEqualityComparerTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/Ascii85Tests.cs +56 -0
- package/Tests/Runtime/Utils/Ascii85Tests.cs.meta +11 -0
- package/Tests/Runtime/Utils/BuffersTests.cs +1148 -741
- package/Tests/Runtime/Utils/BuffersTests.cs.meta +2 -2
- package/Tests/Runtime/Utils/BuffersWaitInstructionTests.cs +31 -0
- package/Tests/Runtime/Utils/BuffersWaitInstructionTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/CenterPointOffsetTests.cs +67 -0
- package/Tests/Runtime/Utils/CenterPointOffsetTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/ChildSpawnerTests.cs +490 -0
- package/Tests/Runtime/Utils/ChildSpawnerTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/CircleLineRendererTests.cs +80 -0
- package/Tests/Runtime/Utils/CircleLineRendererTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/CollisionProxyTests.cs +442 -0
- package/Tests/Runtime/Utils/CollisionProxyTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/CoroutineHandlerTests.cs +353 -0
- package/Tests/Runtime/Utils/CoroutineHandlerTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/DeferredDisposalResultTests.cs +44 -0
- package/Tests/Runtime/Utils/DeferredDisposalResultTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/LZMAComprehensiveTests.cs +249 -0
- package/Tests/Runtime/Utils/LZMAComprehensiveTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/LZMATests.cs +31 -0
- package/Tests/Runtime/Utils/LZMATests.cs.meta +11 -0
- package/Tests/Runtime/Utils/MatchColliderToSpriteAdditionalTests.cs +86 -0
- package/Tests/Runtime/Utils/MatchColliderToSpriteAdditionalTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/MatchColliderToSpriteTests.cs +503 -0
- package/Tests/Runtime/Utils/MatchColliderToSpriteTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/MatchTransformEdgeTests.cs +34 -0
- package/Tests/Runtime/Utils/MatchTransformEdgeTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/MatchTransformTests.cs +495 -0
- package/Tests/Runtime/Utils/MatchTransformTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/OscillatorTests.cs +540 -0
- package/Tests/Runtime/Utils/OscillatorTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/PolygonCollider2DOptimizerTests.cs +52 -0
- package/Tests/Runtime/Utils/PolygonCollider2DOptimizerTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/RuntimeSingletonTests.cs +766 -0
- package/Tests/Runtime/Utils/RuntimeSingletonTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/SerializedStringComparerEdgeTests.cs +47 -0
- package/Tests/Runtime/Utils/SerializedStringComparerEdgeTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/SerializedStringComparerTests.cs +361 -0
- package/Tests/Runtime/Utils/SerializedStringComparerTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/SpriteRendererMetadataTests.cs +383 -398
- package/Tests/Runtime/Utils/SpriteRendererMetadataTests.cs.meta +2 -2
- package/Tests/Runtime/Utils/SpriteRendererSyncTests.cs +134 -0
- package/Tests/Runtime/Utils/SpriteRendererSyncTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/StartTrackerTests.cs +24 -0
- package/Tests/Runtime/Utils/StartTrackerTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/TextureScaleEdgeTests.cs +114 -0
- package/Tests/Runtime/Utils/TextureScaleEdgeTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/TextureScaleTests.cs +298 -0
- package/Tests/Runtime/Utils/TextureScaleTests.cs.meta +3 -0
- package/Tests/Runtime/Utils/TypeNameSorterAdditionalTests.cs +36 -0
- package/Tests/Runtime/Utils/TypeNameSorterAdditionalTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/TypeNameSorterTests.cs +34 -0
- package/Tests/Runtime/Utils/TypeNameSorterTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/UnityObjectNameComparerEdgeTests.cs +63 -0
- package/Tests/Runtime/Utils/UnityObjectNameComparerEdgeTests.cs.meta +11 -0
- package/Tests/Runtime/Utils/UnityObjectNameComparerTests.cs +59 -0
- package/Tests/Runtime/Utils/UnityObjectNameComparerTests.cs.meta +11 -0
- package/Tests/Runtime/Utils.meta +2 -2
- package/Tests/Runtime/Visuals/AnimatedSpriteLayerTests.cs +266 -0
- package/Tests/Runtime/Visuals/AnimatedSpriteLayerTests.cs.meta +11 -0
- package/Tests/Runtime/Visuals/EnhancedImageTests.cs +153 -0
- package/Tests/Runtime/Visuals/EnhancedImageTests.cs.meta +11 -0
- package/Tests/Runtime/Visuals/LayeredImageTests.cs +422 -0
- package/Tests/Runtime/Visuals/LayeredImageTests.cs.meta +11 -0
- package/Tests/Runtime/Visuals/VisualsTestHelpers.cs +125 -0
- package/Tests/Runtime/Visuals/VisualsTestHelpers.cs.meta +11 -0
- package/Tests/Runtime/Visuals.meta +3 -0
- package/Tests/Runtime/WallstopStudios.UnityHelpers.Tests.Runtime.asmdef +24 -23
- package/Tests/Runtime/WallstopStudios.UnityHelpers.Tests.Runtime.asmdef.meta +7 -7
- package/Tests/Runtime.meta +8 -8
- package/Tests.meta +8 -8
- package/URP/VolumeProfiles/Post Processing Bloom Profile(URP).asset +63 -63
- package/URP/VolumeProfiles/Post Processing Bloom Profile(URP).asset.meta +8 -8
- package/URP/VolumeProfiles.meta +8 -8
- package/URP.meta +8 -8
- package/node_modules.meta +8 -0
- package/package-lock.json.meta +7 -0
- package/package.json +99 -38
- package/package.json.meta +7 -7
- package/scripts/check-eol.ps1 +51 -0
- package/scripts/check-eol.ps1.meta +7 -0
- package/scripts/clean-nul.ps1 +29 -0
- package/scripts/clean-nul.ps1.meta +7 -0
- package/scripts/lint-doc-links.ps1 +80 -0
- package/scripts/lint-doc-links.ps1.meta +7 -0
- package/scripts/lint-tests.ps1 +156 -0
- package/scripts/lint-tests.ps1.meta +7 -0
- package/scripts/normalize-eol.ps1 +68 -0
- package/scripts/normalize-eol.ps1.meta +7 -0
- package/scripts.meta +8 -0
- package/Editor/Sprites/ProjectAnimationSettings.cs +0 -50
- package/Editor/Sprites/ProjectAnimationSettings.cs.meta +0 -3
- package/Editor/Sprites/TextureSettingsApplier.cs +0 -178
- package/Editor/Sprites/TextureSettingsApplier.cs.meta +0 -3
- package/Runtime/Core/Attributes/ParentComponent.cs +0 -189
- package/Runtime/Core/DataStructure/KDTree.cs +0 -434
- package/Runtime/Core/DataStructure/QuadTree.cs +0 -431
- package/Runtime/Core/DataStructure/RTree.cs +0 -356
- package/Runtime/Core/Extension/HashSetExtensions.cs +0 -12
- package/Runtime/Core/Extension/HashSetExtensions.cs.meta +0 -11
- package/Runtime/Core/Math/Line.cs +0 -55
- package/Runtime/Core/Math/Line.cs.meta +0 -11
- package/Runtime/Core/Math/XXHash.cs +0 -310
- package/Runtime/Core/Math/XXHash.cs.meta +0 -11
- package/Tests/Runtime/Components/RelationalComponentsTesterSimple.cs +0 -40
- package/Tests/Runtime/Components.meta +0 -3
- package/Tests/Runtime/DataStructures/BalancedKDTreeTests.cs +0 -14
- package/Tests/Runtime/DataStructures/QuadTreeTests.cs +0 -14
- package/Tests/Runtime/DataStructures/QuadTreeTests.cs.meta +0 -11
- package/Tests/Runtime/DataStructures/SpatialTreeTests.cs +0 -130
- package/Tests/Runtime/DataStructures/SpatialTreeTests.cs.meta +0 -11
- package/Tests/Runtime/DataStructures/UnbalancedKDTreeTests.cs +0 -14
- package/Tests/Runtime/Helper/FormattingHelperTests.cs +0 -129
- package/Tests/Runtime/Helper/FormattingHelperTests.cs.meta +0 -3
- package/Tests/Runtime/Performance/KDTreePerformanceTests.cs +0 -14
- package/Tests/Runtime/Performance/KDTreePerformanceTests.cs.meta +0 -11
- package/Tests/Runtime/Performance/QuadTreePerformanceTests.cs +0 -14
- package/Tests/Runtime/Performance/QuadTreePerformanceTests.cs.meta +0 -11
- package/Tests/Runtime/Performance/SpatialTreePerformanceTest.cs +0 -158
- package/Tests/Runtime/Performance/SpatialTreePerformanceTest.cs.meta +0 -11
- package/Tests/Runtime/Performance/UnbalancedKDTreeTests.cs +0 -14
- package/Tests/Runtime/Performance/UnbalancedKDTreeTests.cs.meta +0 -11
- package/Third Party Notices.md +0 -1
|
@@ -1,195 +1,2121 @@
|
|
|
1
|
-
namespace WallstopStudios.UnityHelpers.Core.Serialization
|
|
2
|
-
{
|
|
3
|
-
using System;
|
|
4
|
-
using System.
|
|
5
|
-
using System.
|
|
6
|
-
using System.
|
|
7
|
-
using System.
|
|
8
|
-
using System.
|
|
9
|
-
using System.
|
|
10
|
-
using
|
|
11
|
-
using
|
|
12
|
-
using
|
|
13
|
-
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
public static
|
|
159
|
-
{
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
1
|
+
namespace WallstopStudios.UnityHelpers.Core.Serialization
|
|
2
|
+
{
|
|
3
|
+
using System;
|
|
4
|
+
using System.Buffers;
|
|
5
|
+
using System.Collections.Concurrent;
|
|
6
|
+
using System.ComponentModel;
|
|
7
|
+
using System.IO;
|
|
8
|
+
using System.Linq;
|
|
9
|
+
using System.Reflection;
|
|
10
|
+
using System.Runtime.Serialization.Formatters.Binary;
|
|
11
|
+
using System.Text;
|
|
12
|
+
using System.Text.Json;
|
|
13
|
+
using System.Text.Json.Serialization;
|
|
14
|
+
using System.Threading.Tasks;
|
|
15
|
+
using JsonConverters;
|
|
16
|
+
using ProtoBuf;
|
|
17
|
+
using WallstopStudios.UnityHelpers.Core.Helper;
|
|
18
|
+
using TypeConverter = JsonConverters.TypeConverter;
|
|
19
|
+
|
|
20
|
+
internal static class SerializerEncoding
|
|
21
|
+
{
|
|
22
|
+
public static readonly Encoding Encoding;
|
|
23
|
+
public static readonly JsonSerializerOptions NormalJsonOptions;
|
|
24
|
+
public static readonly JsonSerializerOptions PrettyJsonOptions;
|
|
25
|
+
public static readonly JsonSerializerOptions FastJsonOptions;
|
|
26
|
+
public static readonly JsonSerializerOptions FastPocoJsonOptions;
|
|
27
|
+
|
|
28
|
+
public static JsonSerializerOptions GetNormalJsonOptions()
|
|
29
|
+
{
|
|
30
|
+
return new JsonSerializerOptions
|
|
31
|
+
{
|
|
32
|
+
IgnoreReadOnlyFields = false,
|
|
33
|
+
IgnoreReadOnlyProperties = false,
|
|
34
|
+
ReferenceHandler = ReferenceHandler.IgnoreCycles,
|
|
35
|
+
IncludeFields = true,
|
|
36
|
+
PropertyNameCaseInsensitive = true,
|
|
37
|
+
NumberHandling =
|
|
38
|
+
JsonNumberHandling.AllowNamedFloatingPointLiterals
|
|
39
|
+
| JsonNumberHandling.AllowReadingFromString,
|
|
40
|
+
ReadCommentHandling = JsonCommentHandling.Skip,
|
|
41
|
+
AllowTrailingCommas = true,
|
|
42
|
+
Converters =
|
|
43
|
+
{
|
|
44
|
+
RangeConverterFactory.Instance,
|
|
45
|
+
FastVector2IntConverter.Instance,
|
|
46
|
+
FastVector3IntConverter.Instance,
|
|
47
|
+
new JsonStringEnumConverter(),
|
|
48
|
+
Vector3Converter.Instance,
|
|
49
|
+
Vector2Converter.Instance,
|
|
50
|
+
Vector4Converter.Instance,
|
|
51
|
+
Vector2IntConverter.Instance,
|
|
52
|
+
Vector3IntConverter.Instance,
|
|
53
|
+
Matrix4x4Converter.Instance,
|
|
54
|
+
QuaternionConverter.Instance,
|
|
55
|
+
LayerMaskConverter.Instance,
|
|
56
|
+
ResolutionConverter.Instance,
|
|
57
|
+
RenderTextureDescriptorConverter.Instance,
|
|
58
|
+
MinMaxCurveConverter.Instance,
|
|
59
|
+
MinMaxGradientConverter.Instance,
|
|
60
|
+
ColorBlockConverter.Instance,
|
|
61
|
+
BoundingSphereConverter.Instance,
|
|
62
|
+
RaycastHitConverter.Instance,
|
|
63
|
+
TouchConverter.Instance,
|
|
64
|
+
SceneConverter.Instance,
|
|
65
|
+
PoseConverter.Instance,
|
|
66
|
+
PlaneConverter.Instance,
|
|
67
|
+
RayConverter.Instance,
|
|
68
|
+
Ray2DConverter.Instance,
|
|
69
|
+
RectOffsetConverter.Instance,
|
|
70
|
+
RangeIntConverter.Instance,
|
|
71
|
+
Hash128Converter.Instance,
|
|
72
|
+
AnimationCurveConverter.Instance,
|
|
73
|
+
GradientConverter.Instance,
|
|
74
|
+
SphericalHarmonicsL2Converter.Instance,
|
|
75
|
+
TypeConverter.Instance,
|
|
76
|
+
GameObjectConverter.Instance,
|
|
77
|
+
ColorConverter.Instance,
|
|
78
|
+
Color32Converter.Instance,
|
|
79
|
+
RectConverter.Instance,
|
|
80
|
+
RectIntConverter.Instance,
|
|
81
|
+
BoundsConverter.Instance,
|
|
82
|
+
BoundsIntConverter.Instance,
|
|
83
|
+
BitSetConverter.Instance,
|
|
84
|
+
ImmutableBitSetConverter.Instance,
|
|
85
|
+
DequeConverterFactory.Instance,
|
|
86
|
+
CyclicBufferConverterFactory.Instance,
|
|
87
|
+
KVector2Converter.Instance,
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
public static JsonSerializerOptions GetPrettyJsonOptions()
|
|
94
|
+
{
|
|
95
|
+
return new JsonSerializerOptions
|
|
96
|
+
{
|
|
97
|
+
IgnoreReadOnlyFields = false,
|
|
98
|
+
IgnoreReadOnlyProperties = false,
|
|
99
|
+
ReferenceHandler = ReferenceHandler.IgnoreCycles,
|
|
100
|
+
PropertyNameCaseInsensitive = true,
|
|
101
|
+
IncludeFields = true,
|
|
102
|
+
NumberHandling =
|
|
103
|
+
JsonNumberHandling.AllowNamedFloatingPointLiterals
|
|
104
|
+
| JsonNumberHandling.AllowReadingFromString,
|
|
105
|
+
ReadCommentHandling = JsonCommentHandling.Skip,
|
|
106
|
+
AllowTrailingCommas = true,
|
|
107
|
+
Converters =
|
|
108
|
+
{
|
|
109
|
+
RangeConverterFactory.Instance,
|
|
110
|
+
FastVector2IntConverter.Instance,
|
|
111
|
+
FastVector3IntConverter.Instance,
|
|
112
|
+
new JsonStringEnumConverter(),
|
|
113
|
+
Vector3Converter.Instance,
|
|
114
|
+
Vector2Converter.Instance,
|
|
115
|
+
Vector4Converter.Instance,
|
|
116
|
+
Vector2IntConverter.Instance,
|
|
117
|
+
Vector3IntConverter.Instance,
|
|
118
|
+
Matrix4x4Converter.Instance,
|
|
119
|
+
QuaternionConverter.Instance,
|
|
120
|
+
LayerMaskConverter.Instance,
|
|
121
|
+
ResolutionConverter.Instance,
|
|
122
|
+
RenderTextureDescriptorConverter.Instance,
|
|
123
|
+
MinMaxCurveConverter.Instance,
|
|
124
|
+
MinMaxGradientConverter.Instance,
|
|
125
|
+
ColorBlockConverter.Instance,
|
|
126
|
+
BoundingSphereConverter.Instance,
|
|
127
|
+
RaycastHitConverter.Instance,
|
|
128
|
+
TouchConverter.Instance,
|
|
129
|
+
SceneConverter.Instance,
|
|
130
|
+
PoseConverter.Instance,
|
|
131
|
+
PlaneConverter.Instance,
|
|
132
|
+
RayConverter.Instance,
|
|
133
|
+
Ray2DConverter.Instance,
|
|
134
|
+
RectOffsetConverter.Instance,
|
|
135
|
+
RangeIntConverter.Instance,
|
|
136
|
+
Hash128Converter.Instance,
|
|
137
|
+
AnimationCurveConverter.Instance,
|
|
138
|
+
GradientConverter.Instance,
|
|
139
|
+
SphericalHarmonicsL2Converter.Instance,
|
|
140
|
+
TypeConverter.Instance,
|
|
141
|
+
GameObjectConverter.Instance,
|
|
142
|
+
ColorConverter.Instance,
|
|
143
|
+
Color32Converter.Instance,
|
|
144
|
+
RectConverter.Instance,
|
|
145
|
+
RectIntConverter.Instance,
|
|
146
|
+
BoundsConverter.Instance,
|
|
147
|
+
BoundsIntConverter.Instance,
|
|
148
|
+
BitSetConverter.Instance,
|
|
149
|
+
ImmutableBitSetConverter.Instance,
|
|
150
|
+
DequeConverterFactory.Instance,
|
|
151
|
+
CyclicBufferConverterFactory.Instance,
|
|
152
|
+
KVector2Converter.Instance,
|
|
153
|
+
},
|
|
154
|
+
WriteIndented = true,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
public static JsonSerializerOptions GetFastJsonOptions()
|
|
159
|
+
{
|
|
160
|
+
return new JsonSerializerOptions
|
|
161
|
+
{
|
|
162
|
+
IgnoreReadOnlyFields = false,
|
|
163
|
+
IgnoreReadOnlyProperties = true,
|
|
164
|
+
ReferenceHandler = null,
|
|
165
|
+
PropertyNameCaseInsensitive = false,
|
|
166
|
+
IncludeFields = false,
|
|
167
|
+
NumberHandling = JsonNumberHandling.Strict,
|
|
168
|
+
ReadCommentHandling = JsonCommentHandling.Disallow,
|
|
169
|
+
AllowTrailingCommas = false,
|
|
170
|
+
Converters =
|
|
171
|
+
{
|
|
172
|
+
RangeConverterFactory.Instance,
|
|
173
|
+
FastVector2IntConverter.Instance,
|
|
174
|
+
FastVector3IntConverter.Instance,
|
|
175
|
+
Vector3Converter.Instance,
|
|
176
|
+
Vector2Converter.Instance,
|
|
177
|
+
Vector4Converter.Instance,
|
|
178
|
+
Vector2IntConverter.Instance,
|
|
179
|
+
Vector3IntConverter.Instance,
|
|
180
|
+
Matrix4x4Converter.Instance,
|
|
181
|
+
QuaternionConverter.Instance,
|
|
182
|
+
LayerMaskConverter.Instance,
|
|
183
|
+
ResolutionConverter.Instance,
|
|
184
|
+
RenderTextureDescriptorConverter.Instance,
|
|
185
|
+
MinMaxCurveConverter.Instance,
|
|
186
|
+
MinMaxGradientConverter.Instance,
|
|
187
|
+
ColorBlockConverter.Instance,
|
|
188
|
+
BoundingSphereConverter.Instance,
|
|
189
|
+
RaycastHitConverter.Instance,
|
|
190
|
+
TouchConverter.Instance,
|
|
191
|
+
SceneConverter.Instance,
|
|
192
|
+
PoseConverter.Instance,
|
|
193
|
+
PlaneConverter.Instance,
|
|
194
|
+
RayConverter.Instance,
|
|
195
|
+
Ray2DConverter.Instance,
|
|
196
|
+
RectOffsetConverter.Instance,
|
|
197
|
+
RangeIntConverter.Instance,
|
|
198
|
+
Hash128Converter.Instance,
|
|
199
|
+
AnimationCurveConverter.Instance,
|
|
200
|
+
GradientConverter.Instance,
|
|
201
|
+
SphericalHarmonicsL2Converter.Instance,
|
|
202
|
+
TypeConverter.Instance,
|
|
203
|
+
GameObjectConverter.Instance,
|
|
204
|
+
ColorConverter.Instance,
|
|
205
|
+
Color32Converter.Instance,
|
|
206
|
+
RectConverter.Instance,
|
|
207
|
+
RectIntConverter.Instance,
|
|
208
|
+
BoundsConverter.Instance,
|
|
209
|
+
BoundsIntConverter.Instance,
|
|
210
|
+
BitSetConverter.Instance,
|
|
211
|
+
ImmutableBitSetConverter.Instance,
|
|
212
|
+
DequeConverterFactory.Instance,
|
|
213
|
+
CyclicBufferConverterFactory.Instance,
|
|
214
|
+
KVector2Converter.Instance,
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
public static JsonSerializerOptions GetFastPocoJsonOptions()
|
|
220
|
+
{
|
|
221
|
+
return new JsonSerializerOptions
|
|
222
|
+
{
|
|
223
|
+
IgnoreReadOnlyFields = false,
|
|
224
|
+
IgnoreReadOnlyProperties = false,
|
|
225
|
+
ReferenceHandler = null,
|
|
226
|
+
PropertyNameCaseInsensitive = false,
|
|
227
|
+
IncludeFields = false,
|
|
228
|
+
NumberHandling = JsonNumberHandling.Strict,
|
|
229
|
+
ReadCommentHandling = JsonCommentHandling.Disallow,
|
|
230
|
+
AllowTrailingCommas = false,
|
|
231
|
+
// No converters for POCO to minimize overhead
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
static SerializerEncoding()
|
|
236
|
+
{
|
|
237
|
+
Encoding = Encoding.UTF8;
|
|
238
|
+
NormalJsonOptions = GetNormalJsonOptions();
|
|
239
|
+
PrettyJsonOptions = GetPrettyJsonOptions();
|
|
240
|
+
FastJsonOptions = GetFastJsonOptions();
|
|
241
|
+
FastPocoJsonOptions = GetFastPocoJsonOptions();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/// <summary>
|
|
246
|
+
/// Selects the wire format used by <see cref="Serializer"/>.
|
|
247
|
+
/// </summary>
|
|
248
|
+
/// <remarks>
|
|
249
|
+
/// Choose a format based on your requirements:
|
|
250
|
+
/// <list type="bullet">
|
|
251
|
+
/// <item>
|
|
252
|
+
/// <description>
|
|
253
|
+
/// <see cref="Json"/> — Human‑readable and diff‑friendly. Uses System.Text.Json with Unity‑aware
|
|
254
|
+
/// converters for common types (e.g., Vector2/3/4, Matrix4x4, Color, Type).
|
|
255
|
+
/// Prefer for save files, configs, and tooling.
|
|
256
|
+
/// </description>
|
|
257
|
+
/// </item>
|
|
258
|
+
/// <item>
|
|
259
|
+
/// <description>
|
|
260
|
+
/// <see cref="Protobuf"/> — Compact binary with great performance using protobuf‑net.
|
|
261
|
+
/// Prefer for networking, large payloads, and memory‑sensitive scenarios.
|
|
262
|
+
/// Requires opt‑in attributes like [ProtoContract]/[ProtoMember] or runtime models.
|
|
263
|
+
/// </description>
|
|
264
|
+
/// </item>
|
|
265
|
+
/// <item>
|
|
266
|
+
/// <description>
|
|
267
|
+
/// <see cref="SystemBinary"/> — .NET BinaryFormatter. Legacy and trusted‑only. Not
|
|
268
|
+
/// cross‑version/portable and unsafe for untrusted input. Use only for ephemeral/dev data.
|
|
269
|
+
/// </description>
|
|
270
|
+
/// </item>
|
|
271
|
+
/// </list>
|
|
272
|
+
/// </remarks>
|
|
273
|
+
public enum SerializationType
|
|
274
|
+
{
|
|
275
|
+
/// <summary>Unspecified format; not valid for read/write.</summary>
|
|
276
|
+
[Obsolete("Please use a valid enum value")]
|
|
277
|
+
None = 0,
|
|
278
|
+
|
|
279
|
+
/// <summary>Legacy .NET BinaryFormatter. Trusted/ephemeral data only.</summary>
|
|
280
|
+
[Obsolete(
|
|
281
|
+
"BinaryFormatter is obsolete and unsafe for untrusted data. "
|
|
282
|
+
+ "Prefer Json or Protobuf for new code."
|
|
283
|
+
)]
|
|
284
|
+
SystemBinary = 1,
|
|
285
|
+
|
|
286
|
+
/// <summary>protobuf-net compact binary. Best for networking and high-performance.</summary>
|
|
287
|
+
Protobuf = 2,
|
|
288
|
+
|
|
289
|
+
/// <summary>System.Text.Json text. Human-readable and diff-friendly.</summary>
|
|
290
|
+
Json = 3,
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/// <summary>
|
|
294
|
+
/// Unified serialization helpers for JSON, protobuf‑net, and legacy BinaryFormatter.
|
|
295
|
+
/// </summary>
|
|
296
|
+
/// <remarks>
|
|
297
|
+
/// Highlights
|
|
298
|
+
/// <list type="bullet">
|
|
299
|
+
/// <item><description>JSON: Uses pooled writers and Unity‑aware converters; supports pretty printing.</description></item>
|
|
300
|
+
/// <item><description>Protobuf: Compact binary via protobuf‑net; supports interface/abstract types via root resolution or <see cref="RegisterProtobufRoot(Type, Type)"/>.</description></item>
|
|
301
|
+
/// <item><description>Binary: Convenience for legacy only; do not feed untrusted data.</description></item>
|
|
302
|
+
/// <item><description>Minimal allocations with ArrayPool-backed streams to reduce GC pressure.</description></item>
|
|
303
|
+
/// </list>
|
|
304
|
+
/// When to use what
|
|
305
|
+
/// <list type="bullet">
|
|
306
|
+
/// <item><description>Prefer <see cref="SerializationType.Json"/> for save systems, settings, and tools.</description></item>
|
|
307
|
+
/// <item><description>Prefer <see cref="SerializationType.Protobuf"/> for networking, large or frequent messages.</description></item>
|
|
308
|
+
/// <item><description>Reserve <see cref="SerializationType.SystemBinary"/> for trusted legacy scenarios only.</description></item>
|
|
309
|
+
/// </list>
|
|
310
|
+
/// </remarks>
|
|
311
|
+
/// <example>
|
|
312
|
+
/// JSON save/config
|
|
313
|
+
/// <code>
|
|
314
|
+
/// var save = new SaveData { Level = 3 };
|
|
315
|
+
/// // To string
|
|
316
|
+
/// string text = Serializer.JsonStringify(save, pretty: true);
|
|
317
|
+
/// // File IO
|
|
318
|
+
/// Serializer.WriteToJsonFile(save, "save.json", pretty: true);
|
|
319
|
+
/// var loaded = Serializer.ReadFromJsonFile<SaveData>("save.json");
|
|
320
|
+
/// </code>
|
|
321
|
+
/// Protobuf networking
|
|
322
|
+
/// <code>
|
|
323
|
+
/// [ProtoContract]
|
|
324
|
+
/// class NetworkMessage { [ProtoMember(1)] public int Id { get; set; } }
|
|
325
|
+
/// byte[] bytes = Serializer.ProtoSerialize(new NetworkMessage { Id = 42 });
|
|
326
|
+
/// NetworkMessage msg = Serializer.ProtoDeserialize<NetworkMessage>(bytes);
|
|
327
|
+
/// </code>
|
|
328
|
+
/// Legacy BinaryFormatter (trusted only)
|
|
329
|
+
/// <code>
|
|
330
|
+
/// byte[] blob = Serializer.BinarySerialize(obj);
|
|
331
|
+
/// var roundtrip = Serializer.BinaryDeserialize<SomeType>(blob);
|
|
332
|
+
/// </code>
|
|
333
|
+
/// </example>
|
|
334
|
+
public static class Serializer
|
|
335
|
+
{
|
|
336
|
+
/// <summary>
|
|
337
|
+
/// Returns a copy of the package's Normal JSON options. The returned instance is independent
|
|
338
|
+
/// of internal defaults, so modifying it won't affect global behavior. Cache and reuse the
|
|
339
|
+
/// returned instance across calls to benefit from System.Text.Json metadata caches.
|
|
340
|
+
/// </summary>
|
|
341
|
+
public static JsonSerializerOptions CreateNormalJsonOptions() =>
|
|
342
|
+
SerializerEncoding.GetNormalJsonOptions();
|
|
343
|
+
|
|
344
|
+
/// <summary>
|
|
345
|
+
/// Returns a copy of the package's Pretty (indented) JSON options.
|
|
346
|
+
/// </summary>
|
|
347
|
+
public static JsonSerializerOptions CreatePrettyJsonOptions() =>
|
|
348
|
+
SerializerEncoding.GetPrettyJsonOptions();
|
|
349
|
+
|
|
350
|
+
/// <summary>
|
|
351
|
+
/// Returns a copy of the package's Fast JSON options, tuned for hot paths with reduced validation
|
|
352
|
+
/// and features to minimize allocations and branching. See docs for trade-offs.
|
|
353
|
+
/// </summary>
|
|
354
|
+
public static JsonSerializerOptions CreateFastJsonOptions() =>
|
|
355
|
+
SerializerEncoding.GetFastJsonOptions();
|
|
356
|
+
|
|
357
|
+
/// <summary>
|
|
358
|
+
/// Returns a copy of the package's Fast POCO JSON options.
|
|
359
|
+
/// Strict, minimal, and with no Unity-specific converters.
|
|
360
|
+
/// Use for pure POCO graphs when you want the fastest possible serialization/deserialization.
|
|
361
|
+
/// Notes:
|
|
362
|
+
/// - Case-sensitive property names (faster matching)
|
|
363
|
+
/// - No comments/trailing commas; strict numbers only
|
|
364
|
+
/// - IncludeFields = false (prefer properties for performance)
|
|
365
|
+
/// - Returns a new instance each call; cache and reuse within your app to leverage STJ metadata caches
|
|
366
|
+
/// </summary>
|
|
367
|
+
public static JsonSerializerOptions CreateFastPocoJsonOptions() =>
|
|
368
|
+
new(SerializerEncoding.FastPocoJsonOptions);
|
|
369
|
+
|
|
370
|
+
// Small protobuf payloads benefit from protobuf-net's MemoryStream fast-path (TryGetBuffer).
|
|
371
|
+
// Larger payloads see wins from our pooled read-only stream to avoid per-iteration allocations.
|
|
372
|
+
private const int ProtobufMemoryStreamThreshold = 4096; // bytes
|
|
373
|
+
|
|
374
|
+
// Optional zero-copy path if protobuf-net supports ReadOnlyMemory<byte>/ReadOnlySequence<byte> overloads
|
|
375
|
+
private static readonly MethodInfo ProtoDeserializeTypeFromROM;
|
|
376
|
+
private static readonly MethodInfo ProtoDeserializeTypeFromROS;
|
|
377
|
+
private static readonly Func<
|
|
378
|
+
Type,
|
|
379
|
+
ReadOnlyMemory<byte>,
|
|
380
|
+
object
|
|
381
|
+
> ProtoDeserializeTypeFromROMFast;
|
|
382
|
+
private static readonly Func<
|
|
383
|
+
Type,
|
|
384
|
+
ReadOnlySequence<byte>,
|
|
385
|
+
object
|
|
386
|
+
> ProtoDeserializeTypeFromROSFast;
|
|
387
|
+
|
|
388
|
+
static Serializer()
|
|
389
|
+
{
|
|
390
|
+
// Initialize protobuf surrogates and any other serialization bootstrapping here
|
|
391
|
+
// so initialization does not depend on JSON option access.
|
|
392
|
+
ProtobufUnityModel.EnsureInitialized();
|
|
393
|
+
try
|
|
394
|
+
{
|
|
395
|
+
MethodInfo[] methods = typeof(ProtoBuf.Serializer).GetMethods(
|
|
396
|
+
BindingFlags.Public | BindingFlags.Static
|
|
397
|
+
);
|
|
398
|
+
foreach (MethodInfo mi in methods)
|
|
399
|
+
{
|
|
400
|
+
if (mi.Name != "Deserialize")
|
|
401
|
+
{
|
|
402
|
+
continue;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
ParameterInfo[] pars = mi.GetParameters();
|
|
406
|
+
if (pars.Length != 2)
|
|
407
|
+
{
|
|
408
|
+
continue;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
if (pars[0].ParameterType != typeof(Type))
|
|
412
|
+
{
|
|
413
|
+
continue;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
Type p1 = pars[1].ParameterType;
|
|
417
|
+
switch (p1.IsGenericType)
|
|
418
|
+
{
|
|
419
|
+
case true when p1.GetGenericTypeDefinition() == typeof(ReadOnlyMemory<>):
|
|
420
|
+
{
|
|
421
|
+
Type genArg = p1.GetGenericArguments()[0];
|
|
422
|
+
if (genArg == typeof(byte))
|
|
423
|
+
{
|
|
424
|
+
ProtoDeserializeTypeFromROM ??= mi;
|
|
425
|
+
try
|
|
426
|
+
{
|
|
427
|
+
ProtoDeserializeTypeFromROMFast =
|
|
428
|
+
ReflectionHelpers.GetStaticMethodInvoker<
|
|
429
|
+
Type,
|
|
430
|
+
ReadOnlyMemory<byte>,
|
|
431
|
+
object
|
|
432
|
+
>(mi);
|
|
433
|
+
}
|
|
434
|
+
catch { }
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
break;
|
|
438
|
+
}
|
|
439
|
+
case true when p1.GetGenericTypeDefinition() == typeof(ReadOnlySequence<>):
|
|
440
|
+
{
|
|
441
|
+
Type genArg = p1.GetGenericArguments()[0];
|
|
442
|
+
if (genArg == typeof(byte))
|
|
443
|
+
{
|
|
444
|
+
ProtoDeserializeTypeFromROS ??= mi;
|
|
445
|
+
try
|
|
446
|
+
{
|
|
447
|
+
ProtoDeserializeTypeFromROSFast =
|
|
448
|
+
ReflectionHelpers.GetStaticMethodInvoker<
|
|
449
|
+
Type,
|
|
450
|
+
ReadOnlySequence<byte>,
|
|
451
|
+
object
|
|
452
|
+
>(mi);
|
|
453
|
+
}
|
|
454
|
+
catch { }
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
break;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
catch
|
|
463
|
+
{
|
|
464
|
+
// Reflection probing failed; keep nulls and fall back to streams
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
private static readonly ConcurrentDictionary<Type, Type> ProtobufRootCache = new();
|
|
469
|
+
private static readonly Type NoRootMarker = typeof(void);
|
|
470
|
+
|
|
471
|
+
// Centralized decision logic for protobuf runtime vs declared handling
|
|
472
|
+
internal static bool ShouldUseRuntimeTypeForProtobuf<T>(
|
|
473
|
+
Type declared,
|
|
474
|
+
T instance,
|
|
475
|
+
bool forceRuntimeType
|
|
476
|
+
)
|
|
477
|
+
{
|
|
478
|
+
if (forceRuntimeType)
|
|
479
|
+
{
|
|
480
|
+
return true;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
if (declared == null)
|
|
484
|
+
{
|
|
485
|
+
return true;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
if (declared.IsInterface || declared.IsAbstract || declared == typeof(object))
|
|
489
|
+
{
|
|
490
|
+
return true;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
// Last resort: if the declared type is a reference type and the runtime type differs,
|
|
494
|
+
// prefer using the runtime serializer to avoid protobuf-net subtype errors.
|
|
495
|
+
if (!declared.IsValueType && instance != null && instance.GetType() != declared)
|
|
496
|
+
{
|
|
497
|
+
return true;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
return false;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
private static readonly Utils.WallstopGenericPool<BinaryFormatter> BinaryFormatterPool =
|
|
504
|
+
new(() => new BinaryFormatter());
|
|
505
|
+
|
|
506
|
+
private static readonly Utils.WallstopGenericPool<Utf8JsonWriter> JsonWriterPool = new(
|
|
507
|
+
() => new Utf8JsonWriter(Stream.Null, new JsonWriterOptions { SkipValidation = true }),
|
|
508
|
+
onRelease: writer =>
|
|
509
|
+
{
|
|
510
|
+
writer.Reset(Stream.Null);
|
|
511
|
+
},
|
|
512
|
+
onDisposal: stream => stream.Dispose()
|
|
513
|
+
);
|
|
514
|
+
|
|
515
|
+
/// <summary>
|
|
516
|
+
/// Registers a concrete or abstract protobuf root type for a declared interface/abstract/object type.
|
|
517
|
+
/// The root must be assignable to <paramref name="declared"/> and annotated with [ProtoContract].
|
|
518
|
+
/// Subsequent deserializations to the declared type will use the registered root.
|
|
519
|
+
/// </summary>
|
|
520
|
+
/// <remarks>
|
|
521
|
+
/// Use this when deserializing to an interface/abstract/object and you want deterministic root selection
|
|
522
|
+
/// instead of relying on reflection inference.
|
|
523
|
+
/// </remarks>
|
|
524
|
+
/// <example>
|
|
525
|
+
/// <code>
|
|
526
|
+
/// // Given an interface and concrete implementation
|
|
527
|
+
/// [ProtoContract] class PlayerJoined : IEvent { [ProtoMember(1)] public string Name { get; set; } }
|
|
528
|
+
/// Serializer.RegisterProtobufRoot(typeof(IEvent), typeof(PlayerJoined));
|
|
529
|
+
/// var evt = Serializer.ProtoDeserialize<IEvent>(bytes);
|
|
530
|
+
/// </code>
|
|
531
|
+
/// </example>
|
|
532
|
+
/// <exception cref="ArgumentNullException">If declared or root is null.</exception>
|
|
533
|
+
/// <exception cref="ArgumentException">If root is not assignable to declared or missing [ProtoContract].</exception>
|
|
534
|
+
/// <exception cref="InvalidOperationException">If a conflicting root is already registered.</exception>
|
|
535
|
+
public static void RegisterProtobufRoot(Type declared, Type root)
|
|
536
|
+
{
|
|
537
|
+
if (declared == null)
|
|
538
|
+
{
|
|
539
|
+
throw new ArgumentNullException(nameof(declared));
|
|
540
|
+
}
|
|
541
|
+
if (root == null)
|
|
542
|
+
{
|
|
543
|
+
throw new ArgumentNullException(nameof(root));
|
|
544
|
+
}
|
|
545
|
+
if (!declared.IsAssignableFrom(root))
|
|
546
|
+
{
|
|
547
|
+
throw new ArgumentException(
|
|
548
|
+
$"Type {root.FullName} is not assignable to {declared.FullName}",
|
|
549
|
+
nameof(root)
|
|
550
|
+
);
|
|
551
|
+
}
|
|
552
|
+
if (!ReflectionHelpers.HasAttributeSafe<ProtoContractAttribute>(root))
|
|
553
|
+
{
|
|
554
|
+
throw new ArgumentException(
|
|
555
|
+
$"Type {root.FullName} must be annotated with [ProtoContract]",
|
|
556
|
+
nameof(root)
|
|
557
|
+
);
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
if (ProtobufRootCache.TryGetValue(declared, out Type existing))
|
|
561
|
+
{
|
|
562
|
+
if (existing != root && existing != NoRootMarker)
|
|
563
|
+
{
|
|
564
|
+
throw new InvalidOperationException(
|
|
565
|
+
$"A different root {existing.FullName} is already registered for {declared.FullName}"
|
|
566
|
+
);
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
ProtobufRootCache[declared] = root;
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
/// <summary>
|
|
574
|
+
/// Generic convenience overload for registering a protobuf root type.
|
|
575
|
+
/// </summary>
|
|
576
|
+
/// <remarks>
|
|
577
|
+
/// Useful for polymorphic APIs: map <typeparamref name="TDeclared"/> to <typeparamref name="TRoot"/> once,
|
|
578
|
+
/// then call <see cref="ProtoDeserialize{T}(byte[])"/> for the declared type.
|
|
579
|
+
/// </remarks>
|
|
580
|
+
/// <example>
|
|
581
|
+
/// <code>
|
|
582
|
+
/// Serializer.RegisterProtobufRoot<IEvent, PlayerJoined>();
|
|
583
|
+
/// IEvent evt = Serializer.ProtoDeserialize<IEvent>(bytes);
|
|
584
|
+
/// </code>
|
|
585
|
+
/// </example>
|
|
586
|
+
public static void RegisterProtobufRoot<TDeclared, TRoot>()
|
|
587
|
+
where TRoot : TDeclared
|
|
588
|
+
{
|
|
589
|
+
RegisterProtobufRoot(typeof(TDeclared), typeof(TRoot));
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
/// <summary>
|
|
593
|
+
/// Deserializes a payload that was serialized with the specified <paramref name="serializationType"/>.
|
|
594
|
+
/// </summary>
|
|
595
|
+
/// <typeparam name="T">The target type.</typeparam>
|
|
596
|
+
/// <param name="serialized">Payload bytes to decode.</param>
|
|
597
|
+
/// <param name="serializationType">The format the payload is encoded with.</param>
|
|
598
|
+
/// <returns>The decoded instance.</returns>
|
|
599
|
+
/// <example>
|
|
600
|
+
/// JSON
|
|
601
|
+
/// <code>
|
|
602
|
+
/// byte[] data = Serializer.JsonSerialize(save);
|
|
603
|
+
/// SaveData loaded = Serializer.Deserialize<SaveData>(data, SerializationType.Json);
|
|
604
|
+
/// </code>
|
|
605
|
+
/// Protobuf
|
|
606
|
+
/// <code>
|
|
607
|
+
/// byte[] msg = Serializer.ProtoSerialize(message);
|
|
608
|
+
/// NetworkMessage decoded = Serializer.Deserialize<NetworkMessage>(msg, SerializationType.Protobuf);
|
|
609
|
+
/// </code>
|
|
610
|
+
/// </example>
|
|
611
|
+
public static T Deserialize<T>(byte[] serialized, SerializationType serializationType)
|
|
612
|
+
{
|
|
613
|
+
switch (serializationType)
|
|
614
|
+
{
|
|
615
|
+
#pragma warning disable CS0618 // Type or member is obsolete
|
|
616
|
+
case SerializationType.SystemBinary:
|
|
617
|
+
#pragma warning restore CS0618 // Type or member is obsolete
|
|
618
|
+
{
|
|
619
|
+
return BinaryDeserialize<T>(serialized);
|
|
620
|
+
}
|
|
621
|
+
case SerializationType.Protobuf:
|
|
622
|
+
{
|
|
623
|
+
return ProtoDeserialize<T>(serialized);
|
|
624
|
+
}
|
|
625
|
+
case SerializationType.Json:
|
|
626
|
+
{
|
|
627
|
+
return JsonDeserialize<T>(serialized);
|
|
628
|
+
}
|
|
629
|
+
default:
|
|
630
|
+
{
|
|
631
|
+
throw new InvalidEnumArgumentException(
|
|
632
|
+
nameof(serializationType),
|
|
633
|
+
(int)serializationType,
|
|
634
|
+
typeof(SerializationType)
|
|
635
|
+
);
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
/// <summary>
|
|
641
|
+
/// Serializes an instance into bytes using the specified <paramref name="serializationType"/>.
|
|
642
|
+
/// </summary>
|
|
643
|
+
/// <typeparam name="T">The instance type.</typeparam>
|
|
644
|
+
/// <param name="instance">The instance to encode.</param>
|
|
645
|
+
/// <param name="serializationType">The target wire format.</param>
|
|
646
|
+
/// <returns>Serialized bytes.</returns>
|
|
647
|
+
/// <example>
|
|
648
|
+
/// <code>
|
|
649
|
+
/// // As bytes
|
|
650
|
+
/// byte[] data = Serializer.Serialize(save, SerializationType.Json);
|
|
651
|
+
/// // Later
|
|
652
|
+
/// SaveData loaded = Serializer.Deserialize<SaveData>(data, SerializationType.Json);
|
|
653
|
+
/// </code>
|
|
654
|
+
/// </example>
|
|
655
|
+
public static byte[] Serialize<T>(T instance, SerializationType serializationType)
|
|
656
|
+
{
|
|
657
|
+
switch (serializationType)
|
|
658
|
+
{
|
|
659
|
+
#pragma warning disable CS0618 // Type or member is obsolete
|
|
660
|
+
case SerializationType.SystemBinary:
|
|
661
|
+
#pragma warning restore CS0618 // Type or member is obsolete
|
|
662
|
+
{
|
|
663
|
+
return BinarySerialize(instance);
|
|
664
|
+
}
|
|
665
|
+
case SerializationType.Protobuf:
|
|
666
|
+
{
|
|
667
|
+
return ProtoSerialize(instance);
|
|
668
|
+
}
|
|
669
|
+
case SerializationType.Json:
|
|
670
|
+
{
|
|
671
|
+
return JsonSerialize(instance);
|
|
672
|
+
}
|
|
673
|
+
default:
|
|
674
|
+
{
|
|
675
|
+
throw new InvalidEnumArgumentException(
|
|
676
|
+
nameof(serializationType),
|
|
677
|
+
(int)serializationType,
|
|
678
|
+
typeof(SerializationType)
|
|
679
|
+
);
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
/// <summary>
|
|
685
|
+
/// Serializes into a caller-provided buffer to avoid an extra allocation.
|
|
686
|
+
/// </summary>
|
|
687
|
+
/// <typeparam name="T">The instance type.</typeparam>
|
|
688
|
+
/// <param name="instance">The instance to encode.</param>
|
|
689
|
+
/// <param name="serializationType">The target wire format.</param>
|
|
690
|
+
/// <param name="buffer">Destination buffer reference. Resized if too small.</param>
|
|
691
|
+
/// <returns>The number of valid bytes written to <paramref name="buffer"/>.</returns>
|
|
692
|
+
public static int Serialize<T>(
|
|
693
|
+
T instance,
|
|
694
|
+
SerializationType serializationType,
|
|
695
|
+
ref byte[] buffer
|
|
696
|
+
)
|
|
697
|
+
{
|
|
698
|
+
switch (serializationType)
|
|
699
|
+
{
|
|
700
|
+
#pragma warning disable CS0618 // Type or member is obsolete
|
|
701
|
+
case SerializationType.SystemBinary:
|
|
702
|
+
#pragma warning restore CS0618 // Type or member is obsolete
|
|
703
|
+
{
|
|
704
|
+
return BinarySerialize(instance, ref buffer);
|
|
705
|
+
}
|
|
706
|
+
case SerializationType.Protobuf:
|
|
707
|
+
{
|
|
708
|
+
return ProtoSerialize(instance, ref buffer);
|
|
709
|
+
}
|
|
710
|
+
case SerializationType.Json:
|
|
711
|
+
{
|
|
712
|
+
return JsonSerialize(instance, ref buffer);
|
|
713
|
+
}
|
|
714
|
+
default:
|
|
715
|
+
{
|
|
716
|
+
throw new InvalidEnumArgumentException(
|
|
717
|
+
nameof(serializationType),
|
|
718
|
+
(int)serializationType,
|
|
719
|
+
typeof(SerializationType)
|
|
720
|
+
);
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
/// <summary>
|
|
726
|
+
/// Deserializes bytes using legacy <c>BinaryFormatter</c>.
|
|
727
|
+
/// </summary>
|
|
728
|
+
/// <typeparam name="T">Target type.</typeparam>
|
|
729
|
+
/// <param name="data">Serialized bytes.</param>
|
|
730
|
+
/// <remarks>
|
|
731
|
+
/// Security: Never deserialize untrusted data with BinaryFormatter. It is obsolete and unsafe.
|
|
732
|
+
/// Portability: Fragile across versions/platforms; avoid for long‑lived data.
|
|
733
|
+
/// Prefer <see cref="JsonDeserialize{T}(string, System.Type, System.Text.Json.JsonSerializerOptions)"/> or <see cref="ProtoDeserialize{T}(byte[])"/> in production.
|
|
734
|
+
/// </remarks>
|
|
735
|
+
public static T BinaryDeserialize<T>(byte[] data)
|
|
736
|
+
{
|
|
737
|
+
using Utils.PooledResource<PooledReadOnlyMemoryStream> lease =
|
|
738
|
+
PooledReadOnlyMemoryStream.Rent(out PooledReadOnlyMemoryStream stream);
|
|
739
|
+
stream.SetBuffer(data);
|
|
740
|
+
using Utils.PooledResource<BinaryFormatter> fmtLease = BinaryFormatterPool.Get(
|
|
741
|
+
out BinaryFormatter binaryFormatter
|
|
742
|
+
);
|
|
743
|
+
return (T)binaryFormatter.Deserialize(stream);
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
/// <summary>
|
|
747
|
+
/// Serializes an object using legacy <c>BinaryFormatter</c>.
|
|
748
|
+
/// </summary>
|
|
749
|
+
/// <typeparam name="T">Instance type.</typeparam>
|
|
750
|
+
/// <param name="input">Object to serialize.</param>
|
|
751
|
+
/// <returns>Serialized bytes.</returns>
|
|
752
|
+
/// <remarks>
|
|
753
|
+
/// Use for trusted, temporary data only. Not safe for untrusted input. Prefer JSON or protobuf.
|
|
754
|
+
/// </remarks>
|
|
755
|
+
public static byte[] BinarySerialize<T>(T input)
|
|
756
|
+
{
|
|
757
|
+
using Utils.PooledResource<PooledBufferStream> lease = PooledBufferStream.Rent(
|
|
758
|
+
out PooledBufferStream stream
|
|
759
|
+
);
|
|
760
|
+
using Utils.PooledResource<BinaryFormatter> fmtLease = BinaryFormatterPool.Get(
|
|
761
|
+
out BinaryFormatter binaryFormatter
|
|
762
|
+
);
|
|
763
|
+
binaryFormatter.Serialize(stream, input);
|
|
764
|
+
byte[] buffer = null;
|
|
765
|
+
stream.ToArrayExact(ref buffer);
|
|
766
|
+
return buffer;
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
/// <summary>
|
|
770
|
+
/// Serializes to a caller buffer using <c>BinaryFormatter</c>.
|
|
771
|
+
/// </summary>
|
|
772
|
+
/// <typeparam name="T">Instance type.</typeparam>
|
|
773
|
+
/// <param name="input">Object to serialize.</param>
|
|
774
|
+
/// <param name="buffer">Destination buffer reference. Resized if necessary.</param>
|
|
775
|
+
/// <returns>Number of bytes written.</returns>
|
|
776
|
+
public static int BinarySerialize<T>(T input, ref byte[] buffer)
|
|
777
|
+
{
|
|
778
|
+
using Utils.PooledResource<PooledBufferStream> lease = PooledBufferStream.Rent(
|
|
779
|
+
out PooledBufferStream stream
|
|
780
|
+
);
|
|
781
|
+
using Utils.PooledResource<BinaryFormatter> fmtLease = BinaryFormatterPool.Get(
|
|
782
|
+
out BinaryFormatter binaryFormatter
|
|
783
|
+
);
|
|
784
|
+
binaryFormatter.Serialize(stream, input);
|
|
785
|
+
return stream.ToArrayExact(ref buffer);
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
/// <summary>
|
|
789
|
+
/// Deserializes protobuf‑net bytes to <typeparamref name="T"/>.
|
|
790
|
+
/// </summary>
|
|
791
|
+
/// <typeparam name="T">Target type.</typeparam>
|
|
792
|
+
/// <param name="data">Encoded protobuf payload.</param>
|
|
793
|
+
/// <returns>The decoded instance.</returns>
|
|
794
|
+
/// <remarks>
|
|
795
|
+
/// Polymorphism and interfaces:
|
|
796
|
+
/// - If <typeparamref name="T"/> is an interface, abstract type, or <see cref="object"/>, deserialization
|
|
797
|
+
/// requires a concrete root type. We resolve this by either using an abstract base that is marked with
|
|
798
|
+
/// <c>[ProtoContract]</c> and <c>[ProtoInclude]</c> for all subtypes (e.g.,
|
|
799
|
+
/// <c>AbstractRandom</c> in the random package) or by a previously registered mapping via
|
|
800
|
+
/// <see cref="RegisterProtobufRoot{TDeclared, TRoot}()"/>. If no unique root is found, a
|
|
801
|
+
/// <see cref="ProtoException"/> is thrown to avoid ambiguous heuristics.
|
|
802
|
+
///
|
|
803
|
+
/// Examples
|
|
804
|
+
/// <code><![CDATA[
|
|
805
|
+
/// // 1) Using an abstract base with [ProtoInclude]s
|
|
806
|
+
/// [ProtoContract]
|
|
807
|
+
/// abstract class Message { }
|
|
808
|
+
/// [ProtoContract] class Ping : Message { [ProtoMember(1)] public int Id { get; set; } }
|
|
809
|
+
/// // Deserialize to the abstract base; protobuf-net resolves to Ping
|
|
810
|
+
/// Message m = Serializer.ProtoDeserialize<Message>(bytes);
|
|
811
|
+
///
|
|
812
|
+
/// // 2) Using an interface by registering a root
|
|
813
|
+
/// interface IEvent { }
|
|
814
|
+
/// [ProtoContract] class PlayerJoined : IEvent { [ProtoMember(1)] public string Name { get; set; } }
|
|
815
|
+
/// Serializer.RegisterProtobufRoot<IEvent, PlayerJoined>();
|
|
816
|
+
/// IEvent evt = Serializer.ProtoDeserialize<IEvent>(bytes);
|
|
817
|
+
///
|
|
818
|
+
/// // 3) Overload that specifies the concrete type explicitly
|
|
819
|
+
/// IEvent evt2 = Serializer.ProtoDeserialize<IEvent>(bytes, typeof(PlayerJoined));
|
|
820
|
+
/// ]]></code>
|
|
821
|
+
/// </remarks>
|
|
822
|
+
public static T ProtoDeserialize<T>(byte[] data)
|
|
823
|
+
{
|
|
824
|
+
if (data == null)
|
|
825
|
+
{
|
|
826
|
+
throw new ProtoException("No data provided for Protobuf deserialization.");
|
|
827
|
+
}
|
|
828
|
+
try
|
|
829
|
+
{
|
|
830
|
+
// Prefer zero-copy ROM/ROS overloads when available
|
|
831
|
+
if (ProtoDeserializeTypeFromROMFast != null)
|
|
832
|
+
{
|
|
833
|
+
ReadOnlyMemory<byte> rom = new(data);
|
|
834
|
+
Type declared = typeof(T);
|
|
835
|
+
if (
|
|
836
|
+
ShouldUseRuntimeTypeForProtobuf<T>(
|
|
837
|
+
declared,
|
|
838
|
+
default,
|
|
839
|
+
forceRuntimeType: false
|
|
840
|
+
)
|
|
841
|
+
)
|
|
842
|
+
{
|
|
843
|
+
Type root = ResolveProtobufRootType(declared);
|
|
844
|
+
if (root != null)
|
|
845
|
+
{
|
|
846
|
+
return (T)ProtoDeserializeTypeFromROMFast(root, rom);
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
throw new ProtoException(
|
|
850
|
+
$"Unable to resolve a unique protobuf root for declared type {declared.FullName}. Register a root via RegisterProtobufRoot or annotate a shared abstract base with [ProtoInclude]s."
|
|
851
|
+
);
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
return (T)ProtoDeserializeTypeFromROMFast(declared, rom);
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
if (ProtoDeserializeTypeFromROSFast != null)
|
|
858
|
+
{
|
|
859
|
+
ReadOnlySequence<byte> ros = new(data);
|
|
860
|
+
Type declared = typeof(T);
|
|
861
|
+
if (
|
|
862
|
+
ShouldUseRuntimeTypeForProtobuf<T>(
|
|
863
|
+
declared,
|
|
864
|
+
default,
|
|
865
|
+
forceRuntimeType: false
|
|
866
|
+
)
|
|
867
|
+
)
|
|
868
|
+
{
|
|
869
|
+
Type root = ResolveProtobufRootType(declared);
|
|
870
|
+
if (root != null)
|
|
871
|
+
{
|
|
872
|
+
return (T)ProtoDeserializeTypeFromROSFast(root, ros);
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
throw new ProtoException(
|
|
876
|
+
$"Unable to resolve a unique protobuf root for declared type {declared.FullName}. Register a root via RegisterProtobufRoot or annotate a shared abstract base with [ProtoInclude]s."
|
|
877
|
+
);
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
return (T)ProtoDeserializeTypeFromROSFast(declared, ros);
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
// For small payloads, allow protobuf-net to use MemoryStream's non-copy buffer access
|
|
884
|
+
if (data.Length <= ProtobufMemoryStreamThreshold)
|
|
885
|
+
{
|
|
886
|
+
using MemoryStream ms = new(data, writable: false);
|
|
887
|
+
Type declared = typeof(T);
|
|
888
|
+
if (
|
|
889
|
+
ShouldUseRuntimeTypeForProtobuf<T>(
|
|
890
|
+
declared,
|
|
891
|
+
default,
|
|
892
|
+
forceRuntimeType: false
|
|
893
|
+
)
|
|
894
|
+
)
|
|
895
|
+
{
|
|
896
|
+
Type root = ResolveProtobufRootType(declared);
|
|
897
|
+
if (root != null)
|
|
898
|
+
{
|
|
899
|
+
return (T)ProtoBuf.Serializer.Deserialize(root, ms);
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
throw new ProtoException(
|
|
903
|
+
$"Unable to resolve a unique protobuf root for declared type {declared.FullName}. Register a root via RegisterProtobufRoot or annotate a shared abstract base with [ProtoInclude]s."
|
|
904
|
+
);
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
return ProtoBuf.Serializer.Deserialize<T>(ms);
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
// For larger payloads, prefer pooled stream to avoid per-iteration allocations
|
|
911
|
+
using Utils.PooledResource<PooledReadOnlyMemoryStream> lease =
|
|
912
|
+
PooledReadOnlyMemoryStream.Rent(out PooledReadOnlyMemoryStream stream);
|
|
913
|
+
stream.SetBuffer(data);
|
|
914
|
+
|
|
915
|
+
Type declaredLarge = typeof(T);
|
|
916
|
+
if (
|
|
917
|
+
ShouldUseRuntimeTypeForProtobuf<T>(
|
|
918
|
+
declaredLarge,
|
|
919
|
+
default,
|
|
920
|
+
forceRuntimeType: false
|
|
921
|
+
)
|
|
922
|
+
)
|
|
923
|
+
{
|
|
924
|
+
Type root = ResolveProtobufRootType(declaredLarge);
|
|
925
|
+
if (root != null)
|
|
926
|
+
{
|
|
927
|
+
return (T)ProtoBuf.Serializer.Deserialize(root, stream);
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
throw new ProtoException(
|
|
931
|
+
$"Unable to resolve a unique protobuf root for declared type {declaredLarge.FullName}. Register a root via RegisterProtobufRoot or annotate a shared abstract base with [ProtoInclude]s."
|
|
932
|
+
);
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
return ProtoBuf.Serializer.Deserialize<T>(stream);
|
|
936
|
+
}
|
|
937
|
+
catch (ProtoException)
|
|
938
|
+
{
|
|
939
|
+
throw;
|
|
940
|
+
}
|
|
941
|
+
catch (Exception ex)
|
|
942
|
+
{
|
|
943
|
+
throw new ProtoException(
|
|
944
|
+
"Protobuf deserialization failed: invalid or corrupted data.",
|
|
945
|
+
ex
|
|
946
|
+
);
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
// Attempts to resolve a concrete root type for protobuf-net when the declared generic type
|
|
951
|
+
// is interface/abstract/object.
|
|
952
|
+
// Rules:
|
|
953
|
+
// - If a root is explicitly registered, use it.
|
|
954
|
+
// - If the declared type itself is an abstract [ProtoContract] (with [ProtoInclude]s), return the declared type
|
|
955
|
+
// to allow protobuf-net to handle subtypes via includes.
|
|
956
|
+
// - Do not auto-pick implementations based on reflection heuristics; require registration instead to avoid
|
|
957
|
+
// ambiguity and brittle ordering of loaded types.
|
|
958
|
+
private static Type ResolveProtobufRootType(Type declared)
|
|
959
|
+
{
|
|
960
|
+
if (declared == null)
|
|
961
|
+
{
|
|
962
|
+
return null;
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
// If declared is already a usable concrete type, just return it
|
|
966
|
+
if (!declared.IsInterface && !declared.IsAbstract && declared != typeof(object))
|
|
967
|
+
{
|
|
968
|
+
return declared;
|
|
969
|
+
}
|
|
970
|
+
|
|
971
|
+
// If declared itself is an abstract [ProtoContract] base with [ProtoInclude]s, prefer it
|
|
972
|
+
if (
|
|
973
|
+
declared.IsAbstract
|
|
974
|
+
&& ReflectionHelpers.HasAttributeSafe<ProtoContractAttribute>(declared)
|
|
975
|
+
)
|
|
976
|
+
{
|
|
977
|
+
return declared;
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
if (ProtobufRootCache.TryGetValue(declared, out Type cached))
|
|
981
|
+
{
|
|
982
|
+
return cached == NoRootMarker ? null : cached;
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
// Try to resolve a unique abstract [ProtoContract] base that implements the declared interface.
|
|
986
|
+
// This allows scenarios like: IRandom -> AbstractRandom (annotated with [ProtoContract] + [ProtoInclude]).
|
|
987
|
+
// We deliberately keep the search local to the declaring assembly to avoid brittle cross-assembly heuristics.
|
|
988
|
+
if (declared.IsInterface && declared != typeof(object))
|
|
989
|
+
{
|
|
990
|
+
try
|
|
991
|
+
{
|
|
992
|
+
Type[] types = ReflectionHelpers.GetTypesFromAssembly(declared.Assembly);
|
|
993
|
+
Type[] candidates = types
|
|
994
|
+
.Where(t =>
|
|
995
|
+
t.IsClass
|
|
996
|
+
&& t.IsAbstract
|
|
997
|
+
&& declared.IsAssignableFrom(t)
|
|
998
|
+
&& ReflectionHelpers.HasAttributeSafe<ProtoContractAttribute>(t)
|
|
999
|
+
)
|
|
1000
|
+
.ToArray();
|
|
1001
|
+
|
|
1002
|
+
switch (candidates.Length)
|
|
1003
|
+
{
|
|
1004
|
+
case 1:
|
|
1005
|
+
{
|
|
1006
|
+
Type root = candidates[0];
|
|
1007
|
+
ProtobufRootCache[declared] = root;
|
|
1008
|
+
return root;
|
|
1009
|
+
}
|
|
1010
|
+
case > 1:
|
|
1011
|
+
{
|
|
1012
|
+
// Prefer a candidate that explicitly declares [ProtoInclude]s if this disambiguates
|
|
1013
|
+
Type[] includeCandidates = candidates
|
|
1014
|
+
.Where(t =>
|
|
1015
|
+
ReflectionHelpers.HasAttributeSafe<ProtoIncludeAttribute>(t)
|
|
1016
|
+
)
|
|
1017
|
+
.ToArray();
|
|
1018
|
+
|
|
1019
|
+
if (includeCandidates.Length == 1)
|
|
1020
|
+
{
|
|
1021
|
+
Type root = includeCandidates[0];
|
|
1022
|
+
ProtobufRootCache[declared] = root;
|
|
1023
|
+
return root;
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
break;
|
|
1027
|
+
}
|
|
1028
|
+
}
|
|
1029
|
+
}
|
|
1030
|
+
catch
|
|
1031
|
+
{
|
|
1032
|
+
// Reflection may fail in some restricted environments; fall through to marker/null
|
|
1033
|
+
}
|
|
1034
|
+
}
|
|
1035
|
+
|
|
1036
|
+
ProtobufRootCache[declared] = NoRootMarker;
|
|
1037
|
+
return null;
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
/// <summary>
|
|
1041
|
+
/// Deserializes protobuf‑net bytes into the provided <paramref name="type"/>.
|
|
1042
|
+
/// </summary>
|
|
1043
|
+
/// <typeparam name="T">Expected return type after cast.</typeparam>
|
|
1044
|
+
/// <param name="data">Encoded protobuf payload.</param>
|
|
1045
|
+
/// <param name="type">Concrete type to deserialize to.</param>
|
|
1046
|
+
/// <returns>The decoded instance cast to <typeparamref name="T"/>.</returns>
|
|
1047
|
+
public static T ProtoDeserialize<T>(byte[] data, Type type)
|
|
1048
|
+
{
|
|
1049
|
+
if (data == null)
|
|
1050
|
+
{
|
|
1051
|
+
throw new ArgumentException(nameof(data));
|
|
1052
|
+
}
|
|
1053
|
+
|
|
1054
|
+
if (type == null)
|
|
1055
|
+
{
|
|
1056
|
+
throw new ArgumentNullException(nameof(type));
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
try
|
|
1060
|
+
{
|
|
1061
|
+
// Prefer zero-copy ROM/ROS overloads when available
|
|
1062
|
+
if (ProtoDeserializeTypeFromROMFast != null)
|
|
1063
|
+
{
|
|
1064
|
+
ReadOnlyMemory<byte> rom = new(data);
|
|
1065
|
+
return (T)ProtoDeserializeTypeFromROMFast(type, rom);
|
|
1066
|
+
}
|
|
1067
|
+
if (ProtoDeserializeTypeFromROSFast != null)
|
|
1068
|
+
{
|
|
1069
|
+
ReadOnlySequence<byte> ros = new(data);
|
|
1070
|
+
return (T)ProtoDeserializeTypeFromROSFast(type, ros);
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
if (data.Length <= ProtobufMemoryStreamThreshold)
|
|
1074
|
+
{
|
|
1075
|
+
using MemoryStream ms = new(data, writable: false);
|
|
1076
|
+
return (T)ProtoBuf.Serializer.Deserialize(type, ms);
|
|
1077
|
+
}
|
|
1078
|
+
|
|
1079
|
+
using Utils.PooledResource<PooledReadOnlyMemoryStream> lease =
|
|
1080
|
+
PooledReadOnlyMemoryStream.Rent(out PooledReadOnlyMemoryStream stream);
|
|
1081
|
+
stream.SetBuffer(data);
|
|
1082
|
+
return (T)ProtoBuf.Serializer.Deserialize(type, stream);
|
|
1083
|
+
}
|
|
1084
|
+
catch (ProtoException)
|
|
1085
|
+
{
|
|
1086
|
+
throw;
|
|
1087
|
+
}
|
|
1088
|
+
catch (Exception ex)
|
|
1089
|
+
{
|
|
1090
|
+
throw new ProtoException(
|
|
1091
|
+
"Protobuf deserialization failed: invalid or corrupted data.",
|
|
1092
|
+
ex
|
|
1093
|
+
);
|
|
1094
|
+
}
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
/// <summary>
|
|
1098
|
+
/// Serializes an instance to protobuf‑net bytes.
|
|
1099
|
+
/// </summary>
|
|
1100
|
+
/// <typeparam name="T">Declared type.</typeparam>
|
|
1101
|
+
/// <param name="input">The instance to serialize.</param>
|
|
1102
|
+
/// <param name="forceRuntimeType">When true, always serialize as the runtime type; otherwise uses declared type unless it is interface/abstract/object.</param>
|
|
1103
|
+
/// <returns>Serialized bytes.</returns>
|
|
1104
|
+
/// <example>
|
|
1105
|
+
/// <code>
|
|
1106
|
+
/// [ProtoContract]
|
|
1107
|
+
/// class NetworkMessage { [ProtoMember(1)] public int Id { get; set; } }
|
|
1108
|
+
/// var bytes = Serializer.ProtoSerialize(new NetworkMessage { Id = 5 });
|
|
1109
|
+
/// var msg = Serializer.ProtoDeserialize<NetworkMessage>(bytes);
|
|
1110
|
+
/// </code>
|
|
1111
|
+
/// </example>
|
|
1112
|
+
public static byte[] ProtoSerialize<T>(T input, bool forceRuntimeType = false)
|
|
1113
|
+
{
|
|
1114
|
+
using Utils.PooledResource<PooledBufferStream> lease = PooledBufferStream.Rent(
|
|
1115
|
+
out PooledBufferStream stream
|
|
1116
|
+
);
|
|
1117
|
+
Type declared = typeof(T);
|
|
1118
|
+
bool useRuntime = ShouldUseRuntimeTypeForProtobuf(declared, input, forceRuntimeType);
|
|
1119
|
+
|
|
1120
|
+
if (useRuntime)
|
|
1121
|
+
{
|
|
1122
|
+
ProtoBuf.Serializer.NonGeneric.Serialize(stream, input);
|
|
1123
|
+
}
|
|
1124
|
+
else
|
|
1125
|
+
{
|
|
1126
|
+
ProtoBuf.Serializer.Serialize(stream, input);
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
byte[] buffer = null;
|
|
1130
|
+
stream.ToArrayExact(ref buffer);
|
|
1131
|
+
return buffer;
|
|
1132
|
+
}
|
|
1133
|
+
|
|
1134
|
+
/// <summary>
|
|
1135
|
+
/// Serializes an instance to protobuf‑net bytes into a caller-provided buffer.
|
|
1136
|
+
/// </summary>
|
|
1137
|
+
/// <typeparam name="T">Declared type.</typeparam>
|
|
1138
|
+
/// <param name="input">The instance to serialize.</param>
|
|
1139
|
+
/// <param name="buffer">Destination buffer reference. Resized if necessary.</param>
|
|
1140
|
+
/// <param name="forceRuntimeType">When true, always serialize as the runtime type.</param>
|
|
1141
|
+
/// <returns>Number of bytes written.</returns>
|
|
1142
|
+
public static int ProtoSerialize<T>(
|
|
1143
|
+
T input,
|
|
1144
|
+
ref byte[] buffer,
|
|
1145
|
+
bool forceRuntimeType = false
|
|
1146
|
+
)
|
|
1147
|
+
{
|
|
1148
|
+
using Utils.PooledResource<PooledBufferStream> lease = PooledBufferStream.Rent(
|
|
1149
|
+
out PooledBufferStream stream
|
|
1150
|
+
);
|
|
1151
|
+
Type declared = typeof(T);
|
|
1152
|
+
bool useRuntime = ShouldUseRuntimeTypeForProtobuf(declared, input, forceRuntimeType);
|
|
1153
|
+
|
|
1154
|
+
if (useRuntime)
|
|
1155
|
+
{
|
|
1156
|
+
ProtoBuf.Serializer.NonGeneric.Serialize(stream, input);
|
|
1157
|
+
}
|
|
1158
|
+
else
|
|
1159
|
+
{
|
|
1160
|
+
ProtoBuf.Serializer.Serialize(stream, input);
|
|
1161
|
+
}
|
|
1162
|
+
return stream.ToArrayExact(ref buffer);
|
|
1163
|
+
}
|
|
1164
|
+
|
|
1165
|
+
/// <summary>
|
|
1166
|
+
/// Deserializes JSON text to <typeparamref name="T"/> using Unity‑aware converters.
|
|
1167
|
+
/// </summary>
|
|
1168
|
+
/// <typeparam name="T">Target type.</typeparam>
|
|
1169
|
+
/// <param name="data">JSON string.</param>
|
|
1170
|
+
/// <param name="type">Optional concrete target type (defaults to <typeparamref name="T"/>).</param>
|
|
1171
|
+
/// <param name="options">Serializer options; defaults include converters for Unity types and ReferenceHandler.IgnoreCycles.</param>
|
|
1172
|
+
/// <returns>The decoded instance.</returns>
|
|
1173
|
+
public static T JsonDeserialize<T>(
|
|
1174
|
+
string data,
|
|
1175
|
+
Type type = null,
|
|
1176
|
+
JsonSerializerOptions options = null
|
|
1177
|
+
)
|
|
1178
|
+
{
|
|
1179
|
+
return (T)
|
|
1180
|
+
JsonSerializer.Deserialize(
|
|
1181
|
+
data,
|
|
1182
|
+
type ?? typeof(T),
|
|
1183
|
+
options ?? SerializerEncoding.NormalJsonOptions
|
|
1184
|
+
);
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
/// <summary>
|
|
1188
|
+
/// Deserializes JSON bytes (UTF-8) to <typeparamref name="T"/> using Unity-aware converters.
|
|
1189
|
+
/// Avoids intermediate string allocation by using span-based System.Text.Json APIs.
|
|
1190
|
+
/// </summary>
|
|
1191
|
+
/// <typeparam name="T">Target type.</typeparam>
|
|
1192
|
+
/// <param name="data">UTF-8 JSON bytes.</param>
|
|
1193
|
+
/// <param name="type">Optional concrete target type (defaults to <typeparamref name="T"/>).</param>
|
|
1194
|
+
/// <param name="options">Serializer options; defaults include Unity converters.</param>
|
|
1195
|
+
/// <returns>The decoded instance.</returns>
|
|
1196
|
+
public static T JsonDeserialize<T>(
|
|
1197
|
+
byte[] data,
|
|
1198
|
+
Type type = null,
|
|
1199
|
+
JsonSerializerOptions options = null
|
|
1200
|
+
)
|
|
1201
|
+
{
|
|
1202
|
+
if (data == null)
|
|
1203
|
+
{
|
|
1204
|
+
throw new ArgumentNullException(nameof(data));
|
|
1205
|
+
}
|
|
1206
|
+
|
|
1207
|
+
ReadOnlySpan<byte> span = new(data);
|
|
1208
|
+
return (T)
|
|
1209
|
+
JsonSerializer.Deserialize(
|
|
1210
|
+
span,
|
|
1211
|
+
type ?? typeof(T),
|
|
1212
|
+
options ?? SerializerEncoding.NormalJsonOptions
|
|
1213
|
+
);
|
|
1214
|
+
}
|
|
1215
|
+
|
|
1216
|
+
/// <summary>
|
|
1217
|
+
/// Fast-path JSON deserialize using strict, allocation-lean options.
|
|
1218
|
+
/// </summary>
|
|
1219
|
+
public static T JsonDeserializeFast<T>(byte[] data)
|
|
1220
|
+
{
|
|
1221
|
+
if (data == null)
|
|
1222
|
+
{
|
|
1223
|
+
throw new ArgumentNullException(nameof(data));
|
|
1224
|
+
}
|
|
1225
|
+
ReadOnlySpan<byte> span = new(data);
|
|
1226
|
+
return JsonSerializer.Deserialize<T>(span, SerializerEncoding.FastJsonOptions);
|
|
1227
|
+
}
|
|
1228
|
+
|
|
1229
|
+
/// <summary>
|
|
1230
|
+
/// Serializes an instance to JSON bytes (UTF‑8) using Unity‑aware converters.
|
|
1231
|
+
/// </summary>
|
|
1232
|
+
/// <typeparam name="T">Instance type.</typeparam>
|
|
1233
|
+
/// <param name="input">The instance to serialize.</param>
|
|
1234
|
+
/// <returns>UTF‑8 JSON bytes.</returns>
|
|
1235
|
+
public static byte[] JsonSerialize<T>(T input)
|
|
1236
|
+
{
|
|
1237
|
+
using Utils.PooledResource<PooledArrayBufferWriter> lease =
|
|
1238
|
+
PooledArrayBufferWriter.Rent(out PooledArrayBufferWriter bufferWriter);
|
|
1239
|
+
WriteJsonToBuffer(input, SerializerEncoding.NormalJsonOptions, bufferWriter);
|
|
1240
|
+
byte[] buffer = null;
|
|
1241
|
+
bufferWriter.ToArrayExact(ref buffer);
|
|
1242
|
+
return buffer;
|
|
1243
|
+
}
|
|
1244
|
+
|
|
1245
|
+
/// <summary>
|
|
1246
|
+
/// Serializes an instance to JSON bytes (UTF-8) using caller-provided options.
|
|
1247
|
+
/// Tip: Reuse the same options instance across calls to benefit from metadata caches.
|
|
1248
|
+
/// </summary>
|
|
1249
|
+
public static byte[] JsonSerialize<T>(T input, JsonSerializerOptions options)
|
|
1250
|
+
{
|
|
1251
|
+
using Utils.PooledResource<PooledArrayBufferWriter> lease =
|
|
1252
|
+
PooledArrayBufferWriter.Rent(out PooledArrayBufferWriter bufferWriter);
|
|
1253
|
+
WriteJsonToBuffer(input, options ?? SerializerEncoding.NormalJsonOptions, bufferWriter);
|
|
1254
|
+
byte[] buffer = null;
|
|
1255
|
+
bufferWriter.ToArrayExact(ref buffer);
|
|
1256
|
+
return buffer;
|
|
1257
|
+
}
|
|
1258
|
+
|
|
1259
|
+
/// <summary>
|
|
1260
|
+
/// Serializes an instance to JSON bytes (UTF‑8) into a caller-provided buffer.
|
|
1261
|
+
/// </summary>
|
|
1262
|
+
/// <typeparam name="T">Instance type.</typeparam>
|
|
1263
|
+
/// <param name="input">The instance to serialize.</param>
|
|
1264
|
+
/// <param name="buffer">Destination buffer reference. Resized if necessary.</param>
|
|
1265
|
+
/// <returns>Number of bytes written.</returns>
|
|
1266
|
+
public static int JsonSerialize<T>(T input, ref byte[] buffer)
|
|
1267
|
+
{
|
|
1268
|
+
using Utils.PooledResource<PooledArrayBufferWriter> lease =
|
|
1269
|
+
PooledArrayBufferWriter.Rent(out PooledArrayBufferWriter bufferWriter);
|
|
1270
|
+
WriteJsonToBuffer(input, SerializerEncoding.NormalJsonOptions, bufferWriter);
|
|
1271
|
+
return bufferWriter.ToArrayExact(ref buffer);
|
|
1272
|
+
}
|
|
1273
|
+
|
|
1274
|
+
/// <summary>
|
|
1275
|
+
/// Serializes into a caller-provided buffer using caller options.
|
|
1276
|
+
/// Reuses the provided buffer when large enough to avoid allocations; resizes if necessary.
|
|
1277
|
+
/// </summary>
|
|
1278
|
+
public static int JsonSerialize<T>(
|
|
1279
|
+
T input,
|
|
1280
|
+
JsonSerializerOptions options,
|
|
1281
|
+
ref byte[] buffer
|
|
1282
|
+
)
|
|
1283
|
+
{
|
|
1284
|
+
using Utils.PooledResource<PooledArrayBufferWriter> lease =
|
|
1285
|
+
PooledArrayBufferWriter.Rent(out PooledArrayBufferWriter bufferWriter);
|
|
1286
|
+
WriteJsonToBuffer(input, options ?? SerializerEncoding.NormalJsonOptions, bufferWriter);
|
|
1287
|
+
return bufferWriter.ToArrayExact(ref buffer);
|
|
1288
|
+
}
|
|
1289
|
+
|
|
1290
|
+
/// <summary>
|
|
1291
|
+
/// Serializes into a caller-provided buffer using caller options and a size hint to reduce growth copies.
|
|
1292
|
+
/// Provide an approximate size of the final payload to minimize buffer growth/copy churn for large outputs.
|
|
1293
|
+
/// Example: for large int[] payloads, estimate (count * 12) + overhead.
|
|
1294
|
+
/// </summary>
|
|
1295
|
+
public static int JsonSerialize<T>(
|
|
1296
|
+
T input,
|
|
1297
|
+
JsonSerializerOptions options,
|
|
1298
|
+
int sizeHint,
|
|
1299
|
+
ref byte[] buffer
|
|
1300
|
+
)
|
|
1301
|
+
{
|
|
1302
|
+
using Utils.PooledResource<PooledArrayBufferWriter> lease =
|
|
1303
|
+
PooledArrayBufferWriter.Rent(out PooledArrayBufferWriter bufferWriter);
|
|
1304
|
+
if (sizeHint > 0)
|
|
1305
|
+
{
|
|
1306
|
+
bufferWriter.Preallocate(sizeHint);
|
|
1307
|
+
}
|
|
1308
|
+
WriteJsonToBuffer(input, options ?? SerializerEncoding.NormalJsonOptions, bufferWriter);
|
|
1309
|
+
return bufferWriter.ToArrayExact(ref buffer);
|
|
1310
|
+
}
|
|
1311
|
+
|
|
1312
|
+
/// <summary>
|
|
1313
|
+
/// Fast-path JSON serialize using strict, allocation-lean options.
|
|
1314
|
+
/// </summary>
|
|
1315
|
+
public static byte[] JsonSerializeFast<T>(T input)
|
|
1316
|
+
{
|
|
1317
|
+
using Utils.PooledResource<PooledArrayBufferWriter> lease =
|
|
1318
|
+
PooledArrayBufferWriter.Rent(out PooledArrayBufferWriter bufferWriter);
|
|
1319
|
+
WriteJsonToBuffer(input, SerializerEncoding.FastJsonOptions, bufferWriter);
|
|
1320
|
+
byte[] buffer = null;
|
|
1321
|
+
bufferWriter.ToArrayExact(ref buffer);
|
|
1322
|
+
return buffer;
|
|
1323
|
+
}
|
|
1324
|
+
|
|
1325
|
+
/// <summary>
|
|
1326
|
+
/// Fast-path JSON serialize into a caller-provided buffer.
|
|
1327
|
+
/// </summary>
|
|
1328
|
+
public static int JsonSerializeFast<T>(T input, ref byte[] buffer)
|
|
1329
|
+
{
|
|
1330
|
+
using Utils.PooledResource<PooledArrayBufferWriter> lease =
|
|
1331
|
+
PooledArrayBufferWriter.Rent(out PooledArrayBufferWriter bufferWriter);
|
|
1332
|
+
WriteJsonToBuffer(input, SerializerEncoding.FastJsonOptions, bufferWriter);
|
|
1333
|
+
return bufferWriter.ToArrayExact(ref buffer);
|
|
1334
|
+
}
|
|
1335
|
+
|
|
1336
|
+
private static void WriteJsonToStream<T>(
|
|
1337
|
+
T input,
|
|
1338
|
+
JsonSerializerOptions options,
|
|
1339
|
+
Stream stream
|
|
1340
|
+
)
|
|
1341
|
+
{
|
|
1342
|
+
if (options == null)
|
|
1343
|
+
{
|
|
1344
|
+
throw new ArgumentNullException(nameof(options));
|
|
1345
|
+
}
|
|
1346
|
+
if (stream == null)
|
|
1347
|
+
{
|
|
1348
|
+
throw new ArgumentNullException(nameof(stream));
|
|
1349
|
+
}
|
|
1350
|
+
|
|
1351
|
+
using (JsonWriterPool.Get(out Utf8JsonWriter writer))
|
|
1352
|
+
{
|
|
1353
|
+
writer.Reset(stream);
|
|
1354
|
+
Type parameterType = typeof(T);
|
|
1355
|
+
if (
|
|
1356
|
+
parameterType.IsAbstract
|
|
1357
|
+
|| parameterType.IsInterface
|
|
1358
|
+
|| parameterType == typeof(object)
|
|
1359
|
+
)
|
|
1360
|
+
{
|
|
1361
|
+
object data = input;
|
|
1362
|
+
if (data == null)
|
|
1363
|
+
{
|
|
1364
|
+
writer.WriteStartObject();
|
|
1365
|
+
writer.WriteEndObject();
|
|
1366
|
+
writer.Flush();
|
|
1367
|
+
return;
|
|
1368
|
+
}
|
|
1369
|
+
|
|
1370
|
+
Type type = data.GetType();
|
|
1371
|
+
JsonSerializer.Serialize(writer, data, type, options);
|
|
1372
|
+
}
|
|
1373
|
+
else
|
|
1374
|
+
{
|
|
1375
|
+
JsonSerializer.Serialize(writer, input, options);
|
|
1376
|
+
}
|
|
1377
|
+
writer.Flush();
|
|
1378
|
+
}
|
|
1379
|
+
}
|
|
1380
|
+
|
|
1381
|
+
/// <summary>
|
|
1382
|
+
/// Serializes an instance to a JSON string.
|
|
1383
|
+
/// </summary>
|
|
1384
|
+
/// <typeparam name="T">Instance type.</typeparam>
|
|
1385
|
+
/// <param name="input">The instance to serialize.</param>
|
|
1386
|
+
/// <param name="pretty">Write indented output when true.</param>
|
|
1387
|
+
/// <returns>JSON text.</returns>
|
|
1388
|
+
/// <example>
|
|
1389
|
+
/// <code>
|
|
1390
|
+
/// var json = Serializer.JsonStringify(save, pretty: true);
|
|
1391
|
+
/// var roundtrip = Serializer.JsonDeserialize<SaveData>(json);
|
|
1392
|
+
/// </code>
|
|
1393
|
+
/// </example>
|
|
1394
|
+
public static string JsonStringify<T>(T input, bool pretty = false)
|
|
1395
|
+
{
|
|
1396
|
+
JsonSerializerOptions options = pretty
|
|
1397
|
+
? SerializerEncoding.PrettyJsonOptions
|
|
1398
|
+
: SerializerEncoding.NormalJsonOptions;
|
|
1399
|
+
|
|
1400
|
+
return JsonStringify(input, options);
|
|
1401
|
+
}
|
|
1402
|
+
|
|
1403
|
+
/// <summary>
|
|
1404
|
+
/// Serializes an instance to a JSON string using the provided <paramref name="options"/>.
|
|
1405
|
+
/// </summary>
|
|
1406
|
+
/// <typeparam name="T">Instance type.</typeparam>
|
|
1407
|
+
/// <param name="input">The instance to serialize.</param>
|
|
1408
|
+
/// <param name="options">Serializer options.</param>
|
|
1409
|
+
/// <returns>JSON text.</returns>
|
|
1410
|
+
public static string JsonStringify<T>(T input, JsonSerializerOptions options)
|
|
1411
|
+
{
|
|
1412
|
+
if (options == null)
|
|
1413
|
+
{
|
|
1414
|
+
throw new ArgumentNullException(nameof(options));
|
|
1415
|
+
}
|
|
1416
|
+
|
|
1417
|
+
Type parameterType = typeof(T);
|
|
1418
|
+
if (
|
|
1419
|
+
parameterType.IsAbstract
|
|
1420
|
+
|| parameterType.IsInterface
|
|
1421
|
+
|| parameterType == typeof(object)
|
|
1422
|
+
)
|
|
1423
|
+
{
|
|
1424
|
+
object data = input;
|
|
1425
|
+
if (data == null)
|
|
1426
|
+
{
|
|
1427
|
+
return "{}";
|
|
1428
|
+
}
|
|
1429
|
+
|
|
1430
|
+
Type type = data.GetType();
|
|
1431
|
+
return JsonSerializer.Serialize(data, type, options);
|
|
1432
|
+
}
|
|
1433
|
+
|
|
1434
|
+
return JsonSerializer.Serialize(input, options);
|
|
1435
|
+
}
|
|
1436
|
+
|
|
1437
|
+
/// <summary>
|
|
1438
|
+
/// Reads JSON text from a file (UTF‑8) and deserializes to <typeparamref name="T"/>.
|
|
1439
|
+
/// </summary>
|
|
1440
|
+
/// <typeparam name="T">Target type.</typeparam>
|
|
1441
|
+
/// <param name="path">File path.</param>
|
|
1442
|
+
/// <returns>Decoded instance.</returns>
|
|
1443
|
+
public static T ReadFromJsonFile<T>(string path)
|
|
1444
|
+
{
|
|
1445
|
+
byte[] settingsAsBytes = File.ReadAllBytes(path);
|
|
1446
|
+
return JsonDeserialize<T>(settingsAsBytes);
|
|
1447
|
+
}
|
|
1448
|
+
|
|
1449
|
+
private static void WriteJsonToBuffer<T>(
|
|
1450
|
+
T input,
|
|
1451
|
+
JsonSerializerOptions options,
|
|
1452
|
+
PooledArrayBufferWriter buffer
|
|
1453
|
+
)
|
|
1454
|
+
{
|
|
1455
|
+
if (options == null)
|
|
1456
|
+
{
|
|
1457
|
+
throw new ArgumentNullException(nameof(options));
|
|
1458
|
+
}
|
|
1459
|
+
if (buffer == null)
|
|
1460
|
+
{
|
|
1461
|
+
throw new ArgumentNullException(nameof(buffer));
|
|
1462
|
+
}
|
|
1463
|
+
|
|
1464
|
+
using (
|
|
1465
|
+
Utf8JsonWriter writer = new(buffer, new JsonWriterOptions { SkipValidation = true })
|
|
1466
|
+
)
|
|
1467
|
+
{
|
|
1468
|
+
Type parameterType = typeof(T);
|
|
1469
|
+
if (
|
|
1470
|
+
parameterType.IsAbstract
|
|
1471
|
+
|| parameterType.IsInterface
|
|
1472
|
+
|| parameterType == typeof(object)
|
|
1473
|
+
)
|
|
1474
|
+
{
|
|
1475
|
+
object data = input;
|
|
1476
|
+
if (data == null)
|
|
1477
|
+
{
|
|
1478
|
+
writer.WriteStartObject();
|
|
1479
|
+
writer.WriteEndObject();
|
|
1480
|
+
writer.Flush();
|
|
1481
|
+
return;
|
|
1482
|
+
}
|
|
1483
|
+
|
|
1484
|
+
Type type = data.GetType();
|
|
1485
|
+
JsonSerializer.Serialize(writer, data, type, options);
|
|
1486
|
+
}
|
|
1487
|
+
else
|
|
1488
|
+
{
|
|
1489
|
+
JsonSerializer.Serialize(writer, input, options);
|
|
1490
|
+
}
|
|
1491
|
+
writer.Flush();
|
|
1492
|
+
}
|
|
1493
|
+
}
|
|
1494
|
+
|
|
1495
|
+
/// <summary>
|
|
1496
|
+
/// Asynchronously reads JSON text from a file (UTF‑8) and deserializes to <typeparamref name="T"/>.
|
|
1497
|
+
/// </summary>
|
|
1498
|
+
/// <typeparam name="T">Target type.</typeparam>
|
|
1499
|
+
/// <param name="path">File path.</param>
|
|
1500
|
+
/// <returns>Decoded instance.</returns>
|
|
1501
|
+
public static async Task<T> ReadFromJsonFileAsync<T>(string path)
|
|
1502
|
+
{
|
|
1503
|
+
byte[] settingsAsBytes = await File.ReadAllBytesAsync(path);
|
|
1504
|
+
return JsonDeserialize<T>(settingsAsBytes);
|
|
1505
|
+
}
|
|
1506
|
+
|
|
1507
|
+
/// <summary>
|
|
1508
|
+
/// Asynchronously reads JSON with cancellation.
|
|
1509
|
+
/// </summary>
|
|
1510
|
+
public static async Task<T> ReadFromJsonFileAsync<T>(
|
|
1511
|
+
string path,
|
|
1512
|
+
System.Threading.CancellationToken cancellationToken
|
|
1513
|
+
)
|
|
1514
|
+
{
|
|
1515
|
+
using FileStream fs = new(
|
|
1516
|
+
path,
|
|
1517
|
+
FileMode.Open,
|
|
1518
|
+
FileAccess.Read,
|
|
1519
|
+
FileShare.Read,
|
|
1520
|
+
4096,
|
|
1521
|
+
useAsync: true
|
|
1522
|
+
);
|
|
1523
|
+
using Utils.PooledResource<PooledBufferStream> lease = PooledBufferStream.Rent(
|
|
1524
|
+
out PooledBufferStream stream
|
|
1525
|
+
);
|
|
1526
|
+
byte[] buffer = new byte[8192];
|
|
1527
|
+
int read;
|
|
1528
|
+
while ((read = await fs.ReadAsync(buffer, 0, buffer.Length, cancellationToken)) > 0)
|
|
1529
|
+
{
|
|
1530
|
+
stream.Write(buffer, 0, read);
|
|
1531
|
+
}
|
|
1532
|
+
ArraySegment<byte> seg = stream.GetWrittenSegment();
|
|
1533
|
+
return JsonDeserialize<T>(seg.Array.AsSpan(0, seg.Count).ToArray());
|
|
1534
|
+
}
|
|
1535
|
+
|
|
1536
|
+
/// <summary>
|
|
1537
|
+
/// Writes an instance to a JSON file (UTF‑8).
|
|
1538
|
+
/// </summary>
|
|
1539
|
+
/// <typeparam name="T">Instance type.</typeparam>
|
|
1540
|
+
/// <param name="input">The instance to serialize.</param>
|
|
1541
|
+
/// <param name="path">Destination file path.</param>
|
|
1542
|
+
/// <param name="pretty">Write indented output when true.</param>
|
|
1543
|
+
public static void WriteToJsonFile<T>(T input, string path, bool pretty = true)
|
|
1544
|
+
{
|
|
1545
|
+
string jsonAsText = JsonStringify(input, pretty);
|
|
1546
|
+
File.WriteAllText(path, jsonAsText);
|
|
1547
|
+
}
|
|
1548
|
+
|
|
1549
|
+
/// <summary>
|
|
1550
|
+
/// Asynchronously writes an instance to a JSON file (UTF‑8).
|
|
1551
|
+
/// </summary>
|
|
1552
|
+
/// <typeparam name="T">Instance type.</typeparam>
|
|
1553
|
+
/// <param name="input">The instance to serialize.</param>
|
|
1554
|
+
/// <param name="path">Destination file path.</param>
|
|
1555
|
+
/// <param name="pretty">Write indented output when true.</param>
|
|
1556
|
+
public static async Task WriteToJsonFileAsync<T>(T input, string path, bool pretty = true)
|
|
1557
|
+
{
|
|
1558
|
+
string jsonAsText = JsonStringify(input, pretty);
|
|
1559
|
+
await File.WriteAllTextAsync(path, jsonAsText);
|
|
1560
|
+
}
|
|
1561
|
+
|
|
1562
|
+
/// <summary>
|
|
1563
|
+
/// Asynchronously writes an instance to a JSON file (UTF‑8) with cancellation.
|
|
1564
|
+
/// </summary>
|
|
1565
|
+
public static async Task WriteToJsonFileAsync<T>(
|
|
1566
|
+
T input,
|
|
1567
|
+
string path,
|
|
1568
|
+
bool pretty,
|
|
1569
|
+
System.Threading.CancellationToken cancellationToken
|
|
1570
|
+
)
|
|
1571
|
+
{
|
|
1572
|
+
string jsonAsText = JsonStringify(input, pretty);
|
|
1573
|
+
byte[] bytes = SerializerEncoding.Encoding.GetBytes(jsonAsText);
|
|
1574
|
+
using FileStream fs = new(
|
|
1575
|
+
path,
|
|
1576
|
+
FileMode.Create,
|
|
1577
|
+
FileAccess.Write,
|
|
1578
|
+
FileShare.None,
|
|
1579
|
+
4096,
|
|
1580
|
+
useAsync: true
|
|
1581
|
+
);
|
|
1582
|
+
await fs.WriteAsync(bytes, 0, bytes.Length, cancellationToken);
|
|
1583
|
+
}
|
|
1584
|
+
|
|
1585
|
+
/// <summary>
|
|
1586
|
+
/// Writes an instance to a JSON file (UTF‑8) using the provided <paramref name="options"/>.
|
|
1587
|
+
/// </summary>
|
|
1588
|
+
/// <typeparam name="T">Instance type.</typeparam>
|
|
1589
|
+
/// <param name="input">The instance to serialize.</param>
|
|
1590
|
+
/// <param name="path">Destination file path.</param>
|
|
1591
|
+
/// <param name="options">Serializer options.</param>
|
|
1592
|
+
public static void WriteToJsonFile<T>(T input, string path, JsonSerializerOptions options)
|
|
1593
|
+
{
|
|
1594
|
+
string jsonAsText = JsonStringify(input, options);
|
|
1595
|
+
File.WriteAllText(path, jsonAsText);
|
|
1596
|
+
}
|
|
1597
|
+
|
|
1598
|
+
/// <summary>
|
|
1599
|
+
/// Asynchronously writes an instance to a JSON file (UTF‑8) using the provided <paramref name="options"/>.
|
|
1600
|
+
/// </summary>
|
|
1601
|
+
/// <typeparam name="T">Instance type.</typeparam>
|
|
1602
|
+
/// <param name="input">The instance to serialize.</param>
|
|
1603
|
+
/// <param name="path">Destination file path.</param>
|
|
1604
|
+
/// <param name="options">Serializer options.</param>
|
|
1605
|
+
public static async Task WriteToJsonFileAsync<T>(
|
|
1606
|
+
T input,
|
|
1607
|
+
string path,
|
|
1608
|
+
JsonSerializerOptions options
|
|
1609
|
+
)
|
|
1610
|
+
{
|
|
1611
|
+
string jsonAsText = JsonStringify(input, options);
|
|
1612
|
+
await File.WriteAllTextAsync(path, jsonAsText);
|
|
1613
|
+
}
|
|
1614
|
+
|
|
1615
|
+
/// <summary>
|
|
1616
|
+
/// Attempts to read JSON into an instance, returns false if file missing or invalid.
|
|
1617
|
+
/// </summary>
|
|
1618
|
+
public static bool TryReadFromJsonFile<T>(string path, out T value)
|
|
1619
|
+
{
|
|
1620
|
+
try
|
|
1621
|
+
{
|
|
1622
|
+
if (!File.Exists(path))
|
|
1623
|
+
{
|
|
1624
|
+
value = default;
|
|
1625
|
+
return false;
|
|
1626
|
+
}
|
|
1627
|
+
string json = File.ReadAllText(path);
|
|
1628
|
+
value = JsonDeserialize<T>(json);
|
|
1629
|
+
return true;
|
|
1630
|
+
}
|
|
1631
|
+
catch
|
|
1632
|
+
{
|
|
1633
|
+
value = default;
|
|
1634
|
+
return false;
|
|
1635
|
+
}
|
|
1636
|
+
}
|
|
1637
|
+
|
|
1638
|
+
/// <summary>
|
|
1639
|
+
/// Attempts to write JSON to a file, returns false on failure.
|
|
1640
|
+
/// </summary>
|
|
1641
|
+
public static bool TryWriteToJsonFile<T>(T input, string path, bool pretty = true)
|
|
1642
|
+
{
|
|
1643
|
+
try
|
|
1644
|
+
{
|
|
1645
|
+
WriteToJsonFile(input, path, pretty);
|
|
1646
|
+
return true;
|
|
1647
|
+
}
|
|
1648
|
+
catch
|
|
1649
|
+
{
|
|
1650
|
+
return false;
|
|
1651
|
+
}
|
|
1652
|
+
}
|
|
1653
|
+
}
|
|
1654
|
+
|
|
1655
|
+
// Internal pooled, growable write stream backed by ArrayPool<byte> to reduce allocations
|
|
1656
|
+
internal sealed class PooledBufferStream : Stream
|
|
1657
|
+
{
|
|
1658
|
+
private const int DefaultInitialCapacity = 256;
|
|
1659
|
+
|
|
1660
|
+
private byte[] _buffer;
|
|
1661
|
+
private int _length;
|
|
1662
|
+
private int _position;
|
|
1663
|
+
private bool _disposed;
|
|
1664
|
+
|
|
1665
|
+
private static readonly Utils.WallstopGenericPool<PooledBufferStream> Pool = new(
|
|
1666
|
+
producer: () => new PooledBufferStream(),
|
|
1667
|
+
onRelease: stream => stream.ResetForReuse(),
|
|
1668
|
+
onDisposal: stream => stream.Dispose()
|
|
1669
|
+
);
|
|
1670
|
+
|
|
1671
|
+
public static Utils.PooledResource<PooledBufferStream> Rent(
|
|
1672
|
+
out PooledBufferStream stream
|
|
1673
|
+
) => Pool.Get(out stream);
|
|
1674
|
+
|
|
1675
|
+
private PooledBufferStream(int initialCapacity = DefaultInitialCapacity)
|
|
1676
|
+
{
|
|
1677
|
+
if (initialCapacity < 1)
|
|
1678
|
+
{
|
|
1679
|
+
initialCapacity = DefaultInitialCapacity;
|
|
1680
|
+
}
|
|
1681
|
+
|
|
1682
|
+
_buffer = ArrayPool<byte>.Shared.Rent(initialCapacity);
|
|
1683
|
+
_length = 0;
|
|
1684
|
+
_position = 0;
|
|
1685
|
+
}
|
|
1686
|
+
|
|
1687
|
+
internal ArraySegment<byte> GetWrittenSegment()
|
|
1688
|
+
{
|
|
1689
|
+
return new ArraySegment<byte>(_buffer, 0, _length);
|
|
1690
|
+
}
|
|
1691
|
+
|
|
1692
|
+
private void ResetForReuse()
|
|
1693
|
+
{
|
|
1694
|
+
_length = 0;
|
|
1695
|
+
_position = 0;
|
|
1696
|
+
_disposed = false;
|
|
1697
|
+
}
|
|
1698
|
+
|
|
1699
|
+
public override bool CanRead => false;
|
|
1700
|
+
public override bool CanSeek => true;
|
|
1701
|
+
public override bool CanWrite => true;
|
|
1702
|
+
public override long Length => _length;
|
|
1703
|
+
|
|
1704
|
+
public override long Position
|
|
1705
|
+
{
|
|
1706
|
+
get => _position;
|
|
1707
|
+
set => Seek(value, SeekOrigin.Begin);
|
|
1708
|
+
}
|
|
1709
|
+
|
|
1710
|
+
public override void Flush() { }
|
|
1711
|
+
|
|
1712
|
+
public override int Read(byte[] buffer, int offset, int count)
|
|
1713
|
+
{
|
|
1714
|
+
throw new NotSupportedException();
|
|
1715
|
+
}
|
|
1716
|
+
|
|
1717
|
+
public override long Seek(long offset, SeekOrigin origin)
|
|
1718
|
+
{
|
|
1719
|
+
int basePos = origin switch
|
|
1720
|
+
{
|
|
1721
|
+
SeekOrigin.Begin => 0,
|
|
1722
|
+
SeekOrigin.Current => _position,
|
|
1723
|
+
SeekOrigin.End => _length,
|
|
1724
|
+
_ => 0,
|
|
1725
|
+
};
|
|
1726
|
+
long newPos = basePos + offset;
|
|
1727
|
+
if (newPos is < 0 or > int.MaxValue)
|
|
1728
|
+
{
|
|
1729
|
+
throw new ArgumentOutOfRangeException(nameof(offset));
|
|
1730
|
+
}
|
|
1731
|
+
_position = (int)newPos;
|
|
1732
|
+
return _position;
|
|
1733
|
+
}
|
|
1734
|
+
|
|
1735
|
+
public override void SetLength(long value)
|
|
1736
|
+
{
|
|
1737
|
+
if (value is < 0 or > int.MaxValue)
|
|
1738
|
+
{
|
|
1739
|
+
throw new ArgumentOutOfRangeException(nameof(value));
|
|
1740
|
+
}
|
|
1741
|
+
int newLen = (int)value;
|
|
1742
|
+
EnsureCapacity(newLen);
|
|
1743
|
+
_length = newLen;
|
|
1744
|
+
if (_position > _length)
|
|
1745
|
+
{
|
|
1746
|
+
_position = _length;
|
|
1747
|
+
}
|
|
1748
|
+
}
|
|
1749
|
+
|
|
1750
|
+
public override void Write(byte[] buffer, int offset, int count)
|
|
1751
|
+
{
|
|
1752
|
+
int endPos = _position + count;
|
|
1753
|
+
EnsureCapacity(endPos);
|
|
1754
|
+
Array.Copy(buffer, offset, _buffer, _position, count);
|
|
1755
|
+
_position = endPos;
|
|
1756
|
+
if (endPos > _length)
|
|
1757
|
+
{
|
|
1758
|
+
_length = endPos;
|
|
1759
|
+
}
|
|
1760
|
+
}
|
|
1761
|
+
|
|
1762
|
+
public override void WriteByte(byte value)
|
|
1763
|
+
{
|
|
1764
|
+
int endPos = _position + 1;
|
|
1765
|
+
EnsureCapacity(endPos);
|
|
1766
|
+
_buffer[_position] = value;
|
|
1767
|
+
_position = endPos;
|
|
1768
|
+
if (endPos > _length)
|
|
1769
|
+
{
|
|
1770
|
+
_length = endPos;
|
|
1771
|
+
}
|
|
1772
|
+
}
|
|
1773
|
+
|
|
1774
|
+
private void EnsureCapacity(int required)
|
|
1775
|
+
{
|
|
1776
|
+
if (_buffer.Length >= required)
|
|
1777
|
+
{
|
|
1778
|
+
return;
|
|
1779
|
+
}
|
|
1780
|
+
|
|
1781
|
+
int newSize = _buffer.Length;
|
|
1782
|
+
if (newSize < DefaultInitialCapacity)
|
|
1783
|
+
{
|
|
1784
|
+
newSize = DefaultInitialCapacity;
|
|
1785
|
+
}
|
|
1786
|
+
|
|
1787
|
+
while (newSize < required)
|
|
1788
|
+
{
|
|
1789
|
+
newSize = newSize < 1024 ? newSize * 2 : newSize + (newSize >> 1);
|
|
1790
|
+
}
|
|
1791
|
+
byte[] newBuf = ArrayPool<byte>.Shared.Rent(newSize);
|
|
1792
|
+
if (_length > 0)
|
|
1793
|
+
{
|
|
1794
|
+
Array.Copy(_buffer, newBuf, _length);
|
|
1795
|
+
}
|
|
1796
|
+
ArrayPool<byte>.Shared.Return(_buffer);
|
|
1797
|
+
_buffer = newBuf;
|
|
1798
|
+
}
|
|
1799
|
+
|
|
1800
|
+
protected override void Dispose(bool disposing)
|
|
1801
|
+
{
|
|
1802
|
+
if (!_disposed)
|
|
1803
|
+
{
|
|
1804
|
+
if (_buffer != null)
|
|
1805
|
+
{
|
|
1806
|
+
ArrayPool<byte>.Shared.Return(_buffer);
|
|
1807
|
+
_buffer = Array.Empty<byte>();
|
|
1808
|
+
}
|
|
1809
|
+
_length = 0;
|
|
1810
|
+
_position = 0;
|
|
1811
|
+
_disposed = true;
|
|
1812
|
+
}
|
|
1813
|
+
base.Dispose(disposing);
|
|
1814
|
+
}
|
|
1815
|
+
|
|
1816
|
+
public int ToArrayExact(ref byte[] buffer)
|
|
1817
|
+
{
|
|
1818
|
+
if (buffer == null || buffer.Length < _length)
|
|
1819
|
+
{
|
|
1820
|
+
buffer = new byte[_length];
|
|
1821
|
+
}
|
|
1822
|
+
|
|
1823
|
+
if (_length > 0)
|
|
1824
|
+
{
|
|
1825
|
+
Array.Copy(_buffer, buffer, _length);
|
|
1826
|
+
}
|
|
1827
|
+
|
|
1828
|
+
return _length;
|
|
1829
|
+
}
|
|
1830
|
+
|
|
1831
|
+
public override void Write(ReadOnlySpan<byte> buffer)
|
|
1832
|
+
{
|
|
1833
|
+
int count = buffer.Length;
|
|
1834
|
+
int endPos = _position + count;
|
|
1835
|
+
EnsureCapacity(endPos);
|
|
1836
|
+
buffer.CopyTo(new Span<byte>(_buffer, _position, count));
|
|
1837
|
+
_position = endPos;
|
|
1838
|
+
if (endPos > _length)
|
|
1839
|
+
{
|
|
1840
|
+
_length = endPos;
|
|
1841
|
+
}
|
|
1842
|
+
}
|
|
1843
|
+
|
|
1844
|
+
public override ValueTask WriteAsync(
|
|
1845
|
+
ReadOnlyMemory<byte> source,
|
|
1846
|
+
System.Threading.CancellationToken cancellationToken = default
|
|
1847
|
+
)
|
|
1848
|
+
{
|
|
1849
|
+
// Delegate to synchronous span-based path; callers expect a fast in-memory stream
|
|
1850
|
+
Write(source.Span);
|
|
1851
|
+
return new ValueTask();
|
|
1852
|
+
}
|
|
1853
|
+
}
|
|
1854
|
+
|
|
1855
|
+
// Internal pooled ArrayBufferWriter-like implementation to enable zero-copy JSON writing via IBufferWriter<byte>
|
|
1856
|
+
internal sealed class PooledArrayBufferWriter : IBufferWriter<byte>, IDisposable
|
|
1857
|
+
{
|
|
1858
|
+
private const int DefaultInitialCapacity = 256;
|
|
1859
|
+
private byte[] _buffer;
|
|
1860
|
+
private int _written;
|
|
1861
|
+
private bool _disposed;
|
|
1862
|
+
|
|
1863
|
+
private static readonly Utils.WallstopGenericPool<PooledArrayBufferWriter> Pool = new(
|
|
1864
|
+
producer: () => new PooledArrayBufferWriter(),
|
|
1865
|
+
onRelease: w =>
|
|
1866
|
+
{
|
|
1867
|
+
w.Reset();
|
|
1868
|
+
}
|
|
1869
|
+
);
|
|
1870
|
+
|
|
1871
|
+
public static Utils.PooledResource<PooledArrayBufferWriter> Rent(
|
|
1872
|
+
out PooledArrayBufferWriter writer
|
|
1873
|
+
) => Pool.Get(out writer);
|
|
1874
|
+
|
|
1875
|
+
private PooledArrayBufferWriter(int initialCapacity = DefaultInitialCapacity)
|
|
1876
|
+
{
|
|
1877
|
+
_buffer = ArrayPool<byte>.Shared.Rent(initialCapacity);
|
|
1878
|
+
_written = 0;
|
|
1879
|
+
}
|
|
1880
|
+
|
|
1881
|
+
private void EnsureCapacity(int sizeHint)
|
|
1882
|
+
{
|
|
1883
|
+
if (sizeHint <= 0)
|
|
1884
|
+
{
|
|
1885
|
+
sizeHint = 1;
|
|
1886
|
+
}
|
|
1887
|
+
int required = _written + sizeHint;
|
|
1888
|
+
if (_buffer.Length >= required)
|
|
1889
|
+
{
|
|
1890
|
+
return;
|
|
1891
|
+
}
|
|
1892
|
+
|
|
1893
|
+
int newSize = _buffer.Length;
|
|
1894
|
+
while (newSize < required)
|
|
1895
|
+
{
|
|
1896
|
+
newSize = newSize < 1024 ? newSize * 2 : newSize + (newSize >> 1);
|
|
1897
|
+
}
|
|
1898
|
+
|
|
1899
|
+
byte[] newBuf = ArrayPool<byte>.Shared.Rent(newSize);
|
|
1900
|
+
if (_written > 0)
|
|
1901
|
+
{
|
|
1902
|
+
Buffer.BlockCopy(_buffer, 0, newBuf, 0, _written);
|
|
1903
|
+
}
|
|
1904
|
+
ArrayPool<byte>.Shared.Return(_buffer);
|
|
1905
|
+
_buffer = newBuf;
|
|
1906
|
+
}
|
|
1907
|
+
|
|
1908
|
+
public void Advance(int count)
|
|
1909
|
+
{
|
|
1910
|
+
_written += count;
|
|
1911
|
+
}
|
|
1912
|
+
|
|
1913
|
+
public Memory<byte> GetMemory(int sizeHint = 0)
|
|
1914
|
+
{
|
|
1915
|
+
EnsureCapacity(sizeHint);
|
|
1916
|
+
return _buffer.AsMemory(_written);
|
|
1917
|
+
}
|
|
1918
|
+
|
|
1919
|
+
public Span<byte> GetSpan(int sizeHint = 0)
|
|
1920
|
+
{
|
|
1921
|
+
EnsureCapacity(sizeHint);
|
|
1922
|
+
return _buffer.AsSpan(_written);
|
|
1923
|
+
}
|
|
1924
|
+
|
|
1925
|
+
public int WrittenCount => _written;
|
|
1926
|
+
|
|
1927
|
+
public void Preallocate(int sizeHint)
|
|
1928
|
+
{
|
|
1929
|
+
EnsureCapacity(sizeHint);
|
|
1930
|
+
}
|
|
1931
|
+
|
|
1932
|
+
public int ToArrayExact(ref byte[] buffer)
|
|
1933
|
+
{
|
|
1934
|
+
if (buffer == null || buffer.Length < _written)
|
|
1935
|
+
{
|
|
1936
|
+
buffer = new byte[_written];
|
|
1937
|
+
}
|
|
1938
|
+
if (_written > 0)
|
|
1939
|
+
{
|
|
1940
|
+
Buffer.BlockCopy(_buffer, 0, buffer, 0, _written);
|
|
1941
|
+
}
|
|
1942
|
+
return _written;
|
|
1943
|
+
}
|
|
1944
|
+
|
|
1945
|
+
private void Reset()
|
|
1946
|
+
{
|
|
1947
|
+
// Keep the rented buffer to avoid churn; just reset write cursor.
|
|
1948
|
+
if (_buffer == null || _buffer.Length == 0)
|
|
1949
|
+
{
|
|
1950
|
+
_buffer = ArrayPool<byte>.Shared.Rent(DefaultInitialCapacity);
|
|
1951
|
+
}
|
|
1952
|
+
_written = 0;
|
|
1953
|
+
_disposed = false;
|
|
1954
|
+
}
|
|
1955
|
+
|
|
1956
|
+
public void Dispose()
|
|
1957
|
+
{
|
|
1958
|
+
if (!_disposed)
|
|
1959
|
+
{
|
|
1960
|
+
if (_buffer != null)
|
|
1961
|
+
{
|
|
1962
|
+
ArrayPool<byte>.Shared.Return(_buffer);
|
|
1963
|
+
}
|
|
1964
|
+
_buffer = Array.Empty<byte>();
|
|
1965
|
+
_written = 0;
|
|
1966
|
+
_disposed = true;
|
|
1967
|
+
}
|
|
1968
|
+
}
|
|
1969
|
+
}
|
|
1970
|
+
|
|
1971
|
+
// Internal pooled read-only stream over an existing byte[] to avoid MemoryStream allocation in deserialization paths
|
|
1972
|
+
internal sealed class PooledReadOnlyMemoryStream : Stream
|
|
1973
|
+
{
|
|
1974
|
+
private byte[] _buffer = Array.Empty<byte>();
|
|
1975
|
+
private int _position;
|
|
1976
|
+
private int _length;
|
|
1977
|
+
|
|
1978
|
+
private static readonly Utils.WallstopGenericPool<PooledReadOnlyMemoryStream> Pool = new(
|
|
1979
|
+
producer: () => new PooledReadOnlyMemoryStream(),
|
|
1980
|
+
onRelease: s =>
|
|
1981
|
+
{
|
|
1982
|
+
s.ResetForReuse();
|
|
1983
|
+
}
|
|
1984
|
+
);
|
|
1985
|
+
|
|
1986
|
+
public static Utils.PooledResource<PooledReadOnlyMemoryStream> Rent(
|
|
1987
|
+
out PooledReadOnlyMemoryStream stream
|
|
1988
|
+
) => Pool.Get(out stream);
|
|
1989
|
+
|
|
1990
|
+
public void SetBuffer(byte[] buffer)
|
|
1991
|
+
{
|
|
1992
|
+
_buffer = buffer ?? Array.Empty<byte>();
|
|
1993
|
+
_position = 0;
|
|
1994
|
+
_length = _buffer.Length;
|
|
1995
|
+
}
|
|
1996
|
+
|
|
1997
|
+
private void ResetForReuse()
|
|
1998
|
+
{
|
|
1999
|
+
SetBuffer(Array.Empty<byte>());
|
|
2000
|
+
}
|
|
2001
|
+
|
|
2002
|
+
public override bool CanRead => true;
|
|
2003
|
+
public override bool CanSeek => true;
|
|
2004
|
+
public override bool CanWrite => false;
|
|
2005
|
+
public override long Length => _length;
|
|
2006
|
+
|
|
2007
|
+
public override long Position
|
|
2008
|
+
{
|
|
2009
|
+
get => _position;
|
|
2010
|
+
set
|
|
2011
|
+
{
|
|
2012
|
+
if (value is < 0 or > int.MaxValue)
|
|
2013
|
+
{
|
|
2014
|
+
throw new ArgumentOutOfRangeException(nameof(value));
|
|
2015
|
+
}
|
|
2016
|
+
_position = (int)value;
|
|
2017
|
+
}
|
|
2018
|
+
}
|
|
2019
|
+
|
|
2020
|
+
public override void Flush() { }
|
|
2021
|
+
|
|
2022
|
+
public override int Read(byte[] buffer, int offset, int count)
|
|
2023
|
+
{
|
|
2024
|
+
if (buffer == null)
|
|
2025
|
+
{
|
|
2026
|
+
throw new ArgumentNullException(nameof(buffer));
|
|
2027
|
+
}
|
|
2028
|
+
|
|
2029
|
+
if ((uint)offset > buffer.Length || (uint)count > buffer.Length - offset)
|
|
2030
|
+
{
|
|
2031
|
+
throw new ArgumentOutOfRangeException();
|
|
2032
|
+
}
|
|
2033
|
+
int remaining = _length - _position;
|
|
2034
|
+
if (remaining <= 0)
|
|
2035
|
+
{
|
|
2036
|
+
return 0;
|
|
2037
|
+
}
|
|
2038
|
+
if (count > remaining)
|
|
2039
|
+
{
|
|
2040
|
+
count = remaining;
|
|
2041
|
+
}
|
|
2042
|
+
|
|
2043
|
+
Array.Copy(_buffer, _position, buffer, offset, count);
|
|
2044
|
+
_position += count;
|
|
2045
|
+
return count;
|
|
2046
|
+
}
|
|
2047
|
+
|
|
2048
|
+
// Span-based fast-path used by modern callers (e.g., protobuf-net)
|
|
2049
|
+
public override int Read(Span<byte> destination)
|
|
2050
|
+
{
|
|
2051
|
+
int remaining = _length - _position;
|
|
2052
|
+
if (remaining <= 0)
|
|
2053
|
+
{
|
|
2054
|
+
return 0;
|
|
2055
|
+
}
|
|
2056
|
+
|
|
2057
|
+
int toCopy = destination.Length;
|
|
2058
|
+
if (toCopy > remaining)
|
|
2059
|
+
{
|
|
2060
|
+
toCopy = remaining;
|
|
2061
|
+
}
|
|
2062
|
+
|
|
2063
|
+
new ReadOnlySpan<byte>(_buffer, _position, toCopy).CopyTo(destination);
|
|
2064
|
+
_position += toCopy;
|
|
2065
|
+
return toCopy;
|
|
2066
|
+
}
|
|
2067
|
+
|
|
2068
|
+
public override ValueTask<int> ReadAsync(
|
|
2069
|
+
Memory<byte> destination,
|
|
2070
|
+
System.Threading.CancellationToken cancellationToken = default
|
|
2071
|
+
)
|
|
2072
|
+
{
|
|
2073
|
+
// Delegate to synchronous span-based path; this stream is purely in-memory
|
|
2074
|
+
int read = Read(destination.Span);
|
|
2075
|
+
return new ValueTask<int>(read);
|
|
2076
|
+
}
|
|
2077
|
+
|
|
2078
|
+
public override int ReadByte()
|
|
2079
|
+
{
|
|
2080
|
+
if (_position >= _length)
|
|
2081
|
+
{
|
|
2082
|
+
return -1;
|
|
2083
|
+
}
|
|
2084
|
+
|
|
2085
|
+
return _buffer[_position++];
|
|
2086
|
+
}
|
|
2087
|
+
|
|
2088
|
+
public override long Seek(long offset, SeekOrigin origin)
|
|
2089
|
+
{
|
|
2090
|
+
int basePos = origin switch
|
|
2091
|
+
{
|
|
2092
|
+
SeekOrigin.Begin => 0,
|
|
2093
|
+
SeekOrigin.Current => _position,
|
|
2094
|
+
SeekOrigin.End => _length,
|
|
2095
|
+
_ => 0,
|
|
2096
|
+
};
|
|
2097
|
+
long newPos = basePos + offset;
|
|
2098
|
+
if (newPos is < 0 or > int.MaxValue)
|
|
2099
|
+
{
|
|
2100
|
+
throw new IOException("Attempted to seek outside the stream bounds.");
|
|
2101
|
+
}
|
|
2102
|
+
_position = (int)newPos;
|
|
2103
|
+
return _position;
|
|
2104
|
+
}
|
|
2105
|
+
|
|
2106
|
+
public override void SetLength(long value)
|
|
2107
|
+
{
|
|
2108
|
+
throw new NotSupportedException();
|
|
2109
|
+
}
|
|
2110
|
+
|
|
2111
|
+
public override void Write(byte[] buffer, int offset, int count)
|
|
2112
|
+
{
|
|
2113
|
+
throw new NotSupportedException();
|
|
2114
|
+
}
|
|
2115
|
+
|
|
2116
|
+
public override void WriteByte(byte value)
|
|
2117
|
+
{
|
|
2118
|
+
throw new NotSupportedException();
|
|
2119
|
+
}
|
|
2120
|
+
}
|
|
2121
|
+
}
|