The graph adadptors can be alteration observed.
In most cases it uses the adapted graph alteration notifiers.
Only special case is now the UndirGraphAdaptor, where
we have to proxy the signals from the graph.
The SubBidirGraphAdaptor is removed, because it doest not
gives more feature than the EdgeSubGraphAdaptor<UndirGraphAdaptor<Graph>>.
The ResGraphAdaptor is based on this composition.
3 * This file is a part of LEMON, a generic C++ optimization library
5 * Copyright (C) 2003-2006
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
9 * Permission to use, modify and distribute this software is granted
10 * provided that this copyright notice appears in all copies. For
11 * precise terms see the accompanying LICENSE file.
13 * This software is provided "AS IS" with no warranty of any kind,
14 * express or implied, and with no claim as to its suitability for any
21 /// \brief Item writer bits for lemon output.
23 #ifndef LEMON_BITS_ITEM_WRITER_H
24 #define LEMON_BITS_ITEM_WRITER_H
36 template <typename Value>
40 /// \brief Writer class for quoted strings.
42 /// Writer class for quoted strings. It can process the escape
43 /// sequences in the string.
44 /// \author Balazs Dezso
45 class QuotedStringWriter {
47 typedef std::string Value;
49 /// \brief Constructor for the writer.
51 /// Constructor for the writer. If the given parameter is true
52 /// the writer creates escape sequences from special characters.
53 QuotedStringWriter(bool _escaped = true) : escaped(_escaped) {}
55 /// \brief Writes a quoted string to the given stream.
57 /// Writes a quoted string to the given stream.
58 void write(std::ostream& os, const std::string& value) const {
61 std::ostringstream ls;
62 for (int i = 0; i < (int)value.size(); ++i) {
63 writeEscape(ls, value[i]);
74 static void writeEscape(std::ostream& os, char c) {
111 os << '\\' << std::oct << (int)c;
123 /// \brief Writer class for quoted char array.
125 /// Writer class for quoted char array. It can process the escape
126 /// sequences in the char array.
127 /// \author Balazs Dezso
128 class QuotedCharArrayWriter {
130 typedef const char* Value;
132 /// \brief Constructor for the writer.
134 /// Constructor for the writer. If the given parameter is true
135 /// the writer creates escape sequences from special characters.
136 QuotedCharArrayWriter(bool _escaped = true) : escaped(_escaped) {}
138 /// \brief Writes a quoted char array to the given stream.
140 /// Writes a quoted char array to the given stream.
141 void write(std::ostream& os, const char* value) const {
142 QuotedStringWriter(escaped).write(os, std::string(value));
152 /// \brief Writer for standard containers.
154 /// Writer for each iterable standard containers. The representation
155 /// of the container is the values enumerated between an open and a
158 /// \author Balazs Dezso
161 typename _ItemWriter = DefaultWriter<typename _Container::value_type>
163 class IterableWriter {
165 typedef _Container Value;
166 typedef _ItemWriter ItemWriter;
170 ItemWriter item_writer;
174 IterableWriter(const ItemWriter& _item_writer = ItemWriter())
175 : item_writer(_item_writer) {}
177 /// \brief Writes the values of the container to the given stream.
179 /// Writes the values of the container to the given stream.
180 void write(std::ostream& os, const Value& value) const {
181 typename Value::const_iterator it;
183 for (it = value.begin(); it != value.end(); ++it) {
184 item_writer.write(os, *it);
194 /// \brief Writer for standard pairs.
196 /// Writer for standard pairs. The representation of a pair is
197 ///\code ( first_value => second_value ) \endcode.
198 /// \author Balazs Dezso
199 template <typename _Pair,
200 typename _FirstWriter =
201 DefaultWriter<typename _Pair::first_type>,
202 typename _SecondWriter =
203 DefaultWriter<typename _Pair::second_type> >
209 typedef _FirstWriter FirstWriter;
210 typedef _SecondWriter SecondWriter;
214 FirstWriter first_writer;
215 SecondWriter second_writer;
219 /// \brief Constructor.
221 /// Constructor for the PairWriter.
222 PairWriter(const FirstWriter& _first_writer = FirstWriter(),
223 const SecondWriter& _second_writer = SecondWriter())
224 : first_writer(_first_writer), second_writer(_second_writer) {}
226 /// \brief Writes the pair from the given stream.
228 /// Writes the pair from the given stream.
229 void write(std::ostream& os, const Value& value) const {
231 first_writer.write(os, value.first);
233 second_writer.write(os, value.second);
241 /// \brief The default item writer template class.
243 /// The default item writer template class. If some section writer
244 /// needs to write a value to the stream it will give the default way for it.
246 /// \author Balazs Dezso
247 template <typename _Value>
248 class DefaultWriter {
251 typedef _Value Value;
252 /// \brief Writes the value to the given stream.
254 /// Writes the value to the given stream.
255 void write(std::ostream& os, const Value& value) const {
261 class DefaultWriter<std::string>
262 : public QuotedStringWriter {};
264 template <int length>
265 class DefaultWriter<char[length]>
266 : public QuotedCharArrayWriter {};
268 template <int length>
269 class DefaultWriter<const char[length]>
270 : public QuotedCharArrayWriter {};
273 class DefaultWriter<char*>
274 : public QuotedCharArrayWriter {};
277 class DefaultWriter<const char*>
278 : public QuotedCharArrayWriter {};
280 template <typename Item>
281 class DefaultWriter<std::vector<Item> >
282 : public IterableWriter<std::vector<Item> > {};
284 template <typename Item>
285 class DefaultWriter<std::deque<Item> >
286 : public IterableWriter<std::deque<Item> > {};
288 template <typename Item>
289 class DefaultWriter<std::list<Item> >
290 : public IterableWriter<std::list<Item> > {};
292 template <typename Item>
293 class DefaultWriter<std::set<Item> >
294 : public IterableWriter<std::set<Item> > {};
296 template <typename Key, typename Value>
297 class DefaultWriter<std::map<Key, Value> >
298 : public IterableWriter<std::map<Key, Value> > {};
300 template <typename Item>
301 class DefaultWriter<std::multiset<Item> >
302 : public IterableWriter<std::multiset<Item> > {};
304 template <typename Key, typename Value>
305 class DefaultWriter<std::multimap<Key, Value> >
306 : public IterableWriter<std::multimap<Key, Value> > {};
308 template <typename First, typename Second>
309 class DefaultWriter<std::pair<First, Second> >
310 : public PairWriter<std::pair<First, Second> > {};
313 /// \brief Standard WriterTraits for the section writers.
315 /// Standard WriterTraits for the section writers.
316 /// It defines standard writing method for all type of value.
317 /// \author Balazs Dezso
318 struct DefaultWriterTraits {
320 template <typename _Value>
321 struct Writer : DefaultWriter<_Value> {
322 typedef DefaultWriter<_Value> Parent;