SplitMergePairFileReader.cpp

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2004 CSIRO ICT Centre
00003  *
00004  * $Id: SplitMergePairFileReader.cpp 587 2004-12-03 15:06:33Z nch $
00005  */
00006 
00007 #include <vector>
00008 #include "String.h"
00009 
00010 #include "FileObjectReader.h"
00011 #include "FileHeader.h"
00012 #include "SplitFileReader.h"
00013 #include "SplitMergePairFileReader.h"
00014 
00015 
00016 SplitMergePairFileReader::SplitMergePairFileReader(
00017                                 FileObjectReader * obj,
00018                                 std::vector<String> const & fileNames,
00019                                 bool areLargeFiles)
00020     : SplitFileReader(obj, fileNames, areLargeFiles),
00021       m_next_fp(NULL),
00022       m_current(0),
00023       m_next(0),
00024       m_nextFileName(0)
00025 {
00026 }
00027 
00028 SplitMergePairFileReader::~SplitMergePairFileReader()
00029 {
00030   clear();
00031 }
00032 
00033 void SplitMergePairFileReader::readyNext()
00034 {
00035   if (m_next != 0)
00036   {
00037     m_current = m_next;
00038     fileName = m_nextFileName;
00039     filePtr = m_next_fp;
00040   }
00041 
00042   // open the next file, being careful with the file pointers and names
00043   FILE * tmp_fp = filePtr;
00044   char const * tmpFileName = fileName;
00045   SplitFileReader::open();
00046   m_next_fp = filePtr;
00047   m_nextFileName = fileName;
00048   filePtr = tmp_fp;
00049   fileName = tmpFileName;
00050 
00051   if (!m_finished)
00052   {
00053 
00054     // get the first object from the next file
00055     // assumes there is a point to be read
00056     // note not calling super class read method
00057     m_next = obj->read(m_next_fp);
00058     if (m_next == 0)
00059     {
00060       std::cerr << "Problem in SplitMergePairFileReader::readyNext()" << std::endl;
00061     }
00062   }
00063   else
00064   {
00065     // reset - the end will be determined later
00066     m_finished = false;
00067     m_next_fp = NULL;
00068     m_next = 0;
00069   }
00070 }
00071 
00072 void SplitMergePairFileReader::open()
00073 {
00074   SplitFileReader::open();
00075   readyNext();
00076 }
00077 
00078 void SplitMergePairFileReader::clear()
00079 {
00080   if (m_current != 0)
00081     delete m_current;
00082   if (m_next != 0)
00083     delete m_next;
00084   if (m_next_fp != NULL)
00085     ::fclose(m_next_fp);
00086 
00087   m_current = 0;
00088   m_next = 0;
00089   m_next_fp = NULL;
00090 }
00091 
00092 void SplitMergePairFileReader::reopen()
00093 {
00094   m_fileNum = 0;
00095   m_finished = false;
00096   close();
00097   clear();
00098   open();
00099 }
00100 
00101 Object * SplitMergePairFileReader::read()
00102 {
00103   // return the lower of m_current and m_next
00104   Object * result = 0;
00105 
00106   if (m_current == 0)
00107     m_current = obj->read(filePtr);
00108 
00109   if (m_current == 0)           // current file finished
00110   {
00111     if (m_next == 0)            // no next file
00112     {
00113       m_finished = true;        // now we are finished
00114     }
00115     else                        // get the next file ready
00116     {                           // closing current one first
00117       close();
00118       readyNext();
00119       result = m_current;
00120       m_current = 0;
00121     }
00122   }
00123   else if (m_next == 0)
00124   {
00125     result = m_current;
00126     m_current = 0;
00127   }
00128   else
00129   {
00130     if (m_current->getDec() < m_next->getDec())
00131     {
00132       result = m_current;
00133       m_current = 0;
00134     }
00135     else
00136     {
00137       result = m_next;
00138       m_next = obj->read(m_next_fp);
00139       if (m_next == 0)
00140       {
00141         std::cerr << "Problem in SplitMergePairFileReader::next()" << std::endl;
00142       }
00143     }
00144   }
00145 
00146   return result;
00147 }
Generated on Mon Oct 4 10:39:55 2010 for Matching.kdevelop by  doxygen 1.6.3