public XArray Divide()

in XForm/XForm/Types/Computers/LongComputer.cs [233:305]


        public XArray Divide(XArray left, XArray right)
        {
            long[] leftArray = (long[])left.Array;
            long[] rightArray = (long[])right.Array;

            int count = left.Count;
            if (right.Count != count) throw new InvalidOperationException("Computations must get the same number of rows from each argument.");

            bool areAnyNull = false;

            // Allocate for results
            Allocator.AllocateToSize(ref _buffer, count);
            Allocator.AllocateToSize(ref _isNull, count);

            // Check how the XArrays are configured and run the fastest loop possible for the configuration.
            if (left.HasNulls || right.HasNulls)
            {
                for (int i = 0; i < count; ++i)
                {
                    int index1 = left.Index(i);
                    int index2 = right.Index(i);

                    bool rowIsNull = (left.HasNulls && left.NullRows[index1]) || (right.HasNulls && right.NullRows[index2]);

                    DivideSafe(leftArray[index1], rightArray[index2], out _buffer[i], out _isNull[i], ref areAnyNull);
                    _isNull[i] |= rowIsNull;
                    areAnyNull |= rowIsNull;
                }
            }
            else if (left.Selector.Indices != null || right.Selector.Indices != null)
            {
                for (int i = 0; i < left.Count; ++i)
                {
                    DivideSafe(leftArray[left.Index(i)], rightArray[right.Index(i)], out _buffer[i], out _isNull[i], ref areAnyNull);
                }
            }
            else if (!right.Selector.IsSingleValue && !left.Selector.IsSingleValue)
            {
                int leftStart = left.Selector.StartIndexInclusive;
                int rightStart = right.Selector.StartIndexInclusive;
                for (int i = 0; i < count; ++i)
                {
                    DivideSafe(leftArray[i + leftStart], rightArray[i + rightStart], out _buffer[i], out _isNull[i], ref areAnyNull);
                }
            }
            else if (!left.Selector.IsSingleValue)
            {
                int leftStart = left.Selector.StartIndexInclusive;
                long rightValue = rightArray[right.Selector.StartIndexInclusive];

                for (int i = 0; i < count; ++i)
                {
                    DivideSafe(leftArray[i + leftStart], rightValue, out _buffer[i], out _isNull[i], ref areAnyNull);
                }
            }
            else if (!right.Selector.IsSingleValue)
            {
                long leftValue = leftArray[left.Selector.StartIndexInclusive];
                int rightStart = right.Selector.StartIndexInclusive;

                for (int i = 0; i < count; ++i)
                {
                    DivideSafe(leftValue, rightArray[i + rightStart], out _buffer[i], out _isNull[i], ref areAnyNull);
                }
            }
            else
            {
                DivideSafe(leftArray[left.Selector.StartIndexInclusive], rightArray[right.Selector.StartIndexInclusive], out _buffer[0], out _isNull[0], ref areAnyNull);
                return (areAnyNull ? XArray.Null(_buffer, count) : XArray.Single(_buffer, count));
            }

            return XArray.All(_buffer, count, (areAnyNull ? _isNull : null));
        }