|
1 /* -*- C++ -*- |
|
2 * src/lemon/bits/item_reader.h - Part of LEMON, a generic C++ optimization library |
|
3 * |
|
4 * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
|
5 * (Egervary Research Group on Combinatorial Optimization, EGRES). |
|
6 * |
|
7 * Permission to use, modify and distribute this software is granted |
|
8 * provided that this copyright notice appears in all copies. For |
|
9 * precise terms see the accompanying LICENSE file. |
|
10 * |
|
11 * This software is provided "AS IS" with no warranty of any kind, |
|
12 * express or implied, and with no claim as to its suitability for any |
|
13 * purpose. |
|
14 * |
|
15 */ |
|
16 |
|
17 /// \ingroup io_group |
|
18 /// \file |
|
19 /// \brief Item writer bits for lemon output. |
|
20 |
|
21 #ifndef LEMON_BITS_ITEM_WRITER_H |
|
22 #define LEMON_BITS_ITEM_WRITER_H |
|
23 |
|
24 #include <iostream> |
|
25 #include <string> |
|
26 |
|
27 #include <vector> |
|
28 #include <deque> |
|
29 #include <list> |
|
30 #include <set> |
|
31 |
|
32 namespace lemon { |
|
33 |
|
34 template <typename Value> |
|
35 class DefaultWriter; |
|
36 |
|
37 /// \ingroup io_group |
|
38 /// \brief Writer class for quoted strings. |
|
39 /// |
|
40 /// Writer class for quoted strings. It can process the escape |
|
41 /// sequences in the string. |
|
42 /// \author Balazs Dezso |
|
43 class QuotedStringWriter { |
|
44 public: |
|
45 typedef std::string Value; |
|
46 |
|
47 /// \brief Constructor for the writer. |
|
48 /// |
|
49 /// Constructor for the writer. If the given parameter is true |
|
50 /// the writer creates escape sequences from special characters. |
|
51 QuotedStringWriter(bool _escaped = true) : escaped(_escaped) {} |
|
52 |
|
53 /// \brief Writes a quoted string to the given stream. |
|
54 /// |
|
55 /// Writes a quoted string to the given stream. |
|
56 void write(std::ostream& os, const std::string& value) { |
|
57 os << "\""; |
|
58 if (escaped) { |
|
59 std::ostringstream ls; |
|
60 for (int i = 0; i < (int)value.size(); ++i) { |
|
61 writeEscape(ls, value[i]); |
|
62 } |
|
63 os << ls.str(); |
|
64 } else { |
|
65 os << value; |
|
66 } |
|
67 os << "\""; |
|
68 } |
|
69 |
|
70 private: |
|
71 |
|
72 static void writeEscape(std::ostream& os, char c) { |
|
73 switch (c) { |
|
74 case '\\': |
|
75 os << "\\\\"; |
|
76 return; |
|
77 case '\"': |
|
78 os << "\\\""; |
|
79 return; |
|
80 case '\'': |
|
81 os << "\\\'"; |
|
82 return; |
|
83 case '\?': |
|
84 os << "\\\?"; |
|
85 return; |
|
86 case '\a': |
|
87 os << "\\a"; |
|
88 return; |
|
89 case '\b': |
|
90 os << "\\b"; |
|
91 return; |
|
92 case '\f': |
|
93 os << "\\f"; |
|
94 return; |
|
95 case '\r': |
|
96 os << "\\r"; |
|
97 return; |
|
98 case '\n': |
|
99 os << "\\n"; |
|
100 return; |
|
101 case '\t': |
|
102 os << "\\t"; |
|
103 return; |
|
104 case '\v': |
|
105 os << "\\v"; |
|
106 return; |
|
107 default: |
|
108 if (c < 0x20) { |
|
109 os << '\\' << std::oct << (int)c; |
|
110 } else { |
|
111 os << c; |
|
112 } |
|
113 return; |
|
114 } |
|
115 } |
|
116 private: |
|
117 bool escaped; |
|
118 }; |
|
119 |
|
120 /// \ingroup io_group |
|
121 /// |
|
122 /// \brief Writer for standard containers. |
|
123 /// |
|
124 /// Writer for each iterable standard containers. The representation |
|
125 /// of the container is the values enumerated between an open and a |
|
126 /// close parse. |
|
127 /// |
|
128 /// \author Balazs Dezso |
|
129 template < |
|
130 typename _Container, |
|
131 typename _ItemWriter = DefaultWriter<typename _Container::value_type> |
|
132 > |
|
133 class IterableWriter { |
|
134 public: |
|
135 typedef _Container Value; |
|
136 typedef _ItemWriter ItemWriter; |
|
137 |
|
138 private: |
|
139 |
|
140 ItemWriter item_writer; |
|
141 |
|
142 public: |
|
143 |
|
144 /// \brief Writes the values of the container to the given stream. |
|
145 /// |
|
146 /// Writes the values of the container to the given stream. |
|
147 void write(std::ostream& os, const Value& value) const { |
|
148 typename Value::const_iterator it; |
|
149 os << '('; |
|
150 for (it = value.begin(); it != value.end(); ++it) { |
|
151 item_writer.write(os, *it); |
|
152 os << ' '; |
|
153 } |
|
154 os << ')'; |
|
155 } |
|
156 |
|
157 }; |
|
158 |
|
159 /// \ingroup io_group |
|
160 /// |
|
161 /// \brief The default item writer template class. |
|
162 /// |
|
163 /// The default item writer template class. If some section writer |
|
164 /// needs to write a value to the stream it will give the default way for it. |
|
165 /// |
|
166 /// \author Balazs Dezso |
|
167 template <typename _Value> |
|
168 class DefaultWriter { |
|
169 public: |
|
170 /// The value type. |
|
171 typedef _Value Value; |
|
172 /// \brief Writes the value to the given stream. |
|
173 /// |
|
174 /// Writes the value to the given stream. |
|
175 void write(std::ostream& os, const Value& value) const { |
|
176 os << value; |
|
177 } |
|
178 }; |
|
179 |
|
180 template <typename Item> |
|
181 class DefaultWriter<std::vector<Item> > |
|
182 : public IterableWriter<std::vector<Item> > {}; |
|
183 |
|
184 template <typename Item> |
|
185 class DefaultWriter<std::deque<Item> > |
|
186 : public IterableWriter<std::deque<Item> > {}; |
|
187 |
|
188 template <typename Item> |
|
189 class DefaultWriter<std::list<Item> > |
|
190 : public IterableWriter<std::list<Item> > {}; |
|
191 |
|
192 template <typename Item> |
|
193 class DefaultWriter<std::set<Item> > |
|
194 : public IterableWriter<std::set<Item> > {}; |
|
195 |
|
196 template <typename Item> |
|
197 class DefaultWriter<std::multiset<Item> > |
|
198 : public IterableWriter<std::multiset<Item> > {}; |
|
199 |
|
200 /// \brief Standard WriterTraits for the section writers. |
|
201 /// |
|
202 /// Standard WriterTraits for the section writers. |
|
203 /// It defines standard writing method for all type of value. |
|
204 /// \author Balazs Dezso |
|
205 struct DefaultWriterTraits { |
|
206 |
|
207 template <typename _Value> |
|
208 struct Writer : DefaultWriter<_Value> {}; |
|
209 |
|
210 }; |
|
211 |
|
212 } |
|
213 |
|
214 #endif |