0
2
0
23
18
| ... | ... |
@@ -458,25 +458,25 @@ |
| 458 | 458 |
DigraphReader(const char* fn, Digraph& digraph) |
| 459 | 459 |
: _is(new std::ifstream(fn)), local_is(true), _digraph(digraph), |
| 460 | 460 |
_use_nodes(false), _use_arcs(false) {}
|
| 461 | 461 |
|
| 462 | 462 |
/// \brief Copy constructor |
| 463 | 463 |
/// |
| 464 | 464 |
/// The copy constructor transfers all data from the other reader, |
| 465 | 465 |
/// therefore the copied reader will not be usable more. |
| 466 | 466 |
DigraphReader(DigraphReader& other) |
| 467 | 467 |
: _is(other._is), local_is(other.local_is), _digraph(other._digraph), |
| 468 | 468 |
_use_nodes(other._use_nodes), _use_arcs(other._use_arcs) {
|
| 469 | 469 |
|
| 470 |
other. |
|
| 470 |
other._is = 0; |
|
| 471 | 471 |
other.local_is = false; |
| 472 | 472 |
|
| 473 | 473 |
_node_index.swap(other._node_index); |
| 474 | 474 |
_arc_index.swap(other._arc_index); |
| 475 | 475 |
|
| 476 | 476 |
_node_maps.swap(other._node_maps); |
| 477 | 477 |
_arc_maps.swap(other._arc_maps); |
| 478 | 478 |
_attributes.swap(other._attributes); |
| 479 | 479 |
|
| 480 | 480 |
_nodes_caption = other._nodes_caption; |
| 481 | 481 |
_arcs_caption = other._arcs_caption; |
| 482 | 482 |
_attributes_caption = other._attributes_caption; |
| ... | ... |
@@ -1069,26 +1069,28 @@ |
| 1069 | 1069 |
} |
| 1070 | 1070 |
} |
| 1071 | 1071 |
|
| 1072 | 1072 |
public: |
| 1073 | 1073 |
|
| 1074 | 1074 |
/// \name Execution of the reader |
| 1075 | 1075 |
/// @{
|
| 1076 | 1076 |
|
| 1077 | 1077 |
/// \brief Start the batch processing |
| 1078 | 1078 |
/// |
| 1079 | 1079 |
/// This function starts the batch processing |
| 1080 | 1080 |
void run() {
|
| 1081 |
|
|
| 1082 | 1081 |
LEMON_ASSERT(_is != 0, "This reader assigned to an other reader"); |
| 1082 |
if (!*_is) {
|
|
| 1083 |
throw DataFormatError("Cannot find file");
|
|
| 1084 |
} |
|
| 1083 | 1085 |
|
| 1084 | 1086 |
bool nodes_done = false; |
| 1085 | 1087 |
bool arcs_done = false; |
| 1086 | 1088 |
bool attributes_done = false; |
| 1087 | 1089 |
std::set<std::string> extra_sections; |
| 1088 | 1090 |
|
| 1089 | 1091 |
line_num = 0; |
| 1090 | 1092 |
readLine(); |
| 1091 | 1093 |
|
| 1092 | 1094 |
while (readSuccess()) {
|
| 1093 | 1095 |
skipSection(); |
| 1094 | 1096 |
try {
|
| ... | ... |
@@ -1151,30 +1153,33 @@ |
| 1151 | 1153 |
throw DataFormatError("Section @attributes not found");
|
| 1152 | 1154 |
} |
| 1153 | 1155 |
|
| 1154 | 1156 |
} |
| 1155 | 1157 |
|
| 1156 | 1158 |
/// @} |
| 1157 | 1159 |
|
| 1158 | 1160 |
}; |
| 1159 | 1161 |
|
| 1160 | 1162 |
/// \relates DigraphReader |
| 1161 | 1163 |
template <typename Digraph> |
| 1162 | 1164 |
DigraphReader<Digraph> digraphReader(std::istream& is, Digraph& digraph) {
|
| 1163 |
|
|
| 1165 |
DigraphReader<Digraph> tmp(is, digraph); |
|
| 1166 |
return tmp; |
|
| 1164 | 1167 |
} |
| 1165 | 1168 |
|
| 1166 | 1169 |
/// \relates DigraphReader |
| 1167 | 1170 |
template <typename Digraph> |
| 1168 | 1171 |
DigraphReader<Digraph> digraphReader(const std::string& fn, |
| 1169 | 1172 |
Digraph& digraph) {
|
| 1170 |
|
|
| 1173 |
DigraphReader<Digraph> tmp(fn, digraph); |
|
| 1174 |
return tmp; |
|
| 1171 | 1175 |
} |
| 1172 | 1176 |
|
| 1173 | 1177 |
/// \relates DigraphReader |
| 1174 | 1178 |
template <typename Digraph> |
| 1175 | 1179 |
DigraphReader<Digraph> digraphReader(const char* fn, Digraph& digraph) {
|
| 1176 |
|
|
| 1180 |
DigraphReader<Digraph> tmp(fn, digraph); |
|
| 1181 |
return tmp; |
|
| 1177 | 1182 |
} |
| 1178 | 1183 |
} |
| 1179 | 1184 |
|
| 1180 | 1185 |
#endif |
| ... | ... |
@@ -186,25 +186,27 @@ |
| 186 | 186 |
return; |
| 187 | 187 |
case '\n': |
| 188 | 188 |
os << "\\n"; |
| 189 | 189 |
return; |
| 190 | 190 |
case '\t': |
| 191 | 191 |
os << "\\t"; |
| 192 | 192 |
return; |
| 193 | 193 |
case '\v': |
| 194 | 194 |
os << "\\v"; |
| 195 | 195 |
return; |
| 196 | 196 |
default: |
| 197 | 197 |
if (c < 0x20) {
|
| 198 |
std::ios::fmtflags flags = os.flags(); |
|
| 198 | 199 |
os << '\\' << std::oct << static_cast<int>(c); |
| 200 |
os.flags(flags); |
|
| 199 | 201 |
} else {
|
| 200 | 202 |
os << c; |
| 201 | 203 |
} |
| 202 | 204 |
return; |
| 203 | 205 |
} |
| 204 | 206 |
} |
| 205 | 207 |
|
| 206 | 208 |
bool requireEscape(const std::string& str) {
|
| 207 | 209 |
if (str.empty() || str[0] == '@') return true; |
| 208 | 210 |
std::istringstream is(str); |
| 209 | 211 |
char c; |
| 210 | 212 |
while (is.get(c)) {
|
| ... | ... |
@@ -234,57 +236,57 @@ |
| 234 | 236 |
|
| 235 | 237 |
/// \ingroup lemon_io |
| 236 | 238 |
/// |
| 237 | 239 |
/// \brief LGF writer for directed graphs |
| 238 | 240 |
/// |
| 239 | 241 |
/// This utility writes an \ref lgf-format "LGF" file. |
| 240 | 242 |
/// |
| 241 | 243 |
/// The writing method does a batch processing. The user creates a |
| 242 | 244 |
/// writer object, then various writing rules can be added to the |
| 243 | 245 |
/// writer, and eventually the writing is executed with the \c run() |
| 244 | 246 |
/// member function. A map writing rule can be added to the writer |
| 245 | 247 |
/// with the \c nodeMap() or \c arcMap() members. An optional |
| 246 |
/// converter parameter can also be added as a standard functor converting from |
|
| 247 |
/// the value type of the map to std::string. If it is set, it will |
|
| 248 |
/// determine how the map's value type is written to the output |
|
| 249 |
/// stream. If the functor is not set, then a default conversion |
|
| 250 |
/// will be used. The \c attribute(), \c node() and \c arc() functions |
|
| 251 |
/// are used to add attribute writing rules. |
|
| 248 |
/// converter parameter can also be added as a standard functor |
|
| 249 |
/// converting from the value type of the map to std::string. If it |
|
| 250 |
/// is set, it will determine how the map's value type is written to |
|
| 251 |
/// the output stream. If the functor is not set, then a default |
|
| 252 |
/// conversion will be used. The \c attribute(), \c node() and \c |
|
| 253 |
/// arc() functions are used to add attribute writing rules. |
|
| 252 | 254 |
/// |
| 253 | 255 |
///\code |
| 254 | 256 |
/// DigraphWriter<Digraph>(std::cout, digraph). |
| 255 | 257 |
/// nodeMap("coordinates", coord_map).
|
| 256 | 258 |
/// nodeMap("size", size).
|
| 257 | 259 |
/// nodeMap("title", title).
|
| 258 | 260 |
/// arcMap("capacity", cap_map).
|
| 259 | 261 |
/// node("source", src).
|
| 260 | 262 |
/// node("target", trg).
|
| 261 | 263 |
/// attribute("caption", caption).
|
| 262 | 264 |
/// run(); |
| 263 | 265 |
///\endcode |
| 264 | 266 |
/// |
| 265 | 267 |
/// |
| 266 | 268 |
/// By default, the writer does not write additional captions to the |
| 267 | 269 |
/// sections, but they can be give as an optional parameter of |
| 268 | 270 |
/// the \c nodes(), \c arcs() or \c |
| 269 | 271 |
/// attributes() functions. |
| 270 | 272 |
/// |
| 271 | 273 |
/// The \c skipNodes() and \c skipArcs() functions forbid the |
| 272 |
/// writing of the sections. If two arc sections should be written to the |
|
| 273 |
/// output, it can be done in two passes, the first pass writes the |
|
| 274 |
/// node section and the first arc section, then the second pass |
|
| 275 |
/// skips the node section and writes just the arc section to the |
|
| 276 |
/// stream. The output stream can be retrieved with the \c ostream() |
|
| 277 |
/// function, hence the second pass can append its output to the output of the |
|
| 278 |
/// |
|
| 274 |
/// writing of the sections. If two arc sections should be written |
|
| 275 |
/// to the output, it can be done in two passes, the first pass |
|
| 276 |
/// writes the node section and the first arc section, then the |
|
| 277 |
/// second pass skips the node section and writes just the arc |
|
| 278 |
/// section to the stream. The output stream can be retrieved with |
|
| 279 |
/// the \c ostream() function, hence the second pass can append its |
|
| 280 |
/// output to the output of the first pass. |
|
| 279 | 281 |
template <typename _Digraph> |
| 280 | 282 |
class DigraphWriter {
|
| 281 | 283 |
public: |
| 282 | 284 |
|
| 283 | 285 |
typedef _Digraph Digraph; |
| 284 | 286 |
TEMPLATE_DIGRAPH_TYPEDEFS(Digraph); |
| 285 | 287 |
|
| 286 | 288 |
private: |
| 287 | 289 |
|
| 288 | 290 |
|
| 289 | 291 |
std::ostream* _os; |
| 290 | 292 |
bool local_os; |
| ... | ... |
@@ -340,25 +342,25 @@ |
| 340 | 342 |
DigraphWriter(const char* fn, Digraph& digraph) |
| 341 | 343 |
: _os(new std::ofstream(fn)), local_os(true), _digraph(digraph), |
| 342 | 344 |
_skip_nodes(false), _skip_arcs(false) {}
|
| 343 | 345 |
|
| 344 | 346 |
/// \brief Copy constructor |
| 345 | 347 |
/// |
| 346 | 348 |
/// The copy constructor transfers all data from the other writer, |
| 347 | 349 |
/// therefore the copied writer will not be usable more. |
| 348 | 350 |
DigraphWriter(DigraphWriter& other) |
| 349 | 351 |
: _os(other._os), local_os(other.local_os), _digraph(other._digraph), |
| 350 | 352 |
_skip_nodes(other._skip_nodes), _skip_arcs(other._skip_arcs) {
|
| 351 | 353 |
|
| 352 |
other. |
|
| 354 |
other._os = 0; |
|
| 353 | 355 |
other.local_os = false; |
| 354 | 356 |
|
| 355 | 357 |
_node_index.swap(other._node_index); |
| 356 | 358 |
_arc_index.swap(other._arc_index); |
| 357 | 359 |
|
| 358 | 360 |
_node_maps.swap(other._node_maps); |
| 359 | 361 |
_arc_maps.swap(other._arc_maps); |
| 360 | 362 |
_attributes.swap(other._attributes); |
| 361 | 363 |
|
| 362 | 364 |
_nodes_caption = other._nodes_caption; |
| 363 | 365 |
_arcs_caption = other._arcs_caption; |
| 364 | 366 |
_attributes_caption = other._attributes_caption; |
| ... | ... |
@@ -708,31 +710,34 @@ |
| 708 | 710 |
/// \brief Gives back the stream of the writer |
| 709 | 711 |
/// |
| 710 | 712 |
/// Gives back the stream of the writer |
| 711 | 713 |
std::ostream& ostream() {
|
| 712 | 714 |
return *_os; |
| 713 | 715 |
} |
| 714 | 716 |
|
| 715 | 717 |
/// @} |
| 716 | 718 |
}; |
| 717 | 719 |
|
| 718 | 720 |
/// \relates DigraphWriter |
| 719 | 721 |
template <typename Digraph> |
| 720 |
DigraphWriter<Digraph> digraphWriter(std::istream& is, Digraph& digraph) {
|
|
| 721 |
return DigraphWriter<Digraph>(is, digraph); |
|
| 722 |
DigraphWriter<Digraph> digraphWriter(std::ostream& os, Digraph& digraph) {
|
|
| 723 |
DigraphWriter<Digraph> tmp(os, digraph); |
|
| 724 |
return tmp; |
|
| 722 | 725 |
} |
| 723 | 726 |
|
| 724 | 727 |
/// \relates DigraphWriter |
| 725 | 728 |
template <typename Digraph> |
| 726 | 729 |
DigraphWriter<Digraph> digraphWriter(const std::string& fn, |
| 727 | 730 |
Digraph& digraph) {
|
| 728 |
|
|
| 731 |
DigraphWriter<Digraph> tmp(fn, digraph); |
|
| 732 |
return tmp; |
|
| 729 | 733 |
} |
| 730 | 734 |
|
| 731 | 735 |
/// \relates DigraphWriter |
| 732 | 736 |
template <typename Digraph> |
| 733 | 737 |
DigraphWriter<Digraph> digraphWriter(const char* fn, Digraph& digraph) {
|
| 734 |
|
|
| 738 |
DigraphWriter<Digraph> tmp(fn, digraph); |
|
| 739 |
return tmp; |
|
| 735 | 740 |
} |
| 736 | 741 |
} |
| 737 | 742 |
|
| 738 | 743 |
#endif |
0 comments (0 inline)