-
Notifications
You must be signed in to change notification settings - Fork 0
/
mdp_factory.hpp
73 lines (68 loc) · 2.29 KB
/
mdp_factory.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#ifndef MDP_FACTORY_HPP
#define MDP_FACTORY_HPP
/*
* =====================================================================================
*
* Filename: mdp_factory.hpp
*
* Description: MDP factory function
*
* Version: 1.0
* Created: 12/09/14 10:05:43
* Revision: none
* Compiler: gcc
*
* Author: Dejun Lin (DL), [email protected]
* Organization: Department of Biochemistry and Biophysics, Medical Center, University of Rochester
*
* =====================================================================================
*/
#include <map>
#include <functional>
#include "typedefs.hpp"
#include "mdp.hpp"
#include "gmxmdp.hpp"
#include "fileio.hpp"
using namespace std;
typedef map<string, function<pMDP(const string&)>> Tsuffix2MDP;
static const Tsuffix2MDP suffix2MDP {
{"mdp", GMXMDP::CreateMDP},
};
//! This is the MDP factory function that creates pointers to new
// MDP instances based on the combination of file name prefixes and
// suffixes. The supported suffixes must exist in the map type
// suffix2mdp
template < class PMDP >
typename std::enable_if<is_pointer<PMDP>::value, vector<PMDP>>::type
CreateMDPs(const vector<string>& MDPprefixes,
const vector<string>& MDPsuffixes,
const map<string, function<PMDP(const string&)>>& suffix2mdp)
{
using Tmap = const map<string, function<PMDP(const string&)>>;
using Tmapciterator = typename Tmap::const_iterator;
//Do sanity check to see if all the input types of MDP supported
for(const auto& MDPsuffix : MDPsuffixes) {
const Tmapciterator it = suffix2mdp.find(MDPsuffix);
if(it == suffix2mdp.end()) {
throw(MDP_Factory_Exception("MDP file with suffix '"+MDPsuffix+"' not supported"));
}
}
vector<PMDP> ans;
//Here we loop over all the combination of prefixes and suffixes and
//create MDPs
for(const auto& MDPprefix : MDPprefixes) {
for(const auto& MDPsuffix : MDPsuffixes) {
const string fmdp = MDPprefix+"."+MDPsuffix;
try {
// check if the file exists
// if not, a FILEIO_Exception will be fired
fileio fio(fmdp, fstream::in, false, 0, 1, MAXNLINE, ";#@");
} catch (FILEIO_Exception& fioex) {
continue;
}
ans.emplace_back( suffix2mdp.find(MDPsuffix)->second(fmdp) );
}
}
return ans;
}
#endif