/// <summary> /// <para>Поиск последнего вхождения субвектора в вектор</para> /// </summary> /// <typeparam name="T">Тип элемента векторов</typeparam> /// <param name="mem1">Исходный вектор</param> /// <param name="len1">Размер области вектора для поиска</param> /// <param name="mem2">Субвектор</param> /// <param name="len2">Размер искомой области субвектора</param> /// <returns></returns> public static CPtr <T> MemRMem <T>(CPtr <T> mem1, long len1, CPtr <T> mem2, long len2) where T : IComparable { #region Проверка аргументов #if CHECK_ARGS if (mem1 is null) { throw new ArgumentNullException(nameof(mem1)); } if (mem2 is null) { throw new ArgumentNullException(nameof(mem2)); } if (len1 < 0 || len1 > mem1.Length) { throw new ArgumentOutOfRangeException(nameof(len1)); } if (len2 < 0 || len2 > mem2.Length) { throw new ArgumentOutOfRangeException(nameof(len2)); } #endif #endregion Проверка аргументов long i; if (len1 == 0 || len2 == 0) { return(null); } if (len1 < len2) { return(null); } i = len1 - len2; do { if (MemCmp(mem1 + i, mem2, len2) == 0) { return(mem1 + i); } } while (i-- != 0); return(null); }
/// <summary> /// <para>Конструктор экземпляра <see cref="CPtr{T}"/></para> /// </summary> /// <param name="ptr">Указатель на вектор</param> /// <param name="offset">Смещение элемента относительно исходного указателя</param> /// <exception cref="ArgumentNullException">Исходный указатель не действителен</exception> /// <exception cref="ArgumentOutOfRangeException">Смещение выходит за пределы области данных</exception> public CPtr(CPtr <T> ptr, long offset = 0) { #region Проверка аргументов #if CHECK_ARGS if (ptr is null) { throw new ArgumentNullException(nameof(ptr)); } if (((ptr._Offset + offset) < 0) || ((ptr._Offset + offset) >= ptr.Length)) { throw new ArgumentOutOfRangeException(nameof(offset)); } #endif #endregion _Data = ptr._Data; _Offset = ptr._Offset + offset; }
/// <summary> /// <para>Копировать блок данных заданного размера</para> /// </summary> /// <typeparam name="T"></typeparam> /// <param name="mem1">Исходные вектор данных</param> /// <param name="mem2">Целевой вектор</param> /// <param name="length">Размер копируемого блока</param> public static void MemCpy <T>(CPtr <T> mem1, CPtr <T> mem2, long length) { #region Проверка аргументов #if CHECK_ARGS if (mem1 is null) { throw new ArgumentNullException(nameof(mem1)); } if (mem2 is null) { throw new ArgumentNullException(nameof(mem2)); } if (length < 0 || length > mem1.Length || length > mem2.Length) { throw new ArgumentOutOfRangeException(nameof(length)); } #endif #endregion Проверка аргументов Array.Copy(mem1._Data, mem1._Offset, mem2._Data, mem2._Offset, length); }
/// <inheritdoc/> public PByte(CPtr <byte> ptr, long offset = 0) : base(ptr, offset) { }