예제 #1
0
        /// <summary>
        /// 是否空集合
        /// </summary>
        /// <returns>是否空集合</returns>
        public unsafe bool IsEmpty()
        {
            fixed(range *indexFixed = indexs)
            {
                for (range *index = indexFixed + indexs.Length; index != indexFixed;)
                {
                    --index;
                    if ((*index).StartIndex != (*index).EndIndex)
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
예제 #2
0
        /// <summary>
        /// 获取匹配的数据集合
        /// </summary>
        /// <typeparam name="listType">目标数据类型</typeparam>
        /// <param name="getValue">数据转换器</param>
        /// <returns>匹配的数据集合</returns>
        protected unsafe list <listType> getList <listType>(func <valueType, listType> getValue)
        {
            list <listType> .unsafer values = new list <listType>(array.Length).Unsafer;
            fixed(range *indexFixed = indexs)
            {
                for (range *index = indexFixed + indexs.Length; index != indexFixed;)
                {
                    for (range range = *--index; range.StartIndex != range.EndIndex; ++range.StartIndex)
                    {
                        values.Add(getValue(array[range.StartIndex]));
                    }
                }
            }

            return(values.List);
        }
예제 #3
0
        /// <summary>
        /// 数据转换成单向动态数组
        /// </summary>
        /// <returns>单向动态数组</returns>
        public unsafe list <valueType> GetList()
        {
            list <valueType> .unsafer values = new list <valueType>(array.Length).Unsafer;
            fixed(range *indexFixed = indexs)
            {
                for (range *index = indexFixed + indexs.Length; index != indexFixed;)
                {
                    for (range range = *--index; range.StartIndex != range.EndIndex; ++range.StartIndex)
                    {
                        values.Add(array[range.StartIndex]);
                    }
                }
            }

            return(values.List);
        }
예제 #4
0
        /// <summary>
        /// 数据转换成单向动态数组
        /// </summary>
        /// <returns>单向动态数组</returns>
        public unsafe subArray <valueType> GetList()
        {
            subArray <valueType> values = new subArray <valueType>(array.Length);

            fixed(range *indexFixed = indexs)
            {
                for (range *index = indexFixed + indexs.Length; index != indexFixed;)
                {
                    for (range range = *--index; range.StartIndex != range.EndIndex; ++range.StartIndex)
                    {
                        values.UnsafeAdd(array[range.StartIndex]);
                    }
                }
            }

            return(values);
        }
예제 #5
0
        /// <summary>
        /// 获取匹配的数据集合
        /// </summary>
        /// <typeparam name="listType">目标数据类型</typeparam>
        /// <param name="getValue">数据转换器</param>
        /// <returns>匹配的数据集合</returns>
        protected unsafe subArray <listType> getList <listType>(Func <valueType, listType> getValue)
        {
            subArray <listType> values = new subArray <listType>(array.Length);

            fixed(range *indexFixed = indexs)
            {
                for (range *index = indexFixed + indexs.Length; index != indexFixed;)
                {
                    for (range range = *--index; range.StartIndex != range.EndIndex; ++range.StartIndex)
                    {
                        values.UnsafeAdd(getValue(array[range.StartIndex]));
                    }
                }
            }

            return(values);
        }
예제 #6
0
        /// <summary>
        /// 是否存在匹配数据
        /// </summary>
        /// <param name="isValue">数据匹配器</param>
        /// <returns>是否存在匹配数据</returns>
        public unsafe bool IsExist(func <valueType, bool> isValue)
        {
            fixed(range *indexFixed = indexs)
            {
                for (range *index = indexFixed + indexs.Length; index != indexFixed;)
                {
                    for (range range = *--index; range.StartIndex != range.EndIndex; ++range.StartIndex)
                    {
                        if (isValue(array[range.StartIndex]))
                        {
                            return(true);
                        }
                    }
                }
            }

            return(false);
        }
예제 #7
0
        /// <summary>
        /// 获取匹配的数据集合
        /// </summary>
        /// <param name="isValue">数据匹配器</param>
        /// <returns>匹配的数据集合</returns>
        protected unsafe subArray <valueType> getList(Func <valueType, bool> isValue)
        {
            subArray <valueType> values = new subArray <valueType>(array.Length);

            fixed(range *indexFixed = indexs)
            {
                for (range *index = indexFixed + indexs.Length; index != indexFixed;)
                {
                    for (range range = *--index; range.StartIndex != range.EndIndex; ++range.StartIndex)
                    {
                        valueType value = array[range.StartIndex];
                        if (isValue(value))
                        {
                            values.UnsafeAdd(value);
                        }
                    }
                }
            }

            return(values);
        }
예제 #8
0
        /// <summary>
        /// 获取哈希数据数组
        /// </summary>
        /// <typeparam name="valueType">数据类型</typeparam>
        /// <param name="values">数据集合</param>
        /// <param name="hashs">哈希集合</param>
        /// <returns>哈希数据数组</returns>
        protected unsafe valueType[] getValues <valueType>(valueType[] values, int *hashs)
        {
            int indexBits = ((uint)values.Length).bits();

            if (indexBits < defaultArrayLengthBits)
            {
                indexBits = defaultArrayLengthBits;
            }
            else if ((1 << (indexBits - 1)) == values.Length)
            {
                --indexBits;
            }
            indexAnd = 1 << indexBits;
            indexs   = new range[indexAnd--];
            fixed(range *indexFixed = indexs)
            {
                for (int *hash = hashs + values.Length; hash != hashs; ++indexFixed[*--hash & indexAnd].StartIndex)
                {
                    ;
                }
                int startIndex = 0;

                for (range *index = indexFixed, endIndex = indexFixed + indexAnd + 1; index != endIndex; ++index)
                {
                    int nextIndex = startIndex + (*index).StartIndex;
                    (*index).StartIndex = (*index).EndIndex = startIndex;
                    startIndex          = nextIndex;
                }
                valueType[] newValues = new valueType[values.Length];
                foreach (valueType value in values)
                {
                    newValues[indexFixed[*hashs++ & indexAnd].EndIndex++] = value;
                }
                //for (int index = 0; index != values.Length; newValues[indexFixed[*hashs++ & indexAnd].EndIndex++] = values[index++]) ;
                return(newValues);
            }
        }