Mercurial > projects > mde
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 } |