@Override
 public int compareTo(Object o) {
   if (o instanceof DateAxisGraphLabel) {
     return Long.compare(this.date, ((DateAxisGraphLabel) o).getDate());
   }
   return 0;
 }
    /** {@inheritDoc} */
    @Override
    public int compareTo(CancelMessageId m) {
      int res = Long.compare(reqId, m.reqId);

      if (res == 0) res = m.nodeId.compareTo(nodeId);

      return res;
    }
 protected static int compare(Object lvalue, Object rvalue) throws DapException {
   if (lvalue instanceof String && rvalue instanceof String)
     return ((String) lvalue).compareTo((String) rvalue);
   if (lvalue instanceof Boolean && rvalue instanceof Boolean)
     return compare((Boolean) lvalue ? 1 : 0, (Boolean) rvalue ? 1 : 0);
   if (lvalue instanceof Double
       || lvalue instanceof Float
       || rvalue instanceof Double
       || rvalue instanceof Float) {
     double d1 = ((Number) lvalue).doubleValue();
     double d2 = ((Number) lvalue).doubleValue();
     return Double.compare(d1, d2);
   } else {
     long l1 = ((Number) lvalue).longValue();
     long l2 = ((Number) rvalue).longValue();
     return Long.compare(l1, l2);
   }
 }
  // suffix array in O(n*log^2(n))
  public static Integer[] suffixArray(CharSequence s) {
    int n = s.length();
    Integer[] sa = new Integer[n];
    int[] rank = new int[n];
    for (int i = 0; i < n; i++) {
      sa[i] = i;
      rank[i] = s.charAt(i);
    }
    for (int len = 1; len < n; len *= 2) {
      long[] rank2 = new long[n];
      for (int i = 0; i < n; i++)
        rank2[i] = ((long) rank[i] << 32) + (i + len < n ? rank[i + len] + 1 : 0);

      Arrays.sort(sa, (a, b) -> Long.compare(rank2[a], rank2[b]));

      for (int i = 0; i < n; i++)
        rank[sa[i]] = i > 0 && rank2[sa[i - 1]] == rank2[sa[i]] ? rank[sa[i - 1]] : i;
    }
    return sa;
  }
 /**
  * Compares the target to a timestamp.
  *
  * @param timestamp the timestamp to compare.
  * @return a negative integer, zero, or a positive integer as the target lies before, covering,
  *     or after than the timestamp.
  */
 public int compareToTimestamp(long timestamp) {
   return Long.compare(divPosition, timestamp / size);
 }
 @Override
 public int compare(VisorGgfsProfilerEntry a, VisorGgfsProfilerEntry b) {
   return Long.compare(a.timestamp, b.timestamp);
 }
 @Override
 public int compare(VisorLogFile f1, VisorLogFile f2) {
   return Long.compare(f2.lastModified(), f1.lastModified());
 }
 @Override
 public int compare(Event o1, Event o2) {
   return Long.compare(o1.localOrder(), o2.localOrder());
 }