/// <summary>Creates a new attribute stream for storing vertex indices.</summary>
        /// <param name="size">The number of elements in the stream.</param>
        /// <param name="defaultValue">The default value to fill the stream with.</param>
        public static com.epl.geometry.AttributeStreamBase CreateIndexStream(int size, int defaultValue)
        {
            int persistence = com.epl.geometry.VertexDescription.Persistence.enumInt32;

            // VertexDescription.getPersistenceFromInt(NumberUtils::SizeOf((int)0));
            com.epl.geometry.AttributeStreamBase newStream;
            switch (persistence)
            {
            case (com.epl.geometry.VertexDescription.Persistence.enumInt32):
            {
                newStream = new com.epl.geometry.AttributeStreamOfInt32(size, (int)defaultValue);
                break;
            }

            case (com.epl.geometry.VertexDescription.Persistence.enumInt64):
            {
                newStream = new com.epl.geometry.AttributeStreamOfInt64(size, (long)defaultValue);
                break;
            }

            default:
            {
                throw new com.epl.geometry.GeometryException("Internal Error");
            }
            }
            return(newStream);
        }
        public override bool Equals(com.epl.geometry.AttributeStreamBase other, int start, int end)
        {
            if (other == null)
            {
                return(false);
            }
            if (!(other is com.epl.geometry.AttributeStreamOfInt64))
            {
                return(false);
            }
            com.epl.geometry.AttributeStreamOfInt64 _other = (com.epl.geometry.AttributeStreamOfInt64)other;
            int size      = Size();
            int sizeOther = _other.Size();

            if (end > size || end > sizeOther && (size != sizeOther))
            {
                return(false);
            }
            if (end > size)
            {
                end = size;
            }
            for (int i = start; i < end; i++)
            {
                if (Read(i) != _other.Read(i))
                {
                    return(false);
                }
            }
            return(true);
        }
        /// <summary>Creates a new attribute stream of given persistence type and size.</summary>
        /// <param name="persistence">The persistence type of the stream (see VertexDescription).</param>
        /// <param name="size">
        /// The number of elements (floats, doubles, or 32 bit integers)
        /// of the given type in the stream.
        /// </param>
        /// <param name="defaultValue">The default value to fill the stream with.</param>
        public static com.epl.geometry.AttributeStreamBase CreateAttributeStreamWithPersistence(int persistence, int size, double defaultValue)
        {
            com.epl.geometry.AttributeStreamBase newStream;
            switch (persistence)
            {
            case (com.epl.geometry.VertexDescription.Persistence.enumFloat):
            {
                newStream = new com.epl.geometry.AttributeStreamOfFloat(size, (float)defaultValue);
                break;
            }

            case (com.epl.geometry.VertexDescription.Persistence.enumDouble):
            {
                newStream = new com.epl.geometry.AttributeStreamOfDbl(size, (double)defaultValue);
                break;
            }

            case (com.epl.geometry.VertexDescription.Persistence.enumInt32):
            {
                newStream = new com.epl.geometry.AttributeStreamOfInt32(size, (int)defaultValue);
                break;
            }

            case (com.epl.geometry.VertexDescription.Persistence.enumInt64):
            {
                newStream = new com.epl.geometry.AttributeStreamOfInt64(size, (long)defaultValue);
                break;
            }

            case (com.epl.geometry.VertexDescription.Persistence.enumInt8):
            {
                newStream = new com.epl.geometry.AttributeStreamOfInt8(size, unchecked ((byte)defaultValue));
                break;
            }

            case (com.epl.geometry.VertexDescription.Persistence.enumInt16):
            {
                newStream = new com.epl.geometry.AttributeStreamOfInt16(size, (short)defaultValue);
                break;
            }

            default:
            {
                throw new com.epl.geometry.GeometryException("Internal Error");
            }
            }
            return(newStream);
        }
        public AttributeStreamOfInt64(com.epl.geometry.AttributeStreamOfInt64 other, int maxSize)
        {
            m_size = other.Size();
            if (m_size > maxSize)
            {
                m_size = maxSize;
            }
            int sz = m_size;

            if (sz < 2)
            {
                sz = 2;
            }
            m_buffer = new long[sz];
            System.Array.Copy(other.m_buffer, 0, m_buffer, 0, m_size);
        }
 public AttributeStreamOfInt64(com.epl.geometry.AttributeStreamOfInt64 other)
 {
     m_buffer = (long[])other.m_buffer.Clone();
     m_size   = other.m_size;
 }
 public override void WriteRange(int startElement, int count, com.epl.geometry.AttributeStreamBase _src, int srcStart, bool bForward, int stride)
 {
     if (startElement < 0 || count < 0 || srcStart < 0)
     {
         throw new System.ArgumentException();
     }
     if (!bForward && (stride <= 0 || (count % stride != 0)))
     {
         throw new System.ArgumentException();
     }
     com.epl.geometry.AttributeStreamOfInt64 src = (com.epl.geometry.AttributeStreamOfInt64)_src;
     // the input
     // type must
     // match
     if (src.Size() < (int)(srcStart + count))
     {
         throw new System.ArgumentException();
     }
     if (count == 0)
     {
         return;
     }
     if (Size() < count + startElement)
     {
         Resize(count + startElement);
     }
     if (_src == (com.epl.geometry.AttributeStreamBase) this)
     {
         _selfWriteRangeImpl(startElement, count, srcStart, bForward, stride);
         return;
     }
     if (bForward)
     {
         int j      = startElement;
         int offset = srcStart;
         for (int i = 0; i < count; i++)
         {
             m_buffer[j] = src.m_buffer[offset];
             j++;
             offset++;
         }
     }
     else
     {
         int j      = startElement;
         int offset = srcStart + count - stride;
         if (stride == 1)
         {
             for (int i = 0; i < count; i++)
             {
                 m_buffer[j] = src.m_buffer[offset];
                 j++;
                 offset--;
             }
         }
         else
         {
             for (int i = 0, n = count / stride; i < n; i++)
             {
                 for (int k = 0; k < stride; k++)
                 {
                     m_buffer[j + k] = src.m_buffer[offset + k];
                 }
                 j      += stride;
                 offset -= stride;
             }
         }
     }
 }