// Avoid string allocations by iterating over the internal byte array.
            public static int CompareNames(SerializedBamAlignment alignment1,
                                           SerializedBamAlignment alignment2,
                                           SerializedAlignmentContainer alignmentContainer1,
                                           SerializedAlignmentContainer alignmentContainer2)
            {
                byte[] byteArray1 = null;
                int    offset1    = 0;

                alignmentContainer1._serializedAlignments.GetByteArrayAndOffset(
                    alignment1.SerializedOffset,
                    ref byteArray1,
                    ref offset1);

                byte[] byteArray2 = null;
                int    offset2    = 0;

                alignmentContainer2._serializedAlignments.GetByteArrayAndOffset(
                    alignment2.SerializedOffset,
                    ref byteArray2,
                    ref offset2);

                // The name starts at the 36th byte
                UInt32 alignmentNamePos = 36;

                offset1 += (int)alignmentNamePos;
                offset2 += (int)alignmentNamePos;

                int initOffset1 = offset1;

                while (byteArray1[offset1] != '\0' && byteArray1[offset1] == byteArray2[offset2])
                {
                    ++offset1;
                    ++offset2;
                }

                if (byteArray1[offset1] < byteArray2[offset2])
                {
                    return(-1);
                }

                if (byteArray1[offset1] > byteArray2[offset2])
                {
                    return(1);
                }

                return(0);
            }
 public BamListContainer(SerializedAlignmentContainer bamList)
 {
     _index   = 0;
     _bamList = bamList;
 }
            // This comparison operator is copied exactly from samtools.
            public int Compare(SerializedBamAlignment a,
                               SerializedBamAlignment b,
                               SerializedAlignmentContainer alignmentContainerA,
                               SerializedAlignmentContainer alignmentContainerB)
            {
                int cmp = FileOrderCompare(a, b);

                if (cmp != 0)
                {
                    return(cmp);
                }

                // They're the same.
                // Test of negative strand flag is not really necessary, because it is tested
                // with cmp if getFlags, but it is left here because that is the way it was done
                // in the past.
                if (a.IsReverseStrand == b.IsReverseStrand)
                {
                    cmp = -1 * a.MapQuality.CompareTo(b.MapQuality);
                    if (cmp != 0)
                    {
                        return(cmp);
                    }

                    if (alignmentContainerA != null && alignmentContainerB != null)
                    {
                        // When storing a large number of records, the names are stored in the byte
                        // array to avoid a lot of memory allocations.
                        cmp = SerializedAlignmentContainer.CompareNames(a, b, alignmentContainerA, alignmentContainerB);
                    }
                    else
                    {
                        cmp = string.CompareOrdinal(a.Name, b.Name);
                    }

                    if (cmp != 0)
                    {
                        return(cmp);
                    }
                    cmp = a.AlignmentFlag.CompareTo(b.AlignmentFlag);
                    if (cmp != 0)
                    {
                        return(cmp);
                    }
                    cmp = a.MateRefID.CompareTo(b.MateRefID);
                    if (cmp != 0)
                    {
                        return(cmp);
                    }
                    cmp = a.MatePosition.CompareTo(b.MatePosition);
                    if (cmp != 0)
                    {
                        return(cmp);
                    }
                    cmp = a.FragmentLength.CompareTo(b.FragmentLength);
                    return(cmp);
                }
                else
                {
                    return(a.IsReverseStrand ? 1 : -1);
                }
            }
 public BamAlignmentComparer(SerializedAlignmentContainer alignmentContainer = null) : base()
 {
     _alignmentContainer = alignmentContainer;
 }