1111#include < list>
1212#include < map>
1313#include < string>
14+ #include < type_traits>
1415#include < unordered_map>
1516
1617// Max line length for reading xml
@@ -116,10 +117,26 @@ inline void serializeHeteroFunc(FILE *file, size_t chunksize,
116117 fprintf (file, " %*s</HeteroFunc>\n " , indent, " " );
117118}
118119
120+ // Overloaded dispatch helpers for serializeFunc2DVector (C++11-compatible
121+ // alternative to if constexpr)
122+ inline void serializeFunc (FILE *file, size_t chunksize,
123+ const flagcxC2cHomoFunc &func, int indent) {
124+ serializeHomoFunc (file, chunksize, func, indent);
125+ }
126+
127+ inline void serializeFunc (FILE *file, size_t chunksize,
128+ const flagcxC2cHeteroFunc &func, int indent) {
129+ serializeHeteroFunc (file, chunksize, func, indent);
130+ }
131+
119132template <typename T>
120133void serializeFunc2DVector (FILE *file, size_t chunksize,
121134 const std::vector<std::vector<T>> &steps,
122135 const char *tagName, int indent = 2 ) {
136+ static_assert (std::is_same<T, flagcxC2cHomoFunc>::value ||
137+ std::is_same<T, flagcxC2cHeteroFunc>::value,
138+ " serializeFunc2DVector only supports flagcxC2cHomoFunc or "
139+ " flagcxC2cHeteroFunc" );
123140 fprintf (file, " %*s<%s>\n " , indent, " " , tagName);
124141 for (const auto &stepVec : steps) {
125142 if (stepVec.size () == 0 ) {
@@ -128,20 +145,34 @@ void serializeFunc2DVector(FILE *file, size_t chunksize,
128145 }
129146 fprintf (file, " %*s<Step>\n " , indent + 2 , " " );
130147 for (const auto &func : stepVec) {
131- if constexpr (std::is_same<T, flagcxC2cHomoFunc>::value) {
132- serializeHomoFunc (file, chunksize, func, indent + 4 );
133- } else if constexpr (std::is_same<T, flagcxC2cHeteroFunc>::value) {
134- serializeHeteroFunc (file, chunksize, func, indent + 4 );
135- }
148+ serializeFunc (file, chunksize, func, indent + 4 );
136149 }
137150 fprintf (file, " %*s</Step>\n " , indent + 2 , " " );
138151 }
139152 fprintf (file, " %*s</%s>\n " , indent, " " , tagName);
140153}
141154
155+ // Overloaded dispatch helpers for readFunc2DVector (C++11-compatible
156+ // alternative to if constexpr)
157+ inline void readFuncStep (FILE *file, size_t chunksize, const char *line,
158+ std::vector<flagcxC2cHomoFunc> &step) {
159+ if (strstr (line, " <HomoFunc>" ))
160+ step.emplace_back (file, chunksize);
161+ }
162+
163+ inline void readFuncStep (FILE *file, size_t chunksize, const char *line,
164+ std::vector<flagcxC2cHeteroFunc> &step) {
165+ if (strstr (line, " <HeteroFunc>" ))
166+ step.emplace_back (file, chunksize);
167+ }
168+
142169template <typename T>
143170std::vector<std::vector<T>> readFunc2DVector (FILE *file, size_t chunksize,
144171 const char *tagName) {
172+ static_assert (std::is_same<T, flagcxC2cHomoFunc>::value ||
173+ std::is_same<T, flagcxC2cHeteroFunc>::value,
174+ " readFunc2DVector only supports flagcxC2cHomoFunc or "
175+ " flagcxC2cHeteroFunc" );
145176 std::vector<std::vector<T>> result;
146177 char line[LINE_LEN ];
147178
@@ -161,13 +192,7 @@ std::vector<std::vector<T>> readFunc2DVector(FILE *file, size_t chunksize,
161192 while (fgets (line, sizeof (line), file)) {
162193 if (strstr (line, " </Step>" ))
163194 break ;
164- if constexpr (std::is_same<T, flagcxC2cHomoFunc>::value) {
165- if (strstr (line, " <HomoFunc>" ))
166- step.emplace_back (file, chunksize);
167- } else if constexpr (std::is_same<T, flagcxC2cHeteroFunc>::value) {
168- if (strstr (line, " <HeteroFunc>" ))
169- step.emplace_back (file, chunksize);
170- }
195+ readFuncStep (file, chunksize, line, step);
171196 }
172197 result.push_back (step);
173198 }
0 commit comments