Stride Reference Manual  1.0
FamilyParser.cpp
Go to the documentation of this file.
1 #include "FamilyParser.h"
2 #include <iostream>
3 #include <stdexcept>
4 #include "util/InstallDirs.h"
5 
6 using namespace stride;
7 using namespace popgen;
8 using namespace std;
9 using namespace util;
10 
11 vector<FamilyConfig> FamilyParser::parseFamilies(string filename) const {
12  // Precond: datdir OK
13  vector<FamilyConfig> result;
14 
15  string line;
16  ifstream myfile((InstallDirs::getDataDir() /= filename).string());
17  if (myfile.is_open()) {
18  while (getline(myfile, line)) {
19  if (line != "") {
20  result.push_back(parseFamily(line));
21  }
22  }
23  myfile.close();
24  } else {
25  throw invalid_argument("In FamilyParser: Invalid file name");
26  }
27 
28  return result;
29 }
30 
32  FamilyConfig result;
33 
34  for (char& c: config) {
35  static uint current_age = 0;
36  static bool encountered_space = false;
37 
38  if (c == ' ') {
39  if (not encountered_space) {
40  result.push_back(current_age);
41  }
42  encountered_space = true;
43  current_age = 0;
44  } else if (&c == &config.back()) {
45  encountered_space = false;
46  current_age *= 10;
47  current_age += uint(c) - uint('0');
48  result.push_back(current_age);
49  current_age = 0;
50  } else if (c >= int('0') && c <= int('9')) {
51  encountered_space = false;
52  current_age *= 10;
53  current_age += uint(c) - uint('0');
54  } else {
55  throw invalid_argument("In FamilyParser: Encountered something that isn't an unsigned integer or a space");
56  }
57  }
58 
59  return result;
60 }
Interface for install directory queries.
unsigned int uint
Definition: FamilyParser.h:12
Time Dependent Person DataType.
Definition: NoBehaviour.h:17
static boost::filesystem::path getDataDir()
Utility method: get path to the directory for data files.
vector< FamilyConfig > parseFamilies(string filename) const
FamilyConfig parseFamily(string config) const
STL namespace.
vector< uint > FamilyConfig
Definition: FamilyParser.h:13