public void CouldGetRuntimeVecInfo() { var types = new[] { typeof(int), typeof(decimal), typeof(MyStruct), typeof(MyStructWithRef), typeof(string), typeof(object) }; foreach (var type in types) { var vti = VecTypeHelper.GetInfo(type); var vti2 = VecTypeHelper.GetInfo(vti.RuntimeTypeId); Assert.IsTrue(ReferenceEquals(vti.Type, vti2.Type)); Assert.AreEqual(vti.ArrayOffsetAdjustment, vti2.ArrayOffsetAdjustment); Assert.AreEqual(vti.ElemSize, vti2.ElemSize); Assert.AreEqual(vti.UnsafeGetterPtr, vti2.UnsafeGetterPtr); Assert.AreEqual(vti.UnsafeSetterPtr, vti2.UnsafeSetterPtr); Assert.AreEqual(vti.RuntimeTypeId, vti2.RuntimeTypeId); Console.WriteLine("TYPE: " + type.Name); Console.WriteLine("vti.RuntimeTypeId: " + vti.RuntimeTypeId); Console.WriteLine("vti.ElemOffset: " + vti.ArrayOffsetAdjustment); Console.WriteLine("vti.ElemSize: " + vti.ElemSize); Console.WriteLine(); } }
// TODO WTF is this externallyOwned on slice? See RdM Clone /// <summary> /// Returns new VectorStorage instance with the same memory source but (optionally) different memory start and length. /// Increments underlying memory reference count unless <paramref name="externallyOwned"/> is true. /// </summary> public RetainedVec Clone(int start, int length, bool externallyOwned = false) { // see CLR Span.Slice comment if (IntPtr.Size == 8) { if ((ulong)(uint)start + (ulong)(uint)length > (ulong)(uint)_length) { ThrowHelper.ThrowArgumentOutOfRangeException(); } } else { if ((uint)start > (uint)_length || (uint)length > (uint)(_length - start)) { ThrowHelper.ThrowArgumentOutOfRangeException(); } } if (!externallyOwned) { _memoryOwner?.Increment(); } var slice = new RetainedVec( externallyOwned ? null : _memoryOwner, _array, UnsafeEx.Add(_pointerOrOffset, _array == null ? start * VecTypeHelper.GetInfo(_runtimeTypeId).ElemSize : start), length, _runtimeTypeId ); return(slice); }