Skip to content

Commit 3b3018c

Browse files
authored
Merge pull request #97 from althonos/stream-load
Refactor the parsers for better compatibility and memory usage
2 parents 4ca7510 + f6892a9 commit 3b3018c

33 files changed

+157
-417
lines changed

include/FormatHandling/BaseFormatHandler.h

+32-1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
#include "Alignment/Alignment.h"
3434
#include "reportsystem.h"
35+
#include "utils.h"
3536

3637
#include <iomanip>
3738

@@ -90,7 +91,37 @@ class BaseFormatHandler {
9091
\return <b> Alignment</b> loaded with the information of the file. \n
9192
<b> nullptr</b> if there was any error.
9293
*/
93-
virtual Alignment *LoadAlignment(const std::string &filename) = 0;
94+
virtual Alignment *LoadAlignment(const std::string &filename) {
95+
Alignment* alignment;
96+
std::ifstream file;
97+
98+
file.open(filename, std::ifstream::in);
99+
if(!utils::checkFile(file))
100+
return nullptr;
101+
102+
alignment = LoadAlignment(file);
103+
if (alignment != nullptr) {
104+
/* Alignment title may be set by the format handler, dependending on
105+
* the alignment format, so it should only be set here if there was
106+
* none parsed already.
107+
*/
108+
if (alignment->filename.empty()) {
109+
alignment->filename.append(filename);
110+
alignment->filename.append(";");
111+
}
112+
}
113+
114+
file.close();
115+
return alignment;
116+
}
117+
118+
/**
119+
\brief Function to load a file in the current format and return an alignment object.
120+
\param filename Filename of the file to load.
121+
\return <b> Alignment</b> loaded with the information of the file. \n
122+
<b> nullptr</b> if there was any error.
123+
*/
124+
virtual Alignment *LoadAlignment(std::istream &file) = 0;
94125

95126
/**
96127
\brief Function to save a \link Alignment \endlink to a file.

include/FormatHandling/clustal_state.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class clustal_state : public BaseFormatHandler {
4545

4646
int CheckAlignment(std::istream *origin) override;
4747

48-
Alignment *LoadAlignment(const std::string &filename) override;
48+
Alignment *LoadAlignment(std::istream& stream) override;
4949

5050
bool SaveAlignment(const Alignment &alignment, std::ostream *output) override;
5151

include/FormatHandling/fasta_m10_state.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class fasta_m10_state : public BaseFormatHandler {
4646

4747
int CheckAlignment(std::istream *origin) override;
4848

49-
Alignment *LoadAlignment(const std::string &filename) override;
49+
Alignment *LoadAlignment(std::istream& stream) override;
5050

5151
bool SaveAlignment(const Alignment &alignment, std::ostream *output) override;
5252

include/FormatHandling/fasta_state.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class fasta_state : public BaseFormatHandler {
4646

4747
int CheckAlignment(std::istream *origin) override;
4848

49-
Alignment *LoadAlignment(const std::string &filename) override;
49+
Alignment *LoadAlignment(std::istream& stream) override;
5050

5151
bool SaveAlignment(const Alignment &alignment, std::ostream *output) override;
5252

include/FormatHandling/htmlreport_state.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class htmlreport_state : public BaseFormatHandler {
4646

4747
int CheckAlignment(std::istream *origin) override;
4848

49-
Alignment *LoadAlignment(const std::string &filename) override;
49+
Alignment *LoadAlignment(std::istream& stream) override;
5050

5151
bool SaveAlignment(const Alignment &alignment, std::ostream *output) override;
5252

include/FormatHandling/mega_interleaved_state.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class mega_interleaved_state : public BaseFormatHandler {
4646

4747
int CheckAlignment(std::istream *origin) override;
4848

49-
Alignment *LoadAlignment(const std::string &filename) override;
49+
Alignment *LoadAlignment(std::istream& stream) override;
5050

5151
bool SaveAlignment(const Alignment &alignment, std::ostream *output) override;
5252

include/FormatHandling/mega_sequential_state.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class mega_sequential_state : public BaseFormatHandler {
4646

4747
int CheckAlignment(std::istream *origin) override;
4848

49-
Alignment *LoadAlignment(const std::string &filename) override;
49+
Alignment *LoadAlignment(std::istream& stream) override;
5050

5151
bool SaveAlignment(const Alignment &alignment, std::ostream *output) override;
5252

include/FormatHandling/nexus_m10_state.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class nexus_m10_state : public BaseFormatHandler {
4646

4747
int CheckAlignment(std::istream *origin) override;
4848

49-
Alignment *LoadAlignment(const std::string &filename) override;
49+
Alignment *LoadAlignment(std::istream& stream) override;
5050

5151
bool SaveAlignment(const Alignment &alignment, std::ostream *output) override;
5252

include/FormatHandling/nexus_state.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class nexus_state : public BaseFormatHandler {
4646

4747
int CheckAlignment(std::istream *origin) override;
4848

49-
Alignment *LoadAlignment(const std::string &filename) override;
49+
Alignment *LoadAlignment(std::istream& stream) override;
5050

5151
bool SaveAlignment(const Alignment &alignment, std::ostream *output) override;
5252

include/FormatHandling/phylip32_m10_state.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class phylip32_m10_state : public BaseFormatHandler {
4646

4747
int CheckAlignment(std::istream *origin) override;
4848

49-
Alignment *LoadAlignment(const std::string &filename) override;
49+
Alignment *LoadAlignment(std::istream& stream) override;
5050

5151
bool SaveAlignment(const Alignment &alignment, std::ostream *output) override;
5252

include/FormatHandling/phylip32_state.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class phylip32_state : public BaseFormatHandler {
4646

4747
int CheckAlignment(std::istream *origin) override;
4848

49-
Alignment *LoadAlignment(const std::string &filename) override;
49+
Alignment *LoadAlignment(std::istream& stream) override;
5050

5151
bool SaveAlignment(const Alignment &alignment, std::ostream *output) override;
5252

include/FormatHandling/phylip40_m10_state.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class phylip40_m10_state : public BaseFormatHandler {
4646

4747
int CheckAlignment(std::istream *origin) override;
4848

49-
Alignment *LoadAlignment(const std::string &filename) override;
49+
Alignment *LoadAlignment(std::istream& stream) override;
5050

5151
bool SaveAlignment(const Alignment &alignment, std::ostream *output) override;
5252

include/FormatHandling/phylip40_state.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class phylip40_state : public BaseFormatHandler {
4646

4747
int CheckAlignment(std::istream *origin) override;
4848

49-
Alignment *LoadAlignment(const std::string &filename) override;
49+
Alignment *LoadAlignment(std::istream& stream) override;
5050

5151
bool SaveAlignment(const Alignment &alignment, std::ostream *output) override;
5252

include/FormatHandling/phylip_paml_m10_state.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class phylip_paml_m10_state : public BaseFormatHandler {
4646

4747
int CheckAlignment(std::istream *origin) override;
4848

49-
Alignment *LoadAlignment(const std::string &filename) override;
49+
Alignment *LoadAlignment(std::istream& stream) override;
5050

5151
bool SaveAlignment(const Alignment &alignment, std::ostream *output) override;
5252

include/FormatHandling/phylip_paml_state.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class phylip_paml_state : public BaseFormatHandler {
4646

4747
int CheckAlignment(std::istream *origin) override;
4848

49-
Alignment *LoadAlignment(const std::string &filename) override;
49+
Alignment *LoadAlignment(std::istream& stream) override;
5050

5151
bool SaveAlignment(const Alignment &alignment, std::ostream *output) override;
5252

include/FormatHandling/pir_state.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class pir_state : public BaseFormatHandler {
4646

4747
int CheckAlignment(std::istream *origin) override;
4848

49-
Alignment *LoadAlignment(const std::string &filename) override;
49+
Alignment *LoadAlignment(std::istream& stream) override;
5050

5151
bool SaveAlignment(const Alignment &alignment, std::ostream *output) override;
5252

include/utils.h

+1-14
Original file line numberDiff line numberDiff line change
@@ -254,19 +254,6 @@ namespace utils {
254254
*/
255255
bool checkFile(std::ifstream &file);
256256

257-
/**
258-
\brief Read a new line from current input stream.\n
259-
This function is better than standard one
260-
since cares of operative system compatibility.\n
261-
It is useful as well because removes tabs and blank spaces
262-
at lines at beginning/ending.\n
263-
\param file ifstream to read line from.
264-
\return \n
265-
Line that has been read or
266-
nullptr if there is nothing to read.\n
267-
*/
268-
char *readLine(std::ifstream &file);
269-
270257
/**
271258
\brief Read a new line from current input stream.\n
272259
This function is better than standard one
@@ -278,7 +265,7 @@ namespace utils {
278265
nullptr if there is nothing to read.\n
279266
Line that has been read.
280267
*/
281-
char *readLine(std::istream &file);
268+
char *readLine(std::istream &file, std::string &buffer);
282269

283270
/**
284271
\brief Remove all content surrounded by ("") or ([]).\n

source/FormatHandling/clustal_state.cpp

+12-49
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,16 @@ int clustal_state::CheckAlignment(std::istream* origin)
3939
origin->seekg(0);
4040
origin->clear();
4141
char *firstWord = nullptr, *line = nullptr;
42-
42+
std::string buffer;
4343

4444
/* Read first valid line in a safer way */
4545
do {
46-
delete[] line;
47-
line = utils::readLine(*origin);
46+
line = utils::readLine(*origin, buffer);
4847
} while ((line == nullptr) && (!origin->eof()));
4948

5049
/* If the file end is reached without a valid line, warn about it */
5150
if (origin->eof())
5251
{
53-
delete [] line;
5452
return false;
5553
}
5654

@@ -60,33 +58,22 @@ int clustal_state::CheckAlignment(std::istream* origin)
6058
/* Clustal Format */
6159
if((!strcmp(firstWord, "CLUSTAL")) || (!strcmp(firstWord, "clustal")))
6260
{
63-
delete [] line;
6461
return 1;
6562
}
66-
67-
delete[] line;
6863

6964
return 0;
7065
}
7166

