Ejemplo n.º 1
0
 public OrderedArray1d(Type type, bool ordered)
     : base(1, type)
 {
     if (ordered && TypeUtils.IsNumeric(type))
     {
         order = ArrayOrder.Unknown;
     }
     else
     {
         order = ArrayOrder.None;
     }
 }
Ejemplo n.º 2
0
        private void SetUpOrder(Array a)
        {
            if (a.Length <= 1)
            {
                return;
            }
            int res = GetOrder(a);

            if (res == 0)
            {
                throw new Exception("Axis must be strictly monotonic.");
            }
            order = (res > 0) ? ArrayOrder.Ascendant : ArrayOrder.Descendant;
        }
Ejemplo n.º 3
0
        public void EnforceOrder(bool enforce)
        {
            if (!TypeUtils.IsNumeric(type) && !TypeUtils.IsDateTime(type) && !(type == typeof(string)))
            {
                return;
            }

            if (enforce)
            {
                order = ArrayOrder.Unknown;
            }
            else
            {
                order = ArrayOrder.None;
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Determines the order of the array.
        /// </summary>
        public static ArrayOrder IsOrdered <T>(T[] a)
        {
            if (a == null || a.Length <= 1)
            {
                return(ArrayOrder.Unknown);
            }

            Comparer c    = Comparer.DefaultInvariant;
            int      diff = c.Compare(a[1], a[0]);

            if (diff == 0)
            {
                return(ArrayOrder.None);
            }
            ArrayOrder order = (diff > 0) ? ArrayOrder.Ascendant : ArrayOrder.Descendant;


            if (order == ArrayOrder.Ascendant)
            {
                for (int i = 1; i < a.Length - 1; i++)
                {
                    if (c.Compare(a[i + 1], a[i]) <= 0)
                    {
                        return(ArrayOrder.None);
                    }
                }
            }
            else if (order == ArrayOrder.Descendant)
            {
                for (int i = 1; i < a.Length - 1; i++)
                {
                    if (c.Compare(a[i + 1], a[i]) >= 0)
                    {
                        return(ArrayOrder.None);
                    }
                }
            }
            return(order);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Determines the order of the array.
        /// </summary>
        public static ArrayOrder IsOrdered(Array a)
        {
            if (a == null || a.Length <= 1)
            {
                return(ArrayOrder.Unknown);
            }

            int diff = GetOrder(a);

            if (diff == 0)
            {
                return(ArrayOrder.None);
            }
            ArrayOrder order = (diff > 0) ? ArrayOrder.Ascendant : ArrayOrder.Descendant;

            Comparer cmp = Comparer.DefaultInvariant;

            if (order == ArrayOrder.Ascendant)
            {
                for (int i = 0; i < a.Length - 1; i++)
                {
                    if (cmp.Compare(a.GetValue(i + 1), a.GetValue(i)) <= 0)
                    {
                        return(ArrayOrder.None);
                    }
                }
            }
            else if (order == ArrayOrder.Descendant)
            {
                for (int i = 0; i < a.Length - 1; i++)
                {
                    if (cmp.Compare(a.GetValue(i + 1), a.GetValue(i)) >= 0)
                    {
                        return(ArrayOrder.None);
                    }
                }
            }
            return(order);
        }
Ejemplo n.º 6
0
        public static bool IspixelformatAlpha(uint format)
        {
            if (IspixelformatPacked(format))
            {
                PackedOrder pOrder =
                    (PackedOrder)Pixelorder(format);
                return(pOrder == PackedOrder.PackedorderArgb ||
                       pOrder == PackedOrder.PackedorderRgba ||
                       pOrder == PackedOrder.PackedorderAbgr ||
                       pOrder == PackedOrder.PackedorderBgra);
            }
            else if (IspixelformatArray(format))
            {
                ArrayOrder aOrder =
                    (ArrayOrder)Pixelorder(format);
                return(aOrder == ArrayOrder.ArrayorderArgb ||
                       aOrder == ArrayOrder.ArrayorderRgba ||
                       aOrder == ArrayOrder.ArrayorderAbgr ||
                       aOrder == ArrayOrder.ArrayorderBgra);
            }

            return(false);
        }
Ejemplo n.º 7
0
        private void EmitWriteArray(ILGenerator gen,
                                    TypeInformation typeInformation,
                                    Action loadWriter,
                                    Action loadValue,
                                    Action loadSerializer,
                                    Action loadRemotingEndPoint,
                                    ArrayOrder order = ArrayOrder.Forward)
        {
            var elementType = typeInformation.ElementType;
            var length      = gen.DeclareLocal(typeof(int));
            var i           = gen.DeclareLocal(typeof(int));
            var loop        = gen.DefineLabel();
            var end         = gen.DefineLabel();

            // writer.Write(value.Length)
            loadValue();
            gen.Emit(OpCodes.Ldlen);
            gen.Emit(OpCodes.Stloc, length);

            loadWriter();
            gen.Emit(OpCodes.Ldloc, length);
            gen.Emit(OpCodes.Call, Methods.WriteInt32);

            // i = 0
            // OR
            // i = length-1
            switch (order)
            {
            case ArrayOrder.Forward:
                gen.Emit(OpCodes.Ldc_I4_0);
                gen.Emit(OpCodes.Stloc, i);
                break;

            case ArrayOrder.Reverse:
                gen.Emit(OpCodes.Ldloc, length);
                gen.Emit(OpCodes.Ldc_I4_1);
                gen.Emit(OpCodes.Sub);
                gen.Emit(OpCodes.Stloc, i);
                break;

            default:
                throw new InvalidEnumArgumentException(nameof(order), (int)order, typeof(ArrayOrder));
            }

            gen.MarkLabel(loop);

            // while i != length
            // OR
            // while i != -1

            switch (order)
            {
            case ArrayOrder.Forward:
                gen.Emit(OpCodes.Ldloc, length);
                gen.Emit(OpCodes.Ldloc, i);
                gen.Emit(OpCodes.Ceq);
                gen.Emit(OpCodes.Brtrue, end);
                break;

            default:
                gen.Emit(OpCodes.Ldc_I4_0);
                gen.Emit(OpCodes.Ldloc, i);
                gen.Emit(OpCodes.Cgt);
                gen.Emit(OpCodes.Brtrue, end);
                break;
            }

            Action loadCurrentValue = () =>
            {
                loadValue();
                gen.Emit(OpCodes.Ldloc, i);
                gen.Emit(OpCodes.Ldelem, elementType);
            };
            Action loadCurrentValueAddress = () =>
            {
                loadValue();
                gen.Emit(OpCodes.Ldloc, i);
                gen.Emit(OpCodes.Ldelema, elementType);
            };

            EmitWriteValue(gen,
                           loadWriter,
                           loadCurrentValue,
                           loadCurrentValueAddress,
                           loadSerializer,
                           loadRemotingEndPoint,
                           elementType);

            switch (order)
            {
            case ArrayOrder.Forward:
                gen.Emit(OpCodes.Ldloc, i);
                gen.Emit(OpCodes.Ldc_I4_1);
                gen.Emit(OpCodes.Add);
                gen.Emit(OpCodes.Stloc, i);
                break;

            default:
                gen.Emit(OpCodes.Ldloc, i);
                gen.Emit(OpCodes.Ldc_I4_1);
                gen.Emit(OpCodes.Sub);
                gen.Emit(OpCodes.Stloc, i);
                break;
            }

            // goto loop
            gen.Emit(OpCodes.Br, loop);

            gen.MarkLabel(end);
        }