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 }