comparison mde/file/mergetag/Reader.d @ 134:7ababdf97748

Moved mde.setup.paths to mde.file.paths and paths.mdeReader to mde.file.mergetag.Reader.MTMultiReader.
author Diggory Hardy <diggory.hardy@gmail.com>
date Thu, 29 Jan 2009 14:59:45 +0000
parents b16a534f5302
children 4084f07f2c7a
comparison
equal deleted inserted replaced
133:9fd705793568 134:7ababdf97748
516 } 516 }
517 void read () {} /// Commence reading 517 void read () {} /// Commence reading
518 void read (ID[] secSet) {} /// ditto 518 void read (ID[] secSet) {} /// ditto
519 void read (IContainer!(ID) secSet) {}/// ditto 519 void read (IContainer!(ID) secSet) {}/// ditto
520 } 520 }
521
522
523 /** A special adapter for reading from multiple mergetag files.
524 *
525 * The number of files $(B must not) exceed MAX_PATHS. */
526 class MTMultiReader : IReader
527 {
528 this (FilePath[] files, DataSet ds, bool rdHeader)
529 in {
530 assert (files !is null, "mdeReader.this: files is null");
531 } body {
532 // Don't let sub-readers create their own, separate, datasets:
533 if (ds is null) ds = new DataSet;
534
535 Exception exc;
536 foreach (file; files) {
537 try { // try reading header of each file
538 IReader r = makeReader (file, ds, rdHeader);
539 readers[readersLen++] = r;
540 } catch (Exception e) {
541 exc = e;
542 }
543 }
544 if (readersLen == 0) // no files have valid headers
545 throw exc; // fail: re-throw last exception
546 }
547
548 DataSet dataset () { /// Get the DataSet
549 return readers[0].dataset; // all readers share the same dataset
550 }
551 void dataset (DataSet ds) { /// Set the DataSet
552 for (uint i = 0; i < readersLen; ++i) readers[i].dataset (ds);
553 }
554
555 void dataSecCreator (IDataSection delegate (ID) dsC) { /// Set the dataSecCreator
556 for (uint i = 0; i < readersLen; ++i) readers[i].dataSecCreator = dsC;
557 }
558
559 /** Get identifiers for all sections.
560 *
561 * Note: the identifiers from all sections in all files are just strung
562 * together, starting with the highest-priority file. */
563 ID[] getSectionNames () {
564 ID[] names;
565 for (int i = readersLen-1; i >= 0; --i)
566 names ~= readers[i].getSectionNames;
567 return names;
568 }
569 void read () { /// Commence reading
570 for (uint i = 0; i < readersLen; ++i) readers[i].read();
571 }
572 void read (ID[] secSet) { /// ditto
573 for (uint i = 0; i < readersLen; ++i) readers[i].read(secSet);
574 }
575 void read (IContainer !(ID) secSet) { /// ditto
576 for (uint i = 0; i < readersLen; ++i) readers[i].read(secSet);
577 }
578
579 const MAX_READERS = 4;
580 private:
581 // Use a simpler static array:
582 IReader[MAX_READERS] readers;
583 ubyte readersLen = 0;
584 }