code: @Inline
      public final int compareTo(final Composite that)
      {
          if (isStatic() != that.isStatic())
          {
              // Static sorts before non-static no matter what, except for empty which
              // always sort first
              if (isEmpty())
                  return that.isEmpty() ? 0 : -1;
              if (that.isEmpty())
                  return 1;
              return isStatic() ? -1 : 1;
          }
  
          int size = size();
          int size2 = that.size();
          int minSize = Math.min(size, size2);
          int startDelta = 0;
          int cellNamesOffset = nameDeltaOffset(size);
          for (int i = 0 ; i < minSize ; i++)
          {
              int endDelta = i < size - 1 ? getShort(nameDeltaOffset(i + 1)) : valueStartOffset() - cellNamesOffset;
              long offset = peer + cellNamesOffset + startDelta;
              int length = endDelta - startDelta;
              int cmp = FastByteOperations.UnsafeOperations.compareTo(null, offset, length, that.get(i));
              if (cmp != 0)
                  return cmp;
              startDelta = endDelta;
          }
  
          EOC eoc = that.eoc();
          if (size == size2)
              return this.eoc().compareTo(eoc);
  
          return size < size2 ? this.eoc().prefixComparisonResult : -eoc.prefixComparisonResult;
      }
docs: requires isByteOrderComparable to be true. Compares the name components only; ; may need to compare EOC etc still