OPAL (Object Oriented Parallel Accelerator Library) 2022.1
OPAL
Fieldmap.hpp
Go to the documentation of this file.
1#ifndef CLASSIC_FIELDMAP_ICC
2#define CLASSIC_FIELDMAP_ICC
3
4
5#include <string>
6#include <iostream>
7#include <fstream>
8#include <boost/type_index.hpp>
9#include "Fields/Fieldmap.h"
10
11template<class T>
12bool Fieldmap::interpretLine(std::ifstream & in, T & value, const bool & file_length_known)
13{
14 bool read_all = true;
15 std::string buffer;
16 std::streampos start = in.tellg();
17
18 getLine(in, buffer);
19 if (in.eof() && !file_length_known) {
20 return false;
21 }
22 std::istringstream interpreter(buffer, std::istringstream::in);
23
24 interpreter >> value;
25
26 if (interpreter.rdstate() ^ std::ios_base::eofbit) {
27 in.seekg(start);
28 if (in.eof()) {
30 return false;
31 }
32 std::string expecting(boost::typeindex::type_id<T>().pretty_name());
33 interpretWarning((interpreter.rdstate() ^ std::ios_base::eofbit), read_all, expecting, buffer);
34 }
35 return (!(interpreter.rdstate() ^ std::ios_base::eofbit) && read_all); // eof should not be an error but if not eof
36}
37
38template<class S, class T>
39bool Fieldmap::interpretLine(std::ifstream & in, S & value1, T & value2, const bool & file_length_known)
40{
41 bool read_all = true;
42 std::string buffer;
43 std::streampos start = in.tellg();
44
45 getLine(in, buffer);
46 if (in.eof() && !file_length_known) {
47 return false;
48 }
49 std::istringstream interpreter(buffer, std::istringstream::in);
50
51 interpreter >> value1;
52 if (interpreter.rdstate()) read_all = false;
53
54 interpreter >> value2;
55
56 if (interpreter.rdstate() ^ std::ios_base::eofbit) {
57 in.seekg(start);
58 if (in.eof()) {
60 return false;
61 }
62 std::string expecting(boost::typeindex::type_id<S>().pretty_name());
63 expecting += std::string(" ") + boost::typeindex::type_id<T>().pretty_name();
64 interpretWarning((interpreter.rdstate() ^ std::ios_base::eofbit), read_all, expecting, buffer);
65 }
66 return (!(interpreter.rdstate() ^ std::ios_base::eofbit) && read_all); // eof should not be an error but if not eof
67}
68
69template<class S, class T, class U>
70bool Fieldmap::interpretLine(std::ifstream & in, S & value1, T & value2, U & value3, const bool & file_length_known)
71{
72 bool read_all = true;
73 std::string buffer;
74 std::streampos start = in.tellg();
75
76 getLine(in, buffer);
77 if (in.eof() && !file_length_known) {
78 return false;
79 }
80 std::istringstream interpreter(buffer, std::istringstream::in);
81
82 interpreter >> value1;
83
84 interpreter >> value2;
85 if (interpreter.rdstate()) read_all = false;
86
87 interpreter >> value3;
88
89 if (interpreter.rdstate() ^ std::ios_base::eofbit) {
90 in.seekg(start);
91 if (in.eof()) {
93 return false;
94 }
95 std::string expecting(boost::typeindex::type_id<S>().pretty_name() + std::string(" ") +
96 boost::typeindex::type_id<T>().pretty_name() + std::string(" ") +
97 boost::typeindex::type_id<U>().pretty_name());
98 interpretWarning((interpreter.rdstate() ^ std::ios_base::eofbit), read_all, expecting, buffer);
99 }
100 return (!(interpreter.rdstate() ^ std::ios_base::eofbit) && read_all); // eof should not be an error but if not eof
101}
102
103template<class S, class T, class U, class V>
104bool Fieldmap::interpretLine(std::ifstream & in, S & value1, T & value2, U & value3, V & value4, const bool & file_length_known)
105{
106 bool read_all = true;
107 std::string buffer;
108 std::streampos start = in.tellg();
109
110 getLine(in, buffer);
111 if (in.eof() && !file_length_known) {
112 return false;
113 }
114 std::istringstream interpreter(buffer, std::istringstream::in);
115
116 interpreter >> value1;
117
118 interpreter >> value2;
119
120 interpreter >> value3;
121 if (interpreter.rdstate()) read_all = false;
122
123 interpreter >> value4;
124
125 if (interpreter.rdstate() ^ std::ios_base::eofbit) {
126 in.seekg(start);
127 if (in.eof()) {
129 return false;
130 }
131 std::string expecting(boost::typeindex::type_id<S>().pretty_name() + std::string(" ") +
132 boost::typeindex::type_id<T>().pretty_name() + std::string(" ") +
133 boost::typeindex::type_id<U>().pretty_name() + std::string(" ") +
134 boost::typeindex::type_id<V>().pretty_name());
135 interpretWarning((interpreter.rdstate() ^ std::ios_base::eofbit), read_all, expecting, buffer);
136 }
137 return (!(interpreter.rdstate() ^ std::ios_base::eofbit) && read_all); // eof should not be an error but if not eof
138}
139
140template<class S>
141bool Fieldmap::interpretLine(std::ifstream & in, S & value1, S & value2, S & value3, S & value4, S & value5, S & value6, const bool & file_length_known)
142{
143 bool read_all = true;
144 std::string buffer;
145 std::streampos start = in.tellg();
146
147 getLine(in, buffer);
148 if (in.eof() && !file_length_known) {
149 return false;
150 }
151 std::istringstream interpreter(buffer, std::istringstream::in);
152
153 interpreter >> value1;
154
155 interpreter >> value2;
156
157 interpreter >> value3;
158
159 interpreter >> value4;
160
161 interpreter >> value5;
162 if (interpreter.rdstate()) read_all = false;
163
164 interpreter >> value6;
165
166 if (interpreter.rdstate() ^ std::ios_base::eofbit) {
167 in.seekg(start);
168 if (in.eof()) {
170 return false;
171 }
172 std::string expecting(boost::typeindex::type_id<S>().pretty_name() + std::string(" ") +
173 boost::typeindex::type_id<S>().pretty_name() + std::string(" ") +
174 boost::typeindex::type_id<S>().pretty_name() + std::string(" ") +
175 boost::typeindex::type_id<S>().pretty_name() + std::string(" ") +
176 boost::typeindex::type_id<S>().pretty_name() + std::string(" ") +
177 boost::typeindex::type_id<S>().pretty_name());
178 interpretWarning((interpreter.rdstate() ^ std::ios_base::eofbit), read_all, expecting, buffer);
179 }
180 return (!(interpreter.rdstate() ^ std::ios_base::eofbit) && read_all); // eof should not be an error but if not eof
181}
182
183
184#endif
void missingValuesWarning()
Definition: Fieldmap.cpp:593
void interpretWarning(const std::ios_base::iostate &state, const bool &read_all, const std::string &error_msg, const std::string &found)
Definition: Fieldmap.cpp:574
bool interpretLine(std::ifstream &in, S &value, const bool &file_length_known=true)
void getLine(std::ifstream &in, std::string &buffer)
Definition: Fieldmap.h:121