gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
arrert.h is now included by core.h (#161)
0 4 0
default
4 files changed with 1 insertions and 3 deletions:
↑ Collapse diff ↑
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_CORE_H
20 20
#define LEMON_CORE_H
21 21

	
22 22
#include <vector>
23 23
#include <algorithm>
24 24

	
25 25
#include <lemon/bits/enable_if.h>
26 26
#include <lemon/bits/traits.h>
27
#include <lemon/assert.h>
27 28

	
28 29
///\file
29 30
///\brief LEMON core utilities.
30 31
///
31 32
///This header file contains core utilities for LEMON.
32 33
///It is automatically included by all graph types, therefore it usually
33 34
///do not have to be included directly.
34 35

	
35 36
namespace lemon {
36 37

	
37 38
  /// \brief Dummy type to make it easier to create invalid iterators.
38 39
  ///
39 40
  /// Dummy type to make it easier to create invalid iterators.
40 41
  /// See \ref INVALID for the usage.
41 42
  struct Invalid {
42 43
  public:
43 44
    bool operator==(Invalid) { return true;  }
44 45
    bool operator!=(Invalid) { return false; }
45 46
    bool operator< (Invalid) { return false; }
46 47
  };
47 48

	
48 49
  /// \brief Invalid iterators.
49 50
  ///
50 51
  /// \ref Invalid is a global type that converts to each iterator
51 52
  /// in such a way that the value of the target iterator will be invalid.
52 53
#ifdef LEMON_ONLY_TEMPLATES
53 54
  const Invalid INVALID = Invalid();
54 55
#else
55 56
  extern const Invalid INVALID;
56 57
#endif
57 58

	
58 59
  /// \addtogroup gutils
59 60
  /// @{
60 61

	
61 62
  ///Create convenience typedefs for the digraph types and iterators
62 63

	
63 64
  ///This \c \#define creates convenient type definitions for the following
64 65
  ///types of \c Digraph: \c Node,  \c NodeIt, \c Arc, \c ArcIt, \c InArcIt,
65 66
  ///\c OutArcIt, \c BoolNodeMap, \c IntNodeMap, \c DoubleNodeMap,
66 67
  ///\c BoolArcMap, \c IntArcMap, \c DoubleArcMap.
67 68
  ///
68 69
  ///\note If the graph type is a dependent type, ie. the graph type depend
69 70
  ///on a template parameter, then use \c TEMPLATE_DIGRAPH_TYPEDEFS()
70 71
  ///macro.
71 72
#define DIGRAPH_TYPEDEFS(Digraph)                                       \
72 73
  typedef Digraph::Node Node;                                           \
73 74
  typedef Digraph::NodeIt NodeIt;                                       \
74 75
  typedef Digraph::Arc Arc;                                             \
75 76
  typedef Digraph::ArcIt ArcIt;                                         \
76 77
  typedef Digraph::InArcIt InArcIt;                                     \
77 78
  typedef Digraph::OutArcIt OutArcIt;                                   \
78 79
  typedef Digraph::NodeMap<bool> BoolNodeMap;                           \
79 80
  typedef Digraph::NodeMap<int> IntNodeMap;                             \
80 81
  typedef Digraph::NodeMap<double> DoubleNodeMap;                       \
81 82
  typedef Digraph::ArcMap<bool> BoolArcMap;                             \
82 83
  typedef Digraph::ArcMap<int> IntArcMap;                               \
83 84
  typedef Digraph::ArcMap<double> DoubleArcMap
84 85

	
85 86
  ///Create convenience typedefs for the digraph types and iterators
86 87

	
87 88
  ///\see DIGRAPH_TYPEDEFS
88 89
  ///
89 90
  ///\note Use this macro, if the graph type is a dependent type,
90 91
  ///ie. the graph type depend on a template parameter.
91 92
#define TEMPLATE_DIGRAPH_TYPEDEFS(Digraph)                              \
92 93
  typedef typename Digraph::Node Node;                                  \
93 94
  typedef typename Digraph::NodeIt NodeIt;                              \
94 95
  typedef typename Digraph::Arc Arc;                                    \
95 96
  typedef typename Digraph::ArcIt ArcIt;                                \
96 97
  typedef typename Digraph::InArcIt InArcIt;                            \
97 98
  typedef typename Digraph::OutArcIt OutArcIt;                          \
98 99
  typedef typename Digraph::template NodeMap<bool> BoolNodeMap;         \
99 100
  typedef typename Digraph::template NodeMap<int> IntNodeMap;           \
100 101
  typedef typename Digraph::template NodeMap<double> DoubleNodeMap;     \
101 102
  typedef typename Digraph::template ArcMap<bool> BoolArcMap;           \
102 103
  typedef typename Digraph::template ArcMap<int> IntArcMap;             \
103 104
  typedef typename Digraph::template ArcMap<double> DoubleArcMap
104 105

	
105 106
  ///Create convenience typedefs for the graph types and iterators
106 107

	
107 108
  ///This \c \#define creates the same convenient type definitions as defined
108 109
  ///by \ref DIGRAPH_TYPEDEFS(Graph) and six more, namely it creates
109 110
  ///\c Edge, \c EdgeIt, \c IncEdgeIt, \c BoolEdgeMap, \c IntEdgeMap,
110 111
  ///\c DoubleEdgeMap.
111 112
  ///
112 113
  ///\note If the graph type is a dependent type, ie. the graph type depend
113 114
  ///on a template parameter, then use \c TEMPLATE_GRAPH_TYPEDEFS()
114 115
  ///macro.
115 116
#define GRAPH_TYPEDEFS(Graph)                                           \
116 117
  DIGRAPH_TYPEDEFS(Graph);                                              \
117 118
  typedef Graph::Edge Edge;                                             \
118 119
  typedef Graph::EdgeIt EdgeIt;                                         \
119 120
  typedef Graph::IncEdgeIt IncEdgeIt;                                   \
120 121
  typedef Graph::EdgeMap<bool> BoolEdgeMap;                             \
121 122
  typedef Graph::EdgeMap<int> IntEdgeMap;                               \
122 123
  typedef Graph::EdgeMap<double> DoubleEdgeMap
123 124

	
124 125
  ///Create convenience typedefs for the graph types and iterators
125 126

	
126 127
  ///\see GRAPH_TYPEDEFS
127 128
  ///
128 129
  ///\note Use this macro, if the graph type is a dependent type,
129 130
  ///ie. the graph type depend on a template parameter.
130 131
#define TEMPLATE_GRAPH_TYPEDEFS(Graph)                                  \
131 132
  TEMPLATE_DIGRAPH_TYPEDEFS(Graph);                                     \
132 133
  typedef typename Graph::Edge Edge;                                    \
133 134
  typedef typename Graph::EdgeIt EdgeIt;                                \
134 135
  typedef typename Graph::IncEdgeIt IncEdgeIt;                          \
135 136
  typedef typename Graph::template EdgeMap<bool> BoolEdgeMap;           \
136 137
  typedef typename Graph::template EdgeMap<int> IntEdgeMap;             \
137 138
  typedef typename Graph::template EdgeMap<double> DoubleEdgeMap
138 139

	
139 140
  /// \brief Function to count the items in a graph.
140 141
  ///
141 142
  /// This function counts the items (nodes, arcs etc.) in a graph.
142 143
  /// The complexity of the function is linear because
143 144
  /// it iterates on all of the items.
144 145
  template <typename Graph, typename Item>
145 146
  inline int countItems(const Graph& g) {
146 147
    typedef typename ItemSetTraits<Graph, Item>::ItemIt ItemIt;
147 148
    int num = 0;
148 149
    for (ItemIt it(g); it != INVALID; ++it) {
149 150
      ++num;
150 151
    }
151 152
    return num;
152 153
  }
153 154

	
154 155
  // Node counting:
155 156

	
156 157
  namespace _core_bits {
157 158

	
158 159
    template <typename Graph, typename Enable = void>
159 160
    struct CountNodesSelector {
160 161
      static int count(const Graph &g) {
161 162
        return countItems<Graph, typename Graph::Node>(g);
162 163
      }
163 164
    };
164 165

	
165 166
    template <typename Graph>
166 167
    struct CountNodesSelector<
167 168
      Graph, typename
168 169
      enable_if<typename Graph::NodeNumTag, void>::type>
169 170
    {
170 171
      static int count(const Graph &g) {
171 172
        return g.nodeNum();
172 173
      }
173 174
    };
174 175
  }
175 176

	
176 177
  /// \brief Function to count the nodes in the graph.
177 178
  ///
178 179
  /// This function counts the nodes in the graph.
179 180
  /// The complexity of the function is <em>O</em>(<em>n</em>), but for some
180 181
  /// graph structures it is specialized to run in <em>O</em>(1).
181 182
  ///
182 183
  /// \note If the graph contains a \c nodeNum() member function and a
183 184
  /// \c NodeNumTag tag then this function calls directly the member
184 185
  /// function to query the cardinality of the node set.
185 186
  template <typename Graph>
186 187
  inline int countNodes(const Graph& g) {
187 188
    return _core_bits::CountNodesSelector<Graph>::count(g);
188 189
  }
189 190

	
190 191
  // Arc counting:
191 192

	
192 193
  namespace _core_bits {
193 194

	
194 195
    template <typename Graph, typename Enable = void>
195 196
    struct CountArcsSelector {
196 197
      static int count(const Graph &g) {
197 198
        return countItems<Graph, typename Graph::Arc>(g);
198 199
      }
199 200
    };
200 201

	
201 202
    template <typename Graph>
202 203
    struct CountArcsSelector<
203 204
      Graph,
204 205
      typename enable_if<typename Graph::ArcNumTag, void>::type>
205 206
    {
206 207
      static int count(const Graph &g) {
207 208
        return g.arcNum();
208 209
      }
209 210
    };
210 211
  }
211 212

	
212 213
  /// \brief Function to count the arcs in the graph.
213 214
  ///
214 215
  /// This function counts the arcs in the graph.
215 216
  /// The complexity of the function is <em>O</em>(<em>m</em>), but for some
216 217
  /// graph structures it is specialized to run in <em>O</em>(1).
217 218
  ///
218 219
  /// \note If the graph contains a \c arcNum() member function and a
Ignore white space 384 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_DFS_H
20 20
#define LEMON_DFS_H
21 21

	
22 22
///\ingroup search
23 23
///\file
24 24
///\brief DFS algorithm.
25 25

	
26 26
#include <lemon/list_graph.h>
27 27
#include <lemon/bits/path_dump.h>
28 28
#include <lemon/core.h>
29 29
#include <lemon/error.h>
30
#include <lemon/assert.h>
31 30
#include <lemon/maps.h>
32 31
#include <lemon/path.h>
33 32

	
34 33
namespace lemon {
35 34

	
36 35
  ///Default traits class of Dfs class.
37 36

	
38 37
  ///Default traits class of Dfs class.
39 38
  ///\tparam GR Digraph type.
40 39
  template<class GR>
41 40
  struct DfsDefaultTraits
42 41
  {
43 42
    ///The type of the digraph the algorithm runs on.
44 43
    typedef GR Digraph;
45 44

	
46 45
    ///\brief The type of the map that stores the predecessor
47 46
    ///arcs of the %DFS paths.
48 47
    ///
49 48
    ///The type of the map that stores the predecessor
50 49
    ///arcs of the %DFS paths.
51 50
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
52 51
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
53 52
    ///Instantiates a PredMap.
54 53

	
55 54
    ///This function instantiates a PredMap.
56 55
    ///\param g is the digraph, to which we would like to define the
57 56
    ///PredMap.
58 57
    static PredMap *createPredMap(const Digraph &g)
59 58
    {
60 59
      return new PredMap(g);
61 60
    }
62 61

	
63 62
    ///The type of the map that indicates which nodes are processed.
64 63

	
65 64
    ///The type of the map that indicates which nodes are processed.
66 65
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
67 66
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
68 67
    ///Instantiates a ProcessedMap.
69 68

	
70 69
    ///This function instantiates a ProcessedMap.
71 70
    ///\param g is the digraph, to which
72 71
    ///we would like to define the ProcessedMap
73 72
#ifdef DOXYGEN
74 73
    static ProcessedMap *createProcessedMap(const Digraph &g)
75 74
#else
76 75
    static ProcessedMap *createProcessedMap(const Digraph &)
77 76
#endif
78 77
    {
79 78
      return new ProcessedMap();
80 79
    }
81 80

	
82 81
    ///The type of the map that indicates which nodes are reached.
83 82

	
84 83
    ///The type of the map that indicates which nodes are reached.
85 84
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
86 85
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
87 86
    ///Instantiates a ReachedMap.
88 87

	
89 88
    ///This function instantiates a ReachedMap.
90 89
    ///\param g is the digraph, to which
91 90
    ///we would like to define the ReachedMap.
92 91
    static ReachedMap *createReachedMap(const Digraph &g)
93 92
    {
94 93
      return new ReachedMap(g);
95 94
    }
96 95

	
97 96
    ///The type of the map that stores the distances of the nodes.
98 97

	
99 98
    ///The type of the map that stores the distances of the nodes.
100 99
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
101 100
    typedef typename Digraph::template NodeMap<int> DistMap;
102 101
    ///Instantiates a DistMap.
103 102

	
104 103
    ///This function instantiates a DistMap.
105 104
    ///\param g is the digraph, to which we would like to define the
106 105
    ///DistMap.
107 106
    static DistMap *createDistMap(const Digraph &g)
108 107
    {
109 108
      return new DistMap(g);
110 109
    }
111 110
  };
112 111

	
113 112
  ///%DFS algorithm class.
114 113

	
115 114
  ///\ingroup search
116 115
  ///This class provides an efficient implementation of the %DFS algorithm.
117 116
  ///
118 117
  ///There is also a \ref dfs() "function-type interface" for the DFS
119 118
  ///algorithm, which is convenient in the simplier cases and it can be
120 119
  ///used easier.
121 120
  ///
122 121
  ///\tparam GR The type of the digraph the algorithm runs on.
123 122
  ///The default value is \ref ListDigraph. The value of GR is not used
124 123
  ///directly by \ref Dfs, it is only passed to \ref DfsDefaultTraits.
125 124
  ///\tparam TR Traits class to set various data types used by the algorithm.
126 125
  ///The default traits class is
127 126
  ///\ref DfsDefaultTraits "DfsDefaultTraits<GR>".
128 127
  ///See \ref DfsDefaultTraits for the documentation of
129 128
  ///a Dfs traits class.
130 129
#ifdef DOXYGEN
131 130
  template <typename GR,
132 131
            typename TR>
133 132
#else
134 133
  template <typename GR=ListDigraph,
135 134
            typename TR=DfsDefaultTraits<GR> >
136 135
#endif
137 136
  class Dfs {
138 137
  public:
139 138

	
140 139
    ///The type of the digraph the algorithm runs on.
141 140
    typedef typename TR::Digraph Digraph;
142 141

	
143 142
    ///\brief The type of the map that stores the predecessor arcs of the
144 143
    ///DFS paths.
145 144
    typedef typename TR::PredMap PredMap;
146 145
    ///The type of the map that stores the distances of the nodes.
147 146
    typedef typename TR::DistMap DistMap;
148 147
    ///The type of the map that indicates which nodes are reached.
149 148
    typedef typename TR::ReachedMap ReachedMap;
150 149
    ///The type of the map that indicates which nodes are processed.
151 150
    typedef typename TR::ProcessedMap ProcessedMap;
152 151
    ///The type of the paths.
153 152
    typedef PredMapPath<Digraph, PredMap> Path;
154 153

	
155 154
    ///The traits class.
156 155
    typedef TR Traits;
157 156

	
158 157
  private:
159 158

	
160 159
    typedef typename Digraph::Node Node;
161 160
    typedef typename Digraph::NodeIt NodeIt;
162 161
    typedef typename Digraph::Arc Arc;
163 162
    typedef typename Digraph::OutArcIt OutArcIt;
164 163

	
165 164
    //Pointer to the underlying digraph.
166 165
    const Digraph *G;
167 166
    //Pointer to the map of predecessor arcs.
168 167
    PredMap *_pred;
169 168
    //Indicates if _pred is locally allocated (true) or not.
170 169
    bool local_pred;
171 170
    //Pointer to the map of distances.
172 171
    DistMap *_dist;
173 172
    //Indicates if _dist is locally allocated (true) or not.
174 173
    bool local_dist;
175 174
    //Pointer to the map of reached status of the nodes.
176 175
    ReachedMap *_reached;
177 176
    //Indicates if _reached is locally allocated (true) or not.
178 177
    bool local_reached;
179 178
    //Pointer to the map of processed status of the nodes.
180 179
    ProcessedMap *_processed;
181 180
    //Indicates if _processed is locally allocated (true) or not.
182 181
    bool local_processed;
183 182

	
184 183
    std::vector<typename Digraph::OutArcIt> _stack;
185 184
    int _stack_head;
186 185

	
187 186
    //Creates the maps if necessary.
188 187
    void create_maps()
189 188
    {
190 189
      if(!_pred) {
191 190
        local_pred = true;
192 191
        _pred = Traits::createPredMap(*G);
193 192
      }
194 193
      if(!_dist) {
195 194
        local_dist = true;
196 195
        _dist = Traits::createDistMap(*G);
197 196
      }
198 197
      if(!_reached) {
199 198
        local_reached = true;
200 199
        _reached = Traits::createReachedMap(*G);
201 200
      }
202 201
      if(!_processed) {
203 202
        local_processed = true;
204 203
        _processed = Traits::createProcessedMap(*G);
205 204
      }
206 205
    }
207 206

	
208 207
  protected:
209 208

	
210 209
    Dfs() {}
211 210

	
212 211
  public:
213 212

	
214 213
    typedef Dfs Create;
215 214

	
216 215
    ///\name Named template parameters
217 216

	
218 217
    ///@{
219 218

	
220 219
    template <class T>
221 220
    struct SetPredMapTraits : public Traits {
222 221
      typedef T PredMap;
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\ingroup lemon_io
20 20
///\file
21 21
///\brief \ref lgf-format "LEMON Graph Format" reader.
22 22

	
23 23

	
24 24
#ifndef LEMON_LGF_READER_H
25 25
#define LEMON_LGF_READER_H
26 26

	
27 27
#include <iostream>
28 28
#include <fstream>
29 29
#include <sstream>
30 30

	
31 31
#include <set>
32 32
#include <map>
33 33

	
34
#include <lemon/assert.h>
35 34
#include <lemon/core.h>
36 35

	
37 36
#include <lemon/lgf_writer.h>
38 37

	
39 38
#include <lemon/concept_check.h>
40 39
#include <lemon/concepts/maps.h>
41 40

	
42 41
namespace lemon {
43 42

	
44 43
  namespace _reader_bits {
45 44

	
46 45
    template <typename Value>
47 46
    struct DefaultConverter {
48 47
      Value operator()(const std::string& str) {
49 48
        std::istringstream is(str);
50 49
        Value value;
51 50
        if (!(is >> value)) {
52 51
          throw FormatError("Cannot read token");
53 52
        }
54 53

	
55 54
        char c;
56 55
        if (is >> std::ws >> c) {
57 56
          throw FormatError("Remaining characters in token");
58 57
        }
59 58
        return value;
60 59
      }
61 60
    };
62 61

	
63 62
    template <>
64 63
    struct DefaultConverter<std::string> {
65 64
      std::string operator()(const std::string& str) {
66 65
        return str;
67 66
      }
68 67
    };
69 68

	
70 69
    template <typename _Item>
71 70
    class MapStorageBase {
72 71
    public:
73 72
      typedef _Item Item;
74 73

	
75 74
    public:
76 75
      MapStorageBase() {}
77 76
      virtual ~MapStorageBase() {}
78 77

	
79 78
      virtual void set(const Item& item, const std::string& value) = 0;
80 79

	
81 80
    };
82 81

	
83 82
    template <typename _Item, typename _Map,
84 83
              typename _Converter = DefaultConverter<typename _Map::Value> >
85 84
    class MapStorage : public MapStorageBase<_Item> {
86 85
    public:
87 86
      typedef _Map Map;
88 87
      typedef _Converter Converter;
89 88
      typedef _Item Item;
90 89

	
91 90
    private:
92 91
      Map& _map;
93 92
      Converter _converter;
94 93

	
95 94
    public:
96 95
      MapStorage(Map& map, const Converter& converter = Converter())
97 96
        : _map(map), _converter(converter) {}
98 97
      virtual ~MapStorage() {}
99 98

	
100 99
      virtual void set(const Item& item ,const std::string& value) {
101 100
        _map.set(item, _converter(value));
102 101
      }
103 102
    };
104 103

	
105 104
    template <typename _Graph, bool _dir, typename _Map,
106 105
              typename _Converter = DefaultConverter<typename _Map::Value> >
107 106
    class GraphArcMapStorage : public MapStorageBase<typename _Graph::Edge> {
108 107
    public:
109 108
      typedef _Map Map;
110 109
      typedef _Converter Converter;
111 110
      typedef _Graph Graph;
112 111
      typedef typename Graph::Edge Item;
113 112
      static const bool dir = _dir;
114 113

	
115 114
    private:
116 115
      const Graph& _graph;
117 116
      Map& _map;
118 117
      Converter _converter;
119 118

	
120 119
    public:
121 120
      GraphArcMapStorage(const Graph& graph, Map& map,
122 121
                         const Converter& converter = Converter())
123 122
        : _graph(graph), _map(map), _converter(converter) {}
124 123
      virtual ~GraphArcMapStorage() {}
125 124

	
126 125
      virtual void set(const Item& item ,const std::string& value) {
127 126
        _map.set(_graph.direct(item, dir), _converter(value));
128 127
      }
129 128
    };
130 129

	
131 130
    class ValueStorageBase {
132 131
    public:
133 132
      ValueStorageBase() {}
134 133
      virtual ~ValueStorageBase() {}
135 134

	
136 135
      virtual void set(const std::string&) = 0;
137 136
    };
138 137

	
139 138
    template <typename _Value, typename _Converter = DefaultConverter<_Value> >
140 139
    class ValueStorage : public ValueStorageBase {
141 140
    public:
142 141
      typedef _Value Value;
143 142
      typedef _Converter Converter;
144 143

	
145 144
    private:
146 145
      Value& _value;
147 146
      Converter _converter;
148 147

	
149 148
    public:
150 149
      ValueStorage(Value& value, const Converter& converter = Converter())
151 150
        : _value(value), _converter(converter) {}
152 151

	
153 152
      virtual void set(const std::string& value) {
154 153
        _value = _converter(value);
155 154
      }
156 155
    };
157 156

	
158 157
    template <typename Value>
159 158
    struct MapLookUpConverter {
160 159
      const std::map<std::string, Value>& _map;
161 160

	
162 161
      MapLookUpConverter(const std::map<std::string, Value>& map)
163 162
        : _map(map) {}
164 163

	
165 164
      Value operator()(const std::string& str) {
166 165
        typename std::map<std::string, Value>::const_iterator it =
167 166
          _map.find(str);
168 167
        if (it == _map.end()) {
169 168
          std::ostringstream msg;
170 169
          msg << "Item not found: " << str;
171 170
          throw FormatError(msg.str());
172 171
        }
173 172
        return it->second;
174 173
      }
175 174
    };
176 175

	
177 176
    template <typename Graph>
178 177
    struct GraphArcLookUpConverter {
179 178
      const Graph& _graph;
180 179
      const std::map<std::string, typename Graph::Edge>& _map;
181 180

	
182 181
      GraphArcLookUpConverter(const Graph& graph,
183 182
                              const std::map<std::string,
184 183
                                             typename Graph::Edge>& map)
185 184
        : _graph(graph), _map(map) {}
186 185

	
187 186
      typename Graph::Arc operator()(const std::string& str) {
188 187
        if (str.empty() || (str[0] != '+' && str[0] != '-')) {
189 188
          throw FormatError("Item must start with '+' or '-'");
190 189
        }
191 190
        typename std::map<std::string, typename Graph::Edge>
192 191
          ::const_iterator it = _map.find(str.substr(1));
193 192
        if (it == _map.end()) {
194 193
          throw FormatError("Item not found");
195 194
        }
196 195
        return _graph.direct(it->second, str[0] == '+');
197 196
      }
198 197
    };
199 198

	
200 199
    inline bool isWhiteSpace(char c) {
201 200
      return c == ' ' || c == '\t' || c == '\v' ||
202 201
        c == '\n' || c == '\r' || c == '\f';
203 202
    }
204 203

	
205 204
    inline bool isOct(char c) {
206 205
      return '0' <= c && c <='7';
207 206
    }
208 207

	
209 208
    inline int valueOct(char c) {
210 209
      LEMON_ASSERT(isOct(c), "The character is not octal.");
211 210
      return c - '0';
212 211
    }
213 212

	
214 213
    inline bool isHex(char c) {
215 214
      return ('0' <= c && c <= '9') ||
216 215
        ('a' <= c && c <= 'z') ||
217 216
        ('A' <= c && c <= 'Z');
218 217
    }
219 218

	
220 219
    inline int valueHex(char c) {
221 220
      LEMON_ASSERT(isHex(c), "The character is not hexadecimal.");
222 221
      if ('0' <= c && c <= '9') return c - '0';
223 222
      if ('a' <= c && c <= 'z') return c - 'a' + 10;
224 223
      return c - 'A' + 10;
225 224
    }
226 225

	
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\ingroup lemon_io
20 20
///\file
21 21
///\brief \ref lgf-format "LEMON Graph Format" writer.
22 22

	
23 23

	
24 24
#ifndef LEMON_LGF_WRITER_H
25 25
#define LEMON_LGF_WRITER_H
26 26

	
27 27
#include <iostream>
28 28
#include <fstream>
29 29
#include <sstream>
30 30

	
31 31
#include <algorithm>
32 32

	
33 33
#include <vector>
34 34
#include <functional>
35 35

	
36
#include <lemon/assert.h>
37 36
#include <lemon/core.h>
38 37
#include <lemon/maps.h>
39 38

	
40 39
#include <lemon/concept_check.h>
41 40
#include <lemon/concepts/maps.h>
42 41

	
43 42
namespace lemon {
44 43

	
45 44
  namespace _writer_bits {
46 45

	
47 46
    template <typename Value>
48 47
    struct DefaultConverter {
49 48
      std::string operator()(const Value& value) {
50 49
        std::ostringstream os;
51 50
        os << value;
52 51
        return os.str();
53 52
      }
54 53
    };
55 54

	
56 55
    template <typename T>
57 56
    bool operator<(const T&, const T&) {
58 57
      throw FormatError("Label map is not comparable");
59 58
    }
60 59

	
61 60
    template <typename _Map>
62 61
    class MapLess {
63 62
    public:
64 63
      typedef _Map Map;
65 64
      typedef typename Map::Key Item;
66 65

	
67 66
    private:
68 67
      const Map& _map;
69 68

	
70 69
    public:
71 70
      MapLess(const Map& map) : _map(map) {}
72 71

	
73 72
      bool operator()(const Item& left, const Item& right) {
74 73
        return _map[left] < _map[right];
75 74
      }
76 75
    };
77 76

	
78 77
    template <typename _Graph, bool _dir, typename _Map>
79 78
    class GraphArcMapLess {
80 79
    public:
81 80
      typedef _Map Map;
82 81
      typedef _Graph Graph;
83 82
      typedef typename Graph::Edge Item;
84 83

	
85 84
    private:
86 85
      const Graph& _graph;
87 86
      const Map& _map;
88 87

	
89 88
    public:
90 89
      GraphArcMapLess(const Graph& graph, const Map& map)
91 90
        : _graph(graph), _map(map) {}
92 91

	
93 92
      bool operator()(const Item& left, const Item& right) {
94 93
        return _map[_graph.direct(left, _dir)] <
95 94
          _map[_graph.direct(right, _dir)];
96 95
      }
97 96
    };
98 97

	
99 98
    template <typename _Item>
100 99
    class MapStorageBase {
101 100
    public:
102 101
      typedef _Item Item;
103 102

	
104 103
    public:
105 104
      MapStorageBase() {}
106 105
      virtual ~MapStorageBase() {}
107 106

	
108 107
      virtual std::string get(const Item& item) = 0;
109 108
      virtual void sort(std::vector<Item>&) = 0;
110 109
    };
111 110

	
112 111
    template <typename _Item, typename _Map,
113 112
              typename _Converter = DefaultConverter<typename _Map::Value> >
114 113
    class MapStorage : public MapStorageBase<_Item> {
115 114
    public:
116 115
      typedef _Map Map;
117 116
      typedef _Converter Converter;
118 117
      typedef _Item Item;
119 118

	
120 119
    private:
121 120
      const Map& _map;
122 121
      Converter _converter;
123 122

	
124 123
    public:
125 124
      MapStorage(const Map& map, const Converter& converter = Converter())
126 125
        : _map(map), _converter(converter) {}
127 126
      virtual ~MapStorage() {}
128 127

	
129 128
      virtual std::string get(const Item& item) {
130 129
        return _converter(_map[item]);
131 130
      }
132 131
      virtual void sort(std::vector<Item>& items) {
133 132
        MapLess<Map> less(_map);
134 133
        std::sort(items.begin(), items.end(), less);
135 134
      }
136 135
    };
137 136

	
138 137
    template <typename _Graph, bool _dir, typename _Map,
139 138
              typename _Converter = DefaultConverter<typename _Map::Value> >
140 139
    class GraphArcMapStorage : public MapStorageBase<typename _Graph::Edge> {
141 140
    public:
142 141
      typedef _Map Map;
143 142
      typedef _Converter Converter;
144 143
      typedef _Graph Graph;
145 144
      typedef typename Graph::Edge Item;
146 145
      static const bool dir = _dir;
147 146

	
148 147
    private:
149 148
      const Graph& _graph;
150 149
      const Map& _map;
151 150
      Converter _converter;
152 151

	
153 152
    public:
154 153
      GraphArcMapStorage(const Graph& graph, const Map& map,
155 154
                         const Converter& converter = Converter())
156 155
        : _graph(graph), _map(map), _converter(converter) {}
157 156
      virtual ~GraphArcMapStorage() {}
158 157

	
159 158
      virtual std::string get(const Item& item) {
160 159
        return _converter(_map[_graph.direct(item, dir)]);
161 160
      }
162 161
      virtual void sort(std::vector<Item>& items) {
163 162
        GraphArcMapLess<Graph, dir, Map> less(_graph, _map);
164 163
        std::sort(items.begin(), items.end(), less);
165 164
      }
166 165
    };
167 166

	
168 167
    class ValueStorageBase {
169 168
    public:
170 169
      ValueStorageBase() {}
171 170
      virtual ~ValueStorageBase() {}
172 171

	
173 172
      virtual std::string get() = 0;
174 173
    };
175 174

	
176 175
    template <typename _Value, typename _Converter = DefaultConverter<_Value> >
177 176
    class ValueStorage : public ValueStorageBase {
178 177
    public:
179 178
      typedef _Value Value;
180 179
      typedef _Converter Converter;
181 180

	
182 181
    private:
183 182
      const Value& _value;
184 183
      Converter _converter;
185 184

	
186 185
    public:
187 186
      ValueStorage(const Value& value, const Converter& converter = Converter())
188 187
        : _value(value), _converter(converter) {}
189 188

	
190 189
      virtual std::string get() {
191 190
        return _converter(_value);
192 191
      }
193 192
    };
194 193

	
195 194
    template <typename Value>
196 195
    struct MapLookUpConverter {
197 196
      const std::map<Value, std::string>& _map;
198 197

	
199 198
      MapLookUpConverter(const std::map<Value, std::string>& map)
200 199
        : _map(map) {}
201 200

	
202 201
      std::string operator()(const Value& str) {
203 202
        typename std::map<Value, std::string>::const_iterator it =
204 203
          _map.find(str);
205 204
        if (it == _map.end()) {
206 205
          throw FormatError("Item not found");
207 206
        }
208 207
        return it->second;
209 208
      }
210 209
    };
211 210

	
212 211
    template <typename Graph>
213 212
    struct GraphArcLookUpConverter {
214 213
      const Graph& _graph;
215 214
      const std::map<typename Graph::Edge, std::string>& _map;
216 215

	
217 216
      GraphArcLookUpConverter(const Graph& graph,
218 217
                              const std::map<typename Graph::Edge,
219 218
                                             std::string>& map)
220 219
        : _graph(graph), _map(map) {}
221 220

	
222 221
      std::string operator()(const typename Graph::Arc& val) {
223 222
        typename std::map<typename Graph::Edge, std::string>
224 223
          ::const_iterator it = _map.find(val);
225 224
        if (it == _map.end()) {
226 225
          throw FormatError("Item not found");
227 226
        }
228 227
        return (_graph.direction(val) ? '+' : '-') + it->second;
0 comments (0 inline)