/** * Converts an IntPtr to a struct of type T. */ public static void PtrToStruct(IntPtr ptr, out T t) { #if ENABLE_IL2CPP #if UNITY_2018_1_OR_NEWER unsafe { Unity.Collections.LowLevel.Unsafe.UnsafeUtility.CopyPtrToStructure((void *)ptr, out t); } #else #error UnityModules Only supports IL2CPP on versions of Unity 2018.1 or greater. #endif #else if (_container == null) { _container = new StructContainer(); } try { Marshal.PtrToStructure(ptr, _container); t = _container.value; } catch (Exception e) { UnityEngine.Debug.LogException(e); t = default(T); } #endif }
public void TestSimpleStructUpdate() { var nodeContainer = new NodeContainer(); var container = new StructContainer { Struct = new SimpleStruct { Name = "Test", Value = 1 } }; var containerNode = nodeContainer.GetOrCreateNode(container); var memberNode = containerNode[nameof(StructContainer.Struct)]; var targetNode = memberNode.Target; var structMember1Node = targetNode[nameof(SimpleStruct.Name)]; var structMember2Node = targetNode[nameof(SimpleStruct.Value)]; memberNode.Update(new SimpleStruct { Name = "Test2", Value = 2 }); Assert.Equal("Test2", container.Struct.Name); Assert.Equal(2, container.Struct.Value); Assert.Equal(targetNode, memberNode.Target); Assert.Equal(structMember1Node, memberNode.Target[nameof(SimpleStruct.Name)]); Assert.Equal(structMember2Node, memberNode.Target[nameof(SimpleStruct.Value)]); structMember1Node = memberNode.Target[nameof(SimpleStruct.Name)]; Helper.TestMemberNode(memberNode.Target, structMember1Node, container.Struct, container.Struct.Name, nameof(SimpleStruct.Name), false); structMember2Node = memberNode.Target[nameof(SimpleStruct.Value)]; Helper.TestMemberNode(memberNode.Target, structMember2Node, container.Struct, container.Struct.Value, nameof(SimpleStruct.Value), false); }
public void TestSimpleStructMemberUpdate() { var nodeContainer = new NodeContainer(); var container = new StructContainer { Struct = new SimpleStruct { Name = "Test", Value = 1 } }; var containerNode = nodeContainer.GetOrCreateNode(container); var memberNode = containerNode[nameof(StructContainer.Struct)]; var targetNode = memberNode.Target; var structMember1Node = targetNode[nameof(SimpleStruct.Name)]; var structMember2Node = targetNode[nameof(SimpleStruct.Value)]; Helper.TestNonCollectionObjectNode(containerNode, container, 1); Helper.TestMemberNode(containerNode, memberNode, container, container.Struct, nameof(StructContainer.Struct), true); Helper.TestNonNullObjectReference(memberNode.TargetReference, container.Struct, false); Helper.TestMemberNode(memberNode.Target, structMember1Node, container.Struct, container.Struct.Name, nameof(SimpleStruct.Name), false); structMember1Node.Update("Test2"); Assert.Equal("Test2", container.Struct.Name); Assert.Equal(targetNode, memberNode.Target); Assert.Equal(structMember1Node, memberNode.Target[nameof(SimpleStruct.Name)]); Assert.Equal(structMember2Node, memberNode.Target[nameof(SimpleStruct.Value)]); Helper.TestMemberNode(memberNode.Target, structMember1Node, container.Struct, container.Struct.Name, nameof(SimpleStruct.Name), false); Helper.TestMemberNode(memberNode.Target, memberNode.Target.Members.First(), container.Struct, container.Struct.Name, nameof(SimpleStruct.Name), false); }
public override bool Equals(object obj) { // problem if cast is invalid StructContainer other = (StructContainer)obj; return(Container.Equals(other.Container) && (ValueType == other.ValueType)); }
/** * Copies a struct of type T into the array pointed to by arrayPtr at the * offset index specified by index. This is an unsafe operation that assumes * there is enough space allocated in the array to accommodate the struct. */ public static void CopyIntoArray(IntPtr arrayPtr, ref T t, int index) { if (_container == null) { _container = new StructContainer(); } _container.value = t; Marshal.StructureToPtr(_container, new IntPtr(arrayPtr.ToInt64() + _sizeofT * index), false); }
public void TestSimpleStructUpdate() { var nodeContainer = new NodeContainer(); var container = new StructContainer { Struct = new SimpleStruct { Name = "Test", Value = 1 } }; var containerNode = nodeContainer.GetOrCreateNode(container); var memberNode = containerNode.Children.First(); memberNode.Content.Update(new SimpleStruct { Name = "Test2", Value = 2 }); Assert.AreEqual("Test2", container.Struct.Name); Assert.AreEqual(2, container.Struct.Value); var structMember1Node = memberNode.Children.First(); Helper.TestMemberContentNode(memberNode, structMember1Node, container.Struct, container.Struct.Name, nameof(SimpleStruct.Name), false); var structMember2Node = memberNode.Children.Last(); Helper.TestMemberContentNode(memberNode, structMember2Node, container.Struct, container.Struct.Value, nameof(SimpleStruct.Value), false); }
public void TestSimpleStruct() { var nodeContainer = new NodeContainer(); var container = new StructContainer { Struct = new SimpleStruct { Name = "Test", Value = 1 } }; var containerNode = nodeContainer.GetOrCreateNode(container); Helper.TestObjectContentNode(containerNode, container, 1); var memberNode = containerNode.Children.First(); Helper.TestMemberContentNode(containerNode, memberNode, container, container.Struct, nameof(StructContainer.Struct), false); Helper.TestStructContentNode(memberNode, container.Struct, 2); var structMember1Node = memberNode.Children.First(); Helper.TestMemberContentNode(memberNode, structMember1Node, container.Struct, container.Struct.Name, nameof(SimpleStruct.Name), false); var structMember2Node = memberNode.Children.Last(); Helper.TestMemberContentNode(memberNode, structMember2Node, container.Struct, container.Struct.Value, nameof(SimpleStruct.Value), false); }
/** * Converts an IntPtr to a struct of type T. */ public static void PtrToStruct(IntPtr ptr, out T t) { if (_container == null) { _container = new StructContainer(); } try { Marshal.PtrToStructure(ptr, _container); t = _container.value; } catch (Exception e) { Logger.Log("Problem converting structure " + typeof(T) + " from ptr " + ptr + " : " + e.Message); t = default(T); } }
public void TestSimpleStructUpdate() { var nodeContainer = new NodeContainer(); var container = new StructContainer { Struct = new SimpleStruct { Name = "Test", Value = 1 } }; var containerNode = nodeContainer.GetOrCreateNode(container); var memberNode = containerNode.Children.First(); memberNode.Content.Update(new SimpleStruct { Name = "Test2", Value = 2 }); Assert.AreEqual("Test2", container.Struct.Name); Assert.AreEqual(2, container.Struct.Value); var structMember1Node = memberNode.Children.First(); Helper.TestMemberContentNode(memberNode, structMember1Node, container.Struct, container.Struct.Name, nameof(SimpleStruct.Name), false); var structMember2Node = memberNode.Children.Last(); Helper.TestMemberContentNode(memberNode, structMember2Node, container.Struct, container.Struct.Value, nameof(SimpleStruct.Value), false); }
public void TestSimpleStruct() { var nodeContainer = new NodeContainer(); var container = new StructContainer { Struct = new SimpleStruct { Name = "Test", Value = 1 } }; var containerNode = nodeContainer.GetOrCreateNode(container); Helper.TestNonCollectionObjectContentNode(containerNode, container, 1); var memberNode = containerNode.Children.First(); Helper.TestMemberContentNode(containerNode, memberNode, container, container.Struct, nameof(StructContainer.Struct), false); Helper.TestStructContentNode(memberNode, container.Struct, 2); var structMember1Node = memberNode.Children.First(); Helper.TestMemberContentNode(memberNode, structMember1Node, container.Struct, container.Struct.Name, nameof(SimpleStruct.Name), false); var structMember2Node = memberNode.Children.Last(); Helper.TestMemberContentNode(memberNode, structMember2Node, container.Struct, container.Struct.Value, nameof(SimpleStruct.Value), false); }
public void TestSimpleStruct() { var nodeContainer = new NodeContainer(); var container = new StructContainer { Struct = new SimpleStruct { Name = "Test", Value = 1 } }; var containerNode = nodeContainer.GetOrCreateNode(container); Helper.TestNonCollectionObjectNode(containerNode, container, 1); var memberNode = containerNode[nameof(StructContainer.Struct)]; Helper.TestMemberNode(containerNode, memberNode, container, container.Struct, nameof(StructContainer.Struct), true); Helper.TestNonNullObjectReference(memberNode.TargetReference, container.Struct, false); var structMember1Node = memberNode.Target[nameof(SimpleStruct.Name)]; Helper.TestMemberNode(memberNode.Target, structMember1Node, container.Struct, container.Struct.Name, nameof(SimpleStruct.Name), false); var structMember2Node = memberNode.Target[nameof(SimpleStruct.Value)]; Helper.TestMemberNode(memberNode.Target, structMember2Node, container.Struct, container.Struct.Value, nameof(SimpleStruct.Value), false); }
public void TestSimpleStructMemberUpdate() { var nodeContainer = new NodeContainer(); var container = new StructContainer { Struct = new SimpleStruct { Name = "Test", Value = 1 } }; var containerNode = nodeContainer.GetOrCreateNode(container); Helper.TestNonCollectionObjectContentNode(containerNode, container, 1); var memberNode = containerNode.Children.First(); Helper.TestMemberContentNode(containerNode, memberNode, container, container.Struct, nameof(StructContainer.Struct), false); Helper.TestStructContentNode(memberNode, container.Struct, 2); var structMember1Node = memberNode.Children.First(); Helper.TestMemberContentNode(memberNode, structMember1Node, container.Struct, container.Struct.Name, nameof(SimpleStruct.Name), false); structMember1Node.Content.Update("Test2"); Assert.AreEqual("Test2", container.Struct.Name); Helper.TestMemberContentNode(memberNode, structMember1Node, container.Struct, container.Struct.Name, nameof(SimpleStruct.Name), false); Helper.TestMemberContentNode(memberNode, memberNode.Children.First(), container.Struct, container.Struct.Name, nameof(SimpleStruct.Name), false); }
public static void Compiles_But_Rider_Shows_Error() { var structContainer = new StructContainer(null); Assert.Null(structContainer.ValueTypeProperty.AsNullable()); }
public StructContainer(StructContainer c) { // no need to check for 'c' since it can't be null Container = c.Container; ValueType = c.ValueType; }