bpp-phyl3 3.0.0
IoDAG.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: The Bio++ Development Group
2//
3// SPDX-License-Identifier: CECILL-2.1
4
5#ifndef BPP_PHYL_IO_IODAGRAPH_H
6#define BPP_PHYL_IO_IODAGRAPH_H
7
8
9// From the STL:
10#include <string>
11#include <iostream>
12#include <fstream>
13#include <sstream>
14#include <memory>
15
16#include <Bpp/Exceptions.h>
17#include <Bpp/Io/IoFormat.h>
18
19namespace bpp
20{
24class IODAG :
25 public virtual IOFormat
26{
27protected:
28 struct Element
29 {
30public:
31 std::string content;
32 std::string length;
33 std::string annotation;
34 bool isLeaf;
35
36public:
38 length(),
39 annotation(),
40 isLeaf(false) {}
41 };
42
43public:
44 IODAG() {}
45 virtual ~IODAG() {}
46
47public:
48 virtual const std::string getDataType() const { return "DAG"; }
49};
50
54class IPhyloDAG :
55 public virtual IODAG
56{
57public:
59 virtual ~IPhyloDAG() {}
60
61public:
69 virtual std::unique_ptr<PhyloDAG> readPhyloDAG(const std::string& path) const = 0;
70
78 virtual std::unique_ptr<PhyloDAG> readPhyloDAG(std::istream& in) const = 0;
79};
80
81
86class OPhyloDAG :
87 public virtual IODAG
88{
89public:
91 virtual ~OPhyloDAG() {}
92
93public:
103 virtual void writePhyloDAG(const PhyloDAG& dag, const std::string& path, bool overwrite) const = 0;
104
112 virtual void writePhyloDAG(const PhyloDAG& dag, std::ostream& out) const = 0;
113};
114
120 public virtual IPhyloDAG
121{
122public:
125
126public:
127 std::unique_ptr<PhyloDAG> readPhyloDAG(std::istream& in) const override = 0;
128
129 std::unique_ptr<PhyloDAG> readPhyloDAG(const std::string& path) const override
130 {
131 std::ifstream input(path.c_str(), std::ios::in);
132 if (!input)
133 throw IOException ("AbstractIPhyloDAG::readPhyloDAG(path): failed to read from path " + path);
134 auto dag = readPhyloDAG(input);
135 input.close();
136 return dag;
137 }
138
139 virtual Element getElement(const std::string& elt) const
140 {
141 return Element();
142 }
143};
144
149 public virtual OPhyloDAG
150{
151public:
154
155public:
156 virtual void writePhyloDAG(const PhyloDAG& dag, std::ostream& out) const = 0;
157 virtual void writePhyloDAG(const PhyloDAG& dag, const std::string& path, bool overwrite) const
158 {
159 try
160 {
161 // Open file in specified mode
162
163 std::ofstream output(path.c_str(), overwrite ? (std::ios::out) : (std::ios::out | std::ios::app));
164 if (!output)
165 throw Exception("Problem opening file " + path + "in writePhyloDAG.");
166 writePhyloDAG(dag, output);
167 output.close();
168 }
169 catch (IOException& e)
170 {
171 std::stringstream ss;
172 ss << e.what() << "\nProblem writing dag to file " << path << "\n Is the file path correct and do \
173you have the proper authorizations? ";
174 throw (IOException ( ss.str() ) );
175 }
176 }
177};
178
179
184 public virtual IODAG
185{
186public:
188 virtual ~IMultiPhyloDAG() {}
189
190public:
198 virtual void readPhyloDAGs(const std::string& path, std::vector<std::unique_ptr<PhyloDAG>>& dags) const = 0;
199
207 virtual void readPhyloDAGs(std::istream& in, std::vector<std::unique_ptr<PhyloDAG>>& dags) const = 0;
208};
209
214 public virtual IODAG
215{
216public:
218 virtual ~OMultiPhyloDAG() {}
219
220public:
229 virtual void writePhyloDAGs(
230 const std::vector<const PhyloDAG*>& dags,
231 const std::string& path,
232 bool overwrite) const = 0;
233
241 virtual void writePhyloDAGs(
242 const std::vector<const PhyloDAG*>& dags,
243 std::ostream& out) const = 0;
244};
245
250 public virtual IMultiPhyloDAG
251{
252public:
255
256public:
257 virtual void readPhyloDAGs(std::istream& in, std::vector<std::unique_ptr<PhyloDAG>>& dags) const override = 0;
258
259 virtual void readPhyloDAGs(const std::string& path, std::vector<std::unique_ptr<PhyloDAG>>& dags) const override
260 {
261 std::ifstream input(path.c_str(), std::ios::in);
262 readPhyloDAGs(input, dags);
263 input.close();
264 }
265};
266
271 public virtual OMultiPhyloDAG
272{
273public:
276
277public:
278 virtual void writePhyloDAGs(const std::vector<const PhyloDAG*>& dags, std::ostream& out) const = 0;
279
280 virtual void writePhyloDAGs(const std::vector<const PhyloDAG*>& dags, const std::string& path, bool overwrite) const
281
282 {
283 // Open file in specified mode
284 std::ofstream output(path.c_str(), overwrite ? (std::ios::out) : (std::ios::out | std::ios::app));
285 writePhyloDAGs(dags, output);
286 output.close();
287 }
288};
289} // end of namespace bpp.
290#endif // BPP_PHYL_IO_IODAGRAPH_H
Partial implementation of the IMultiDAG interface.
Definition: IoDAG.h:251
virtual void readPhyloDAGs(std::istream &in, std::vector< std::unique_ptr< PhyloDAG > > &dags) const override=0
Read dags from a stream.
virtual void readPhyloDAGs(const std::string &path, std::vector< std::unique_ptr< PhyloDAG > > &dags) const override
Read dags from a file.
Definition: IoDAG.h:259
virtual ~AbstractIMultiPhyloDAG()
Definition: IoDAG.h:254
Partial implementation of the IDAG interface.
Definition: IoDAG.h:121
std::unique_ptr< PhyloDAG > readPhyloDAG(const std::string &path) const override
Read a DAG from a file.
Definition: IoDAG.h:129
virtual Element getElement(const std::string &elt) const
Definition: IoDAG.h:139
virtual ~AbstractIPhyloDAG()
Definition: IoDAG.h:124
std::unique_ptr< PhyloDAG > readPhyloDAG(std::istream &in) const override=0
Read a DAG from a stream.
Partial implementation of the ODAG interface.
Definition: IoDAG.h:272
virtual void writePhyloDAGs(const std::vector< const PhyloDAG * > &dags, std::ostream &out) const =0
Write dags to a stream.
virtual ~AbstractOMultiPhyloDAG()
Definition: IoDAG.h:275
virtual void writePhyloDAGs(const std::vector< const PhyloDAG * > &dags, const std::string &path, bool overwrite) const
Write dags to a file.
Definition: IoDAG.h:280
Partial implementation of the ODAG interface.
Definition: IoDAG.h:150
virtual ~AbstractOPhyloDAG()
Definition: IoDAG.h:153
virtual void writePhyloDAG(const PhyloDAG &dag, const std::string &path, bool overwrite) const
Write a DAG to a file.
Definition: IoDAG.h:157
virtual void writePhyloDAG(const PhyloDAG &dag, std::ostream &out) const =0
Write a PhyloDAG to a stream.
const char * what() const noexcept override
General interface for multiple trees readers.
Definition: IoDAG.h:185
virtual void readPhyloDAGs(const std::string &path, std::vector< std::unique_ptr< PhyloDAG > > &dags) const =0
Read dags from a file.
virtual ~IMultiPhyloDAG()
Definition: IoDAG.h:188
virtual void readPhyloDAGs(std::istream &in, std::vector< std::unique_ptr< PhyloDAG > > &dags) const =0
Read dags from a stream.
General interface for DAG I/O.
Definition: IoDAG.h:26
virtual ~IODAG()
Definition: IoDAG.h:45
IODAG()
Definition: IoDAG.h:44
virtual const std::string getDataType() const
Definition: IoDAG.h:48
General interface for DAG readers.
Definition: IoDAG.h:56
virtual ~IPhyloDAG()
Definition: IoDAG.h:59
virtual std::unique_ptr< PhyloDAG > readPhyloDAG(const std::string &path) const =0
Read a DAG from a file.
virtual std::unique_ptr< PhyloDAG > readPhyloDAG(std::istream &in) const =0
Read a DAG from a stream.
General interface for tree writers.
Definition: IoDAG.h:215
virtual void writePhyloDAGs(const std::vector< const PhyloDAG * > &dags, const std::string &path, bool overwrite) const =0
Write dags to a file.
virtual void writePhyloDAGs(const std::vector< const PhyloDAG * > &dags, std::ostream &out) const =0
Write dags to a stream.
virtual ~OMultiPhyloDAG()
Definition: IoDAG.h:218
General interface for DAG writers.
Definition: IoDAG.h:88
virtual void writePhyloDAG(const PhyloDAG &dag, std::ostream &out) const =0
Write a PhyloDAG to a stream.
virtual ~OPhyloDAG()
Definition: IoDAG.h:91
virtual void writePhyloDAG(const PhyloDAG &dag, const std::string &path, bool overwrite) const =0
Write a DAG to a file.
Defines the basic types of data flow nodes.
std::string length
Definition: IoDAG.h:32
std::string annotation
Definition: IoDAG.h:33
std::string content
Definition: IoDAG.h:31