/**
  * @param rs record stream with all {@link SharedFormulaRecord} {@link ArrayRecord}, {@link
  *     TableRecord} {@link MergeCellsRecord} Records removed
  * @param svm an initialised {@link SharedValueManager} (from the shared formula, array and table
  *     records of the current sheet). Never <code>null</code>.
  */
 public RowRecordsAggregate(RecordStream rs, SharedValueManager svm) {
   this(svm);
   while (rs.hasNext()) {
     Record rec = rs.getNext();
     switch (rec.getSid()) {
       case RowRecord.sid:
         insertRow((RowRecord) rec);
         continue;
       case DBCellRecord.sid:
         // end of 'Row Block'.  Should only occur after cell records
         // ignore DBCELL records because POI generates them upon re-serialization
         continue;
     }
     if (rec instanceof UnknownRecord) {
       // might need to keep track of where exactly these belong
       addUnknownRecord(rec);
       while (rs.peekNextSid() == ContinueRecord.sid) {
         addUnknownRecord(rs.getNext());
       }
       continue;
     }
     if (rec instanceof MulBlankRecord) {
       _valuesAgg.addMultipleBlanks((MulBlankRecord) rec);
       continue;
     }
     if (!(rec instanceof CellValueRecordInterface)) {
       throw new RuntimeException("Unexpected record type (" + rec.getClass().getName() + ")");
     }
     _valuesAgg.construct((CellValueRecordInterface) rec, rs, svm);
   }
 }
 private void constructValueRecord(List<Record> records) {
   RowBlocksReader rbr = new RowBlocksReader(new RecordStream(records, 0));
   SharedValueManager sfrh = rbr.getSharedFormulaManager();
   RecordStream rs = rbr.getPlainRecordStream();
   while (rs.hasNext()) {
     Record rec = rs.getNext();
     valueRecord.construct((CellValueRecordInterface) rec, rs, sfrh);
   }
 }
  public ColumnInfoRecordsAggregate(RecordStream rs) {
    this();

    boolean isInOrder = true;
    ColumnInfoRecord cirPrev = null;
    while (rs.peekNextClass() == ColumnInfoRecord.class) {
      ColumnInfoRecord cir = (ColumnInfoRecord) rs.getNext();
      records.add(cir);
      if (cirPrev != null && CIRComparator.compareColInfos(cirPrev, cir) > 0) {
        isInOrder = false;
      }
      cirPrev = cir;
    }
    if (records.size() < 1) {
      throw new RuntimeException("No column info records found");
    }
    if (!isInOrder) {
      Collections.sort(records, CIRComparator.instance);
    }
  }