Exemple #1
0
        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();
            }
        }
Exemple #2
0
        // 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);
        }