/// <summary> /// ����ָ��ƫ�Ʊ������� /// </summary> /// <param name="AddressMode">ָ��Ѱַģʽ</param> /// <param name="OffsetPointer">ָ��ƫ�Ʊ�Ļ���ַ��������Ϊnull�� /// <para>�뱣֤���ڴ�鱻�������ɲο�<seealso cref="fixed"/>��<seealso cref="stackalloc"/>��<seealso cref="System.Runtime.InteropServices.Marshal.AllocHGlobal"/>��</para> /// </param> /// <param name="OffsetSize">ָ��ƫ�Ʊ�ijߴ磨Ԫ�صĸ����������������0��</param> /// <param name="OffsetBase">ָ��ƫ�Ʊ��������Ļ���ƫ�ơ��������� [0,OffsetSize) ���䡣 /// <para>���壺f(i) = OffsetPointer[OffsetBase + i]��</para> /// </param> /// <param name="Stride">ָ��Ŀ�ࡣ������Ϊ0��������Ϊ������</param> /// <param name="LimitStart">��������硣</param> /// <param name="LimitSize">������ijߴ硣���������0�� /// <para>ע��������ķ�Χ��[LimitStart, LimitStart+LimitSize)���䣨����������ʱΪ���������㣬�Ὣ��淶��Ϊ[0.0, 1.0)���䣨ʵ������</para> /// </param> /// <returns>ָ��ƫ�Ʊ�������ʧ��ʱ����null��</returns> public static unsafe IPointerOffset NewPointerOffset(WrapAddressMode AddressMode, long* OffsetPointer, int OffsetSize, int OffsetBase, long Stride, long LimitStart, long LimitSize) { return NewPointerOffset(AddressMode, OffsetPointer, OffsetSize, OffsetBase, Stride, LimitStart, LimitSize, DefaultPointer); }
/// <summary> /// ����ָ��ƫ�Ʊ������� /// </summary> /// <param name="AddressMode">ָ��Ѱַģʽ</param> /// <param name="OffsetPointer">ָ��ƫ�Ʊ�Ļ���ַ��������Ϊnull�� /// <para>�뱣֤���ڴ�鱻�������ɲο�<seealso cref="fixed"/>��<seealso cref="stackalloc"/>��<seealso cref="System.Runtime.InteropServices.Marshal.AllocHGlobal"/>��</para> /// </param> /// <param name="OffsetSize">ָ��ƫ�Ʊ�ijߴ磨Ԫ�صĸ����������������0��</param> /// <param name="OffsetBase">ָ��ƫ�Ʊ��������Ļ���ƫ�ơ��������� [0,OffsetSize) ���䡣 /// <para>���壺f(i) = OffsetPointer[OffsetBase + i]��</para> /// </param> /// <param name="Stride">ָ��Ŀ�ࡣ������Ϊ0��������Ϊ������</param> /// <param name="LimitStart">��������硣</param> /// <param name="LimitSize">������ijߴ硣���������0�� /// <para>ע��������ķ�Χ��[LimitStart, LimitStart+LimitSize)���䣨����������ʱΪ���������㣬�Ὣ��淶��Ϊ[0.0, 1.0)���䣨ʵ������</para> /// </param> /// <param name="DefaultPointer">Ĭ��ָ�룬������<seealso cref="WrapAddressMode.Border"/>ģʽ��Ĭ��Ϊnull��</param> /// <returns>ָ��ƫ�Ʊ�������ʧ��ʱ����null��</returns> public static unsafe IPointerOffset NewPointerOffset(WrapAddressMode AddressMode, long* OffsetPointer, int OffsetSize, int OffsetBase, long Stride, long LimitStart, long LimitSize, byte* DefaultPointer) { switch (AddressMode) { case WrapAddressMode.Clamp: return new PointerOffsetClamp(OffsetPointer, OffsetSize, OffsetBase, Stride, LimitStart, LimitSize); case WrapAddressMode.Border: return new PointerOffsetBorder(OffsetPointer, OffsetSize, OffsetBase, Stride, LimitStart, LimitSize, DefaultPointer); } return null; }
/// <summary> /// ����ָ��ƫ�Ʊ������� /// </summary> /// <param name="AddressMode">ָ��Ѱַģʽ</param> /// <param name="DefaultPointer">Ĭ��ָ�룬������<seealso cref="WrapAddressMode.Border"/>ģʽ��Ĭ��Ϊnull��</param> /// <returns>ָ��ƫ�Ʊ�������ʧ��ʱ����null��</returns> public static IPointerOffset NewPointerOffset(WrapAddressMode AddressMode, byte* DefaultPointer) { switch (AddressMode) { case WrapAddressMode.Clamp: return new PointerOffsetClamp(); case WrapAddressMode.Border: return new PointerOffsetBorder(DefaultPointer); } return null; }