Exemple #1
0
        /// <summary>
        /// <para>Поиск элемента в данных, адресуемых указателем</para>
        /// </summary>
        /// <param name="ptr">Указатель на данные</param>
        /// <param name="elem">Искомый элемент</param>
        /// <param name="length">Размер области данных, в которой производится поиск</param>
        /// <returns>Указатель на позицию первого вхождения элемента в данных или null</returns>
        public static PByte MemChr(PByte ptr, byte elem, long length)
        {
            #region Проверка аргументов
#if CHECK_ARGS
            if (ptr is null)
            {
                throw new ArgumentNullException(nameof(ptr));
            }
            if (length < 0 || length > ptr.Length)
            {
                throw new ArgumentOutOfRangeException(nameof(length));
            }
#endif
            #endregion Проверка аргументов

            IComparer <byte> cmp = Comparer <byte> .Default;
            for (var i = 0L; i < length; i++)
            {
                if (cmp.Compare(ptr[i], elem) == 0)
                {
                    return(new(ptr, i));
                }
            }
            return(null);
        }
Exemple #2
0
        /// <summary>
        /// <para>Сравнение векторов</para>
        /// </summary>
        /// <param name="mem1">Первый вектор</param>
        /// <param name="mem2">Второй вектор</param>
        /// <param name="length">Размер сравниваемой области</param>
        /// <returns>Результат сравения</returns>
        public static int MemCmp(PByte mem1, PByte 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 Проверка аргументов

            IComparer <byte> cmp = Comparer <byte> .Default;

            for (var i = 0L; i < length; i++)
            {
                var rc = cmp.Compare(mem1[i], mem2[i]);
                if (rc != 0)
                {
                    return(rc);
                }
            }
            return(0);
        }
Exemple #3
0
        /// <summary>
        /// <para>Поиск последнего вхождения субвектора в вектор</para>
        /// </summary>
        /// <param name="mem1">Исходный вектор</param>
        /// <param name="len1">Размер области вектора для поиска</param>
        /// <param name="mem2">Субвектор</param>
        /// <param name="len2">Размер искомой области субвектора</param>
        /// <returns></returns>
        public static PByte MemRMem(PByte mem1, long len1, PByte mem2, long len2)
        {
            #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);
        }