72-
Alignment* clustal_state::LoadAlignment(const std::string &filename)
67+
Alignment* clustal_state::LoadAlignment(std::istream &file)
7368
{
7469
Alignment* alignment = new Alignment();
7570
int i, seqLength, pos, firstBlock;
7671
char *str, *line = nullptr;
77-
std::ifstream file;
78-
file.open(filename, std::ifstream::in);
79-
80-
/* Store some details about input file to be used in posterior format
81-
* conversions */
82-
// alignment.filename.append("!Title ");
83-
alignment->filename.append(filename);
84-
alignment->filename.append(";");
72+
std::string buffer;
8573

8674
/* The first valid line corresponding to CLUSTAL label is ignored */
8775
do {
88-
delete [] line;
89-
line = utils::readLine(file);
76+
line = utils::readLine(file, buffer);
9077
} while ((line == nullptr) && (!file.eof()));
9178

9279
/* If the file end is reached without a valid line, warn about it */
@@ -95,12 +82,8 @@ Alignment* clustal_state::LoadAlignment(const std::string &filename)
9582

9683
/* Ignore blank lines before first sequence block starts */
9784
while(!file.eof()) {
98-
99-
/* Deallocate previously used dynamic memory */
100-
delete [] line;
101-
10285
/* Read lines in safe way */
103-
line = utils::readLine(file);
86+
line = utils::readLine(file, buffer);
10487

10588
if (line != nullptr)
10689
break;
@@ -130,15 +113,10 @@ Alignment* clustal_state::LoadAlignment(const std::string &filename)
130113
break;
131114
alignment->numberOfSequences++;
132115

133-
/* Deallocate previously used dynamic memory */
134-
delete [] line;
135-
136116
/* Read lines in safe way */
137-
line = utils::readLine(file);
117+
line = utils::readLine(file, buffer);
138118
}
139119

140-
delete [] line;
141-
142120
/* Finish to preprocess the input file. */
143121
file.clear();
144122
file.seekg(0);
@@ -148,19 +126,16 @@ Alignment* clustal_state::LoadAlignment(const std::string &filename)
148126
alignment->sequences = new std::string[alignment->numberOfSequences];
149127

150128
/* Read the title line and store it */
151-
line = utils::readLine(file);
129+
line = utils::readLine(file, buffer);
152130
if (line == nullptr)
153131
return nullptr;
154132
alignment->alignmentInfo.append(line, strlen(line));
155133

156134
/* Ignore blank lines before first sequence block starts */
157135
while(!file.eof()) {
158136

159-
/* Deallocate previously used dynamic memory */
160-
delete [] line;
161-
162137
/* Read lines in safe way */
163-
line = utils::readLine(file);
138+
line = utils::readLine(file, buffer);
164139

165140
if (line != nullptr)
166141
break;
@@ -181,7 +156,7 @@ Alignment* clustal_state::LoadAlignment(const std::string &filename)
181156
if (i == 0)
182157
firstBlock = false;
183158
/* Read current line and analyze it*/
184-
line = utils::readLine(file);
159+
line = utils::readLine(file, buffer);
185160
continue;
186161
}
187162

@@ -196,11 +171,8 @@ Alignment* clustal_state::LoadAlignment(const std::string &filename)
196171
if (pos == seqLength) {
197172
firstBlock = false;
198173

199-
/* Deallocate dinamic memory if it has been used before */
200-
delete [] line;
201-
202174
/* Read current line and analyze it*/
203-
line = utils::readLine(file);
175+
line = utils::readLine(file, buffer);
204176

205177
continue;
206178
}
@@ -220,19 +192,10 @@ Alignment* clustal_state::LoadAlignment(const std::string &filename)
220192
i = (i + 1) % alignment->numberOfSequences;
221193
}
222194

223-
/* Deallocate dinamic memory if it has been used before */
224-
delete [] line;
225-
226195
/* Read current line and analyze it*/
227-
line = utils::readLine(file);
196+
line = utils::readLine(file, buffer);
228197
}
229198

230-
/* Close the input file */
231-
file.close();
232-
233-
/* Deallocate dinamic memory */
234-
delete [] line;
235-
236199
/* Check the matrix's content */
237200
alignment->fillMatrices(true);
238201
alignment->originalNumberOfSequences = alignment->numberOfSequences;

source/FormatHandling/fasta_m10_state.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ int fasta_m10_state::CheckAlignment(std::istream* origin)
3838
return 0;
3939
}
4040

41-
Alignment* fasta_m10_state::LoadAlignment(const std::string &filename)
41+
Alignment* fasta_m10_state::LoadAlignment(std::istream &file)
4242
{
4343
return nullptr;
4444
}

0 commit comments

Comments
 (0)