예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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;
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
 /// <inheritdoc/>
 public PByte(CPtr <byte> ptr, long offset = 0) : base(ptr, offset)
 {
 }