1 /*==========================================================================
2 SeqAn - The Library for Sequence Analysis
4 ============================================================================
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 3 of the License, or (at your option) any later version.
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 ============================================================================
18 $Id: file_format.h,v 1.1 2008/08/25 16:20:03 langmead Exp $
19 ==========================================================================*/
21 #ifndef SEQAN_HEADER_FILE_FORMAT_H
22 #define SEQAN_HEADER_FILE_FORMAT_H
24 namespace SEQAN_NAMESPACE_MAIN
27 //////////////////////////////////////////////////////////////////////////////
31 ..summary:A file format.
35 //////////////////////////////////////////////////////////////////////////////
37 //////////////////////////////////////////////////////////////////////////////
39 //////////////////////////////////////////////////////////////////////////////
41 //////////////////////////////////////////////////////////////////////////////
42 //Base Class for all FileFormat classes
43 //////////////////////////////////////////////////////////////////////////////
48 ..summary:Object that stores a file format.
49 ..signature:FileFormat<File, Data [, Format [, Meta] ]>
57 typename TFormat = void >
59 public FileFormat<TFile, TData, TMeta, void>
62 typedef typename Size<TData>::Type TSize;
65 FileFormat(FileFormat const &) {}
67 FileFormat const & operator =(FileFormat const &) {}
73 return _ClassIdentifier<TFormat>::getID();
77 read_(TFile & file, TData & data) const
80 read(file, data, TFormat());
83 read_(TFile & file, TData & data, TSize limit) const
86 read(file, data, limit, TFormat());
90 readMeta_(TFile & file, TMeta & meta) const
93 readMeta(file, meta, TFormat());
97 goNext_(TFile & file) const
100 goNext(file, TFormat());
104 length_(TFile & file) const
107 length(file, TFormat());
111 write_(TFile & file, TData & data) const
114 write(file, data, TFormat());
117 write_(TFile & file, TData & data, TMeta & meta) const
120 write(file, data, meta, TFormat());
124 //____________________________________________________________________________
126 //base class for all file format classes
128 template <typename TFile, typename TData, typename TMeta>
129 struct FileFormat<TFile, TData, TMeta, void>
132 typedef typename Size<TData>::Type TSize;
135 FileFormat(FileFormat const &) {}
137 FileFormat const & operator =(FileFormat const &) {}
140 formatID_() const = 0;
143 read_(TFile & file, TData & data) const = 0;
145 read_(TFile & file, TData & data, TSize limit) const = 0;
148 readMeta_(TFile & file, TMeta & meta) const = 0;
151 goNext_(TFile & file) const = 0;
154 length_(TFile & file) const = 0;
157 write_(TFile & file, TData & data) const = 0;
159 write_(TFile & file, TData & data, TMeta & meta) const = 0;
163 //////////////////////////////////////////////////////////////////////////////
164 // Wrapper for functions to virtuals
165 //////////////////////////////////////////////////////////////////////////////
168 template <typename TFile, typename TData, typename TMeta, typename TFormat>
170 formatID(FileFormat<TFile, TData, TMeta, TFormat> const & file_format)
173 return file_format.formatID_();
176 //////////////////////////////////////////////////////////////////////////////
179 .Function.Fileformat#read:
181 ..summary:Loads a record from file.
182 ..signature:read(file, data [, meta], format)
183 ..signature:read(file, data [, meta], tag)
184 ..param.file:An input file.
185 ..param.data:A container that gets the data read from $file$.
186 ..param.meta:A container that gets meta data from $file$. (optional)
187 ..param.format:A file format object.
188 ...type:Class.FileFormat.File Format object
189 ..param.tag:A file format tag.
190 ...type:Tag.File Format.File Format tag
191 ..remarks:The result of this operation is stored in $data$.
192 ..remarks:The function leaves $file$ at the position for reading the next record.
193 ..see:Function.assign
195 template <typename TFile, typename TData, typename TMeta, typename TFormat>
199 FileFormat<TFile, TData, TMeta, TFormat> const & file_format)
202 file_format.read_(file, data);
205 template <typename TFile, typename TData, typename TMeta, typename TFormat, typename TSize>
210 FileFormat<TFile, TData, TMeta, TFormat> const & file_format)
213 file_format.read_(file, data, limit);
216 //////////////////////////////////////////////////////////////////////////////
221 ..summary:Read meta information from file.
222 ..signature:readMeta(file, meta, file_format)
223 ..param.file:A file that contains data in the format specified by $file_format$.
224 ..param.meta:A data structure that is able to store meta informations stored in $file$.
225 ..param.file_format:A file format.
226 ..returns.param.meta:The meta data read from $file$.
227 ...type:Tag.File Format
230 template <typename TFile, typename TData, typename TMeta, typename TFormat>
232 readMeta(TFile & file,
234 FileFormat<TFile, TData, TMeta, TFormat> const & file_format)
237 file_format.readMeta_(file, meta);
240 //////////////////////////////////////////////////////////////////////////////
247 template <typename TFile, typename TData, typename TMeta, typename TFormat>
250 FileFormat<TFile, TData, TMeta, TFormat> const & file_format)
253 file_format.goNext_(file);
256 //////////////////////////////////////////////////////////////////////////////
263 template <typename TFile, typename TData, typename TMeta, typename TFormat>
266 FileFormat<TFile, TData, TMeta, TFormat> const & file_format)
269 file_format.length_(file);
272 //////////////////////////////////////////////////////////////////////////////
275 .Function.Fileformat#write:
277 ..summary:Writes to stream.
278 ..signature:write(stream, source)
279 ..signature:write(stream, begin, end)
280 ..param.stream: A stream object.
281 ...type:Adaption."std::iostream"
282 ..param.source: Container that is written to $stream$.
283 ..param.begin: Iterator to the first character of the range.
284 ..param.end: Iterator behind the last character of the range.
285 ..remarks:The content of $source$ is written 'as-is' to $stream$.
288 template <typename TFile, typename TData, typename TMeta, typename TFormat>
292 FileFormat<TFile, TData, TMeta, TFormat> const & file_format)
295 file_format.write_(file, data);
297 template <typename TFile, typename TData, typename TMeta, typename TFormat>
302 FileFormat<TFile, TData, TMeta, TFormat> const & file_format)
305 file_format.write_(file, data, meta);
311 //////////////////////////////////////////////////////////////////////////////
312 // Comparison of two FileFormat objects
313 //////////////////////////////////////////////////////////////////////////////
315 template <typename TFileLeft, typename TDataLeft, typename TMetaLeft, typename TFormatLeft, typename TFileRight, typename TDataRight, typename TMetaRight, typename TFormatRight>
317 operator == (FileFormat<TFileLeft, TDataLeft, TMetaLeft, TFormatLeft> const & left,
318 FileFormat<TFileRight, TDataRight, TMetaRight, TFormatRight> const & right)
321 return formatID(left) == formatID(right);
324 template <typename TFile, typename TData, typename TMeta, typename TFormat, typename TFormat2>
326 operator == (FileFormat<TFile, TData, TMeta, TFormat> const & left,
330 return formatID(left) == _ClassIdentifier<Tag<TFormat2> const>::getID();
333 template <typename TFile, typename TData, typename TMeta, typename TFormat, typename TFormat2>
335 operator == (Tag<TFormat2> const,
336 FileFormat<TFile, TData, TMeta, TFormat> const & right)
339 return _ClassIdentifier<Tag<TFormat2> const>::getID() == formatID(right);
342 //____________________________________________________________________________
344 template <typename TFileLeft, typename TDataLeft, typename TMetaLeft, typename TFormatLeft, typename TFileRight, typename TDataRight, typename TMetaRight, typename TFormatRight>
346 operator != (FileFormat<TFileLeft, TDataLeft, TMetaLeft, TFormatLeft> const & left,
347 FileFormat<TFileRight, TDataRight, TMetaRight, TFormatRight> const & right)
350 return formatID(left) != formatID(right);
353 template <typename TFile, typename TData, typename TMeta, typename TFormat, typename TFormat2>
355 operator != (FileFormat<TFile, TData, TMeta, TFormat> const & left,
359 return formatID(left) != _ClassIdentifier<Tag<TFormat2> const>::getID();
362 template <typename TFile, typename TData, typename TMeta, typename TFormat, typename TFormat2>
364 operator != (Tag<TFormat2> const,
365 FileFormat<TFile, TData, TMeta, TFormat> const & right)
368 return _ClassIdentifier<Tag<TFormat2> const>::getID() != formatID(right);
371 //////////////////////////////////////////////////////////////////////////////
372 // allgemeine Funktionen fuer Streams
373 //////////////////////////////////////////////////////////////////////////////
374 //TODO??? Das muss in eine extra Datei
378 template <typename TStream, typename TIterator>
380 write(TStream & target,
384 while (begin_ != end_)
386 _streamPut(target, convert<char>(*begin_));
391 //____________________________________________________________________________
393 template <typename TStream, typename TSource>
395 write(TStream & target,
396 TSource const & source)
398 write(target, begin(source), end(source));
400 //TODO???: Spezialisierungen zum blockweise schreiben bei contiguous strings von char
401 //Anmerkungen: write wird nach dem zweiten Argument (source) spezialisiert!
403 //____________________________________________________________________________
405 template <typename TStream, typename TSource>
407 write(TStream & target,
408 TSource const & source,
409 typename Size<TSource>::Type limit_)
411 if (length(source) > limit_)
413 write(target, begin(source), begin(source) + limit_);
417 write(target, begin(source), end(source));
422 //////////////////////////////////////////////////////////////////////////////
424 // Helper function for scanning a stream
425 // c = next character, pass it to the next call of the function
427 template <typename TFile, typename TString, typename TChar>
429 _stream_appendLine(TFile & file,
435 if (_streamEOF(file)) break;
439 c = _streamGet(file);
442 c = _streamGet(file);
448 c = _streamGet(file);
454 c = _streamGet(file);
457 //____________________________________________________________________________
459 template <typename TFile, typename TChar>
461 _stream_countLine(TFile & file,
467 if (_streamEOF(file)) break;
471 c = _streamGet(file);
474 c = _streamGet(file);
480 c = _streamGet(file);
484 c = _streamGet(file);
488 //____________________________________________________________________________
490 template <typename TFile, typename TChar>
491 inline typename Size<TFile>::Type
492 _stream_skipLine(TFile & file,
496 typename Size<TFile>::Type count = 0;
499 if (_streamEOF(file)) break;
503 c = _streamGet(file);
506 c = _streamGet(file);
512 c = _streamGet(file);
518 c = _streamGet(file);
527 ////////////////////////////////////////////////////////////////////////////
530 //new ones for streams
531 template<typename TFile, typename TChar>
533 _stream_skipWhitespace(TFile& file, TChar& c)
535 if ((c!=' ') && (c != '\t')) return;
536 while (!_streamEOF(file)) {
537 c = _streamGet(file);
538 if ((c!=' ') && (c != '\t')) break;
542 ////////////////////////////////////////////////////////////////////////////
545 template<typename TFile, typename TChar>
547 _stream_readWord(TFile & file, TChar& c)
551 while (!_streamEOF(file)) {
552 c = _streamGet(file);
553 if (!_stream_isLetter(c)) break;
559 ////////////////////////////////////////////////////////////////////////////
561 template<typename TChar>
563 _stream_isLetter(TChar const c)
565 return ((c == 'a') || (c == 'b') || (c == 'c') || (c == 'd') || (c == 'e') ||
566 (c == 'f') || (c == 'g') || (c == 'h') || (c == 'i') || (c == 'j') ||
567 (c == 'k') || (c == 'l') || (c == 'm') || (c == 'n') || (c == 'o') ||
568 (c == 'p') || (c == 'q') || (c == 'r') || (c == 's') || (c == 't') ||
569 (c == 'u') || (c == 'v') || (c == 'w') || (c == 'x') || (c == 'y') ||
570 (c == 'z') || (c == 'A') || (c == 'B') || (c == 'C') || (c == 'D') ||
571 (c == 'E') || (c == 'F') || (c == 'G') || (c == 'H') || (c == 'I') ||
572 (c == 'J') || (c == 'K') || (c == 'L') || (c == 'M') || (c == 'N') ||
573 (c == 'O') || (c == 'P') || (c == 'Q') || (c == 'R') || (c == 'S') ||
574 (c == 'T') || (c == 'U') || (c == 'V') || (c == 'W') || (c == 'X') ||
575 (c == 'Y') || (c == 'Z'));
579 //////////////////////////////////////////////////////////////////////////////
581 //new ones for strings
583 template <typename TString, typename TIter>
584 inline typename Size<TString>::Type
585 _string_skipLine(TString & str,
589 typename Size<TString>::Type count = 0;
590 typename Iterator<TString,Standard>::Type end_it = end(str,Standard());
593 if (it == end_it) break;
617 /////////////////////////////////////////////////////////////////////////
619 template <typename TString1, typename TString2, typename TIter>
621 _string_appendLine(TString1 & str,
625 typename Iterator<TString1,Standard>::Type end_it = end(str,Standard());
628 if (it == end_it) break;
645 appendValue(a_str, getValue(it));
650 ////////////////////////////////////////////////////////////////////////////
652 template<typename TString, typename TIter>
654 _string_skipWhitespace(TString& str, TIter& it)
656 typename Iterator<TString,Standard>::Type end_it = end(str,Standard())-1;
657 while (it != end_it) {
658 if ((*it!=' ') && (*it != '\t')) break;
663 ////////////////////////////////////////////////////////////////////////////
665 template<typename TString, typename TIter>
667 _string_readNumber(TString & str, TIter& it)
670 typename Iterator<TString,Standard>::Type end_it = end(str,Standard())-1;
671 String<char> numstr(getValue(it));
672 while (it != end_it) {
674 if (!_parse_isDigit(*it)) break;
675 append(numstr, getValue(it));
677 return atoi(toCString(numstr));
680 //////////////////////////////////////////////////////////////////////////////
682 } //namespace SEQAN_NAMESPACE_MAIN
684 //////////////////////////////////////////////////////////////////////////////
686 #endif //#ifndef SEQAN_HEADER_...