/// <summary> /// 嵌套类型处理 /// </summary> /// <param name="type">类型</param> /// <param name="reflectedType">上层类型</param> internal void ReflectedType(Type type, Type reflectedType) { LeftArray <Type> reflectedTypeList = default(LeftArray <Type>); do { reflectedTypeList.Add(reflectedType); reflectedType = reflectedType.ReflectedType; }while (reflectedType != null); Type[] reflectedTypeArray = reflectedTypeList.Array; int reflectedTypeIndex = reflectedTypeList.Length - 1; reflectedType = reflectedTypeArray[reflectedTypeIndex]; NameStream.WriteNotNull(reflectedType.Namespace); do { NameStream.Write('.'); NameStream.SimpleWriteNotNull(reflectedType.Name); if (reflectedTypeIndex == 0) { reflectedType = type; type = null; } else { reflectedType = reflectedTypeArray[--reflectedTypeIndex]; } }while (reflectedType != null); }
public static valueType[] GetSort/*Compare[0]*//*Compare[0]*/ <valueType>(this LeftArray <valueType> array, Func <valueType, /*Type[0]*/ double /*Type[0]*/> getKey) { if (array.Length > 1) { return(AutoCSer.Algorithm.FixedArrayQuickSort.GetSort/*Compare[0]*//*Compare[0]*/ (array.Array, getKey, 0, array.Length)); } return(array.Length == 0 ? NullValue <valueType> .Array : new valueType[] { array.Array[0] }); }
public static LeftArray </*Type[0]*/ ulong /*Type[0]*/> reverse(this LeftArray </*Type[0]*/ ulong /*Type[0]*/> array) { if (array.Length > 1) { FixedArray.Reverse(array.Array, 0, array.Length); } return(array); }
public static /*Type[0]*/ ulong /*Type[0]*/[] getReverse(this LeftArray </*Type[0]*/ ulong /*Type[0]*/> array) { if (array.Length == 0) { return(NullValue </*Type[0]*/ ulong /*Type[0]*/> .Array); } return(FixedArray.GetReverse(array.Array, 0, array.Length)); }
/// <summary> /// 根据集合内容返回数组 /// </summary> /// <typeparam name="valueType">数据类型</typeparam> /// <typeparam name="arrayType">目标数据类型</typeparam> /// <param name="values">数据集合</param> /// <param name="getValue">获取数据数组</param> /// <param name="size">数据容器初始化大小</param> /// <returns>数组</returns> public static LeftArray <arrayType> getLeftArray <valueType, arrayType>(this IEnumerable <valueType> values, Func <valueType, arrayType> getValue, int size = 0) { if (values == null) { return(default(LeftArray <arrayType>)); } LeftArray <arrayType> array = new LeftArray <arrayType>(size); foreach (valueType value in values) { array.Add(getValue(value)); } return(array); }
/// <summary> /// 替换数据 /// </summary> /// <param name="array">数组数据</param> /// <param name="value">新值</param> /// <param name="isValue">数据匹配器</param> public static LeftArray </*Type[0]*/ ulong /*Type[0]*/> replaceFirst(this LeftArray </*Type[0]*/ ulong /*Type[0]*/> array, /*Type[0]*/ ulong /*Type[0]*/ value, Func </*Type[0]*/ ulong /*Type[0]*/, bool> isValue) { if (array.Length != 0) { fixed(/*Type[0]*/ ulong /*Type[0]*/ *valueFixed = array.Array) { /*Type[0]*/ ulong /*Type[0]*/ *valueIndex = FixedArray.IndexOf(valueFixed, array.Length, isValue); if (valueIndex != null) { *valueIndex = value; } } } return(array); }
/// <summary> /// 获取第一个匹配值 /// </summary> /// <param name="array">数组数据</param> /// <param name="isValue">数据匹配器</param> /// <param name="index">起始位置</param> /// <returns>第一个匹配值,失败为default(/*Type[0]*/ulong/*Type[0]*/)</returns> public static /*Type[0]*/ ulong /*Type[0]*/ firstOrDefault(this LeftArray </*Type[0]*/ ulong /*Type[0]*/> array, Func </*Type[0]*/ ulong /*Type[0]*/, bool> isValue, int index) { if ((uint)index < (uint)array.Length) { fixed(/*Type[0]*/ ulong /*Type[0]*/ *valueFixed = array.Array) { /*Type[0]*/ ulong /*Type[0]*/ *valueIndex = FixedArray.IndexOf(valueFixed + index, array.Length - index, isValue); if (valueIndex != null) { return(*valueIndex); } } } return(default(/*Type[0]*/ ulong /*Type[0]*/)); }
/// <summary> /// 获取匹配数据位置 /// </summary> /// <param name="array">数据数组</param> /// <param name="isValue">数据匹配器</param> /// <returns>匹配位置,失败为-1</returns> public static int indexOf(this LeftArray </*Type[0]*/ ulong /*Type[0]*/> array, Func </*Type[0]*/ ulong /*Type[0]*/, bool> isValue) { if (array.Length != 0) { fixed(/*Type[0]*/ ulong /*Type[0]*/ *valueFixed = array.Array) { /*Type[0]*/ ulong /*Type[0]*/ *index = FixedArray.IndexOf(valueFixed, array.Length, isValue); if (index != null) { return((int)(index - valueFixed)); } } } return(-1); }
/// <summary> /// 获取匹配数组 /// </summary> /// <param name="array">数组数据</param> /// <param name="isValue">数据匹配器</param> /// <returns>匹配数组</returns> public static /*Type[0]*/ ulong /*Type[0]*/[] getFindArray(this LeftArray </*Type[0]*/ ulong /*Type[0]*/> array, Func </*Type[0]*/ ulong /*Type[0]*/, bool> isValue) { if (array.Length == 0) { return(NullValue </*Type[0]*/ ulong /*Type[0]*/> .Array); } int length = ((array.Length + 63) >> 6) << 3; UnmanagedPool pool = AutoCSer.UnmanagedPool.GetDefaultPool(length); Pointer.Size data = pool.GetSize64(length); try { Memory.ClearUnsafe(data.ULong, length >> 3); return(FixedArray.GetFindArray(array.Array, 0, array.Length, isValue, new MemoryMap(data.Data))); } finally { pool.PushOnly(ref data); } }
public static void joinString(this LeftArray <int> array, CharStream stream, char join, string nullString = null) { if (nullString == null) { nullString = string.Empty; } if (array.Length == 0) { if (nullString.Length != 0) { stream.WriteNotNull(nullString); } } else { AutoCSer.NumberToCharStream.Join <int> .NumberJoinChar(stream, array.Array, 0, array.Length, join, nullString); } }
/// <summary> /// 获取匹配数量 /// </summary> /// <typeparam name="valueType"></typeparam> /// <param name="values">数组子串</param> /// <param name="isValue">数据匹配器</param> /// <returns>匹配数量</returns> public static int GetCount <valueType>(this LeftArray <valueType> values, Func <valueType, bool> isValue) { if (values.Length != 0) { int index = values.Length, count = 0; foreach (valueType value in values.Array) { if (isValue(value)) { ++count; } if (--index == 0) { break; } } return(count); } return(0); }
/// <summary> /// 数组类型转换 /// </summary> /// <typeparam name="valueType">数据类型</typeparam> /// <param name="subArray">数据数组</param> /// <param name="getValue">数据获取器</param> /// <returns>目标数组</returns> public static /*Type[0]*/ ulong /*Type[0]*/[] getArray <valueType>(this LeftArray <valueType> subArray, Func <valueType, /*Type[0]*/ ulong /*Type[0]*/> getValue) { if (subArray.Length == 0) { return(NullValue </*Type[0]*/ ulong /*Type[0]*/> .Array); } valueType[] array = subArray.Array; /*Type[0]*/ ulong /*Type[0]*/[] newValues = new /*Type[0]*/ ulong /*Type[0]*/[subArray.Length]; fixed(/*Type[0]*/ ulong /*Type[0]*/ *newValueFixed = newValues) { /*Type[0]*/ ulong /*Type[0]*/ *write = newValueFixed; int index = 0; do { *write++ = getValue(array[index++]); }while (index != subArray.Length); } return(newValues); }
/// <summary> /// 获取匹配集合 /// </summary> /// <param name="array">数组数据</param> /// <param name="isValue">数据匹配器</param> /// <returns>匹配集合</returns> public static LeftArray </*Type[0]*/ ulong /*Type[0]*/> find(this LeftArray </*Type[0]*/ ulong /*Type[0]*/> array, Func </*Type[0]*/ ulong /*Type[0]*/, bool> isValue) { if (array.Length == 0) { return(array); fixed(/*Type[0]*/ ulong /*Type[0]*/ *valueFixed = array.Array) { /*Type[0]*/ ulong /*Type[0]*/ *write = valueFixed, start = valueFixed, end = valueFixed + array.Length; do { if (isValue(*start)) { *write++ = *start; } }while (++start != end); return(new LeftArray </*Type[0]*/ ulong /*Type[0]*/> { Array = array.Array, Length = (int)(write - valueFixed) }); } }
/// <summary> /// 获取匹配数量 /// </summary> /// <param name="array">数组数据</param> /// <param name="isValue">数据匹配器</param> /// <returns>匹配数量</returns> public static int count(this LeftArray </*Type[0]*/ ulong /*Type[0]*/> array, Func </*Type[0]*/ ulong /*Type[0]*/, bool> isValue) { if (array.Length == 0) { return(0); } int value = 0; fixed(/*Type[0]*/ ulong /*Type[0]*/ *valueFixed = array.Array) { /*Type[0]*/ ulong /*Type[0]*/ *start = valueFixed, end = valueFixed + array.Length; do { if (isValue(*start)) { ++value; } }while (++start != end); } return(value); }
public static SubArray <valueType> GetRangeSort <valueType> (this LeftArray <valueType> values, Func <valueType, valueType, int> comparer, int skipCount, int getCount) { return(Array_Sort.GetRangeSort(values.Array, 0, values.Length, comparer, skipCount, getCount)); }
public static SubArray </*Type[0]*/ ulong /*Type[0]*/> GetPageSort/*Compare[0]*//*Compare[0]*/ (this LeftArray </*Type[0]*/ ulong /*Type[0]*/> array, int pageSize, int currentPage) { PageCount page = new PageCount(array.Length, pageSize, currentPage); return(AutoCSer.Algorithm.FixedArrayQuickRangeSort.UnsafeGetRangeSort/*Compare[0]*//*Compare[0]*/ (array.Array, 0, array.Length, page.SkipCount, page.CurrentPageSize)); }
public static LeftArray </*Type[0]*/ ulong /*Type[0]*/> getFind(this LeftArray </*Type[0]*/ ulong /*Type[0]*/> array, Func </*Type[0]*/ ulong /*Type[0]*/, bool> isValue) { return(array.Length == 0 ? default(LeftArray </*Type[0]*/ ulong /*Type[0]*/>) : FixedArray.GetFind(array.Array, 0, array.Length, isValue)); }
public static valueType[] GetPageDesc <valueType>(this LeftArray <valueType> values, int pageSize, int currentPage, out int count) { PageCount page = new PageCount(count = values.Length, pageSize, currentPage); return(new SubArray <valueType>(page.DescSkipCount, page.CurrentPageSize, values.Array).GetReverse()); }
public static /*Type[0]*/ ulong /*Type[0]*/[] getSort/*Compare[0]*//*Compare[0]*/ (this LeftArray </*Type[0]*/ ulong /*Type[0]*/> array) { return(array.Length > 1 ? FixedArraySort.GetSort/*Compare[0]*//*Compare[0]*/ (array.Array, 0, array.Length) : array.GetArray()); }
public static valueType[] getSort/*Compare[0]*//*Compare[0]*/ <valueType>(this LeftArray <valueType> array, Func <valueType, /*Type[0]*/ ulong /*Type[0]*/> getKey) { return(array.Length > 1 ? FixedArraySort.GetSort/*Compare[0]*//*Compare[0]*/ (array.Array, getKey, 0, array.Length) : array.GetArray()); }
public unsafe static DeSerializeResult deSerialize <valueType>(this valueType value, ref LeftArray <byte> data, DeSerializeConfig config = null) { if (data.Length == 0) { return new DeSerializeResult { State = DeSerializeState.UnknownData } } ; fixed(byte *dataFixed = data.Array) return(DeSerializer.DeSerialize <valueType>(data.Array, dataFixed, data.Length, ref value, config)); }
public static LeftArray </*Type[0]*/ ulong /*Type[0]*/> sort/*Compare[0]*//*Compare[0]*/ (this LeftArray </*Type[0]*/ ulong /*Type[0]*/> array) { if (array.Length > 1) { FixedArraySort.Sort/*Compare[0]*//*Compare[0]*/ (array.Array, 0, array.Length); } return(array); }
public static /*Type[0]*/ double /*Type[0]*/[] GetSort/*Compare[0]*//*Compare[0]*/ (this LeftArray </*Type[0]*/ double /*Type[0]*/> array) { return(AutoCSer.Algorithm.FixedArrayQuickSort.GetSort/*Compare[0]*//*Compare[0]*/ (array.Array, 0, array.Length)); }
public static string joinString <valueType>(this LeftArray <valueType> array, char join, string nullString = null) { return(AutoCSer.NumberToCharStream.Join <valueType> .JoinString(ref array, join, nullString)); }
public static LeftArray </*Type[0]*/ double /*Type[0]*/> Sort/*Compare[0]*//*Compare[0]*/ (this LeftArray </*Type[0]*/ double /*Type[0]*/> array) { if (array.Length > 1) { AutoCSer.Algorithm.FixedArrayQuickSort.Sort/*Compare[0]*//*Compare[0]*/ (array.Array, 0, array.Length); } return(array); }
public static valueType[] GetRangeSort/*Compare[0]*//*Compare[0]*/ <valueType>(this LeftArray <valueType> array, Func <valueType, /*Type[0]*/ ulong /*Type[0]*/> getKey, int skipCount, int getCount) { return(array.Length == 0 ? NullValue <valueType> .Array : AutoCSer.Algorithm.FixedArrayQuickRangeSort.GetRangeSort/*Compare[0]*//*Compare[0]*/ (array.Array, 0, array.Length, getKey, skipCount, getCount)); }
public static SubArray </*Type[0]*/ ulong /*Type[0]*/> GetRangeSort/*Compare[0]*//*Compare[0]*/ (this LeftArray </*Type[0]*/ ulong /*Type[0]*/> array, int skipCount, int getCount) { return(array.Length == 0 ? default(SubArray </*Type[0]*/ ulong /*Type[0]*/>) : AutoCSer.Algorithm.FixedArrayQuickRangeSort.GetRangeSort/*Compare[0]*//*Compare[0]*/ (array.Array, 0, array.Length, skipCount, getCount)); }
public static returnType[] GetPageSort/*Compare[0]*//*Compare[0]*/ <valueType, returnType>(this LeftArray <valueType> array, Func <valueType, /*Type[0]*/ ulong /*Type[0]*/> getKey, int pageSize, int currentPage, Func <valueType, returnType> getValue, out int count) { PageCount page = new PageCount(count = array.Length, pageSize, currentPage); return(AutoCSer.Algorithm.FixedArrayQuickRangeSort.UnsafeGetRangeSort/*Compare[0]*//*Compare[0]*/ (array.Array, 0, count, getKey, page.SkipCount, page.CurrentPageSize, getValue)); }
/// <summary> /// 泛型处理 /// </summary> /// <param name="type">类型</param> internal void GenericFullName(Type type) { Type reflectedType = type.ReflectedType; if (reflectedType == null) { if (type.GetGenericTypeDefinition() == typeof(Nullable <>)) { getFullName(type.GetGenericArguments()[0]); NameStream.Write('?'); return; } string name = type.Name; NameStream.WriteNotNull(type.Namespace); NameStream.Write('.'); NameStream.UnsafeWrite(name, 0, name.IndexOf(GenericSplit)); genericParameter(type); return; } LeftArray <Type> reflectedTypeList = default(LeftArray <Type>); do { reflectedTypeList.Add(reflectedType); reflectedType = reflectedType.ReflectedType; }while (reflectedType != null); Type[] reflectedTypeArray = reflectedTypeList.Array; int reflectedTypeIndex = reflectedTypeList.Length - 1; reflectedType = reflectedTypeArray[reflectedTypeIndex]; NameStream.WriteNotNull(reflectedType.Namespace); Type[] parameterTypes = type.GetGenericArguments(); int parameterIndex = 0; do { NameStream.Write('.'); if (reflectedType.IsGenericType) { string name = reflectedType.Name; int splitIndex = name.IndexOf(GenericSplit); if (splitIndex != -1) { NameStream.UnsafeWrite(name, 0, splitIndex); int parameterCount = reflectedType.GetGenericArguments().Length; genericParameter(parameterTypes, parameterIndex, parameterCount); parameterIndex = parameterCount; } else { NameStream.WriteNotNull(name); } } else { NameStream.SimpleWriteNotNull(reflectedType.Name); } if (reflectedTypeIndex == 0) { reflectedType = type; type = null; } else { reflectedType = reflectedTypeArray[--reflectedTypeIndex]; } }while (reflectedType != null); }