epoc32/include/stdapis/boost/graph/adjacency_list_io.hpp
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
williamr@2
     1
//=======================================================================
williamr@2
     2
// Copyright 2001 Universite Joseph Fourier, Grenoble.
williamr@2
     3
// Author: François Faure
williamr@2
     4
//
williamr@2
     5
// Distributed under the Boost Software License, Version 1.0. (See
williamr@2
     6
// accompanying file LICENSE_1_0.txt or copy at
williamr@2
     7
// http://www.boost.org/LICENSE_1_0.txt)
williamr@2
     8
//=======================================================================
williamr@2
     9
#ifndef BOOST_GRAPH_ADJACENCY_LIST_IO_HPP
williamr@2
    10
#define BOOST_GRAPH_ADJACENCY_LIST_IO_HPP
williamr@2
    11
williamr@2
    12
#include <iostream>
williamr@2
    13
#include <vector>
williamr@2
    14
#include <boost/graph/adjacency_list.hpp>
williamr@2
    15
#include <cctype>
williamr@2
    16
williamr@2
    17
// Method read to parse an adjacency list from an input stream. Examples:
williamr@2
    18
// cin >> read( G );
williamr@2
    19
// cin >> read( G, NodePropertySubset(), EdgepropertySubset() );
williamr@2
    20
//
williamr@2
    21
// Method write to print an adjacency list to an output stream. Examples:
williamr@2
    22
// cout << write( G );
williamr@2
    23
// cout << write( G, NodePropertySubset(), EdgepropertySubset() );
williamr@2
    24
williamr@2
    25
namespace boost {
williamr@2
    26
williamr@2
    27
/* outline
williamr@2
    28
        - basic property input
williamr@2
    29
        - get property subset
williamr@2
    30
        - graph parser
williamr@2
    31
        - property printer
williamr@2
    32
        - graph printer
williamr@2
    33
        - user methods
williamr@2
    34
*/
williamr@2
    35
williamr@2
    36
//===========================================================================
williamr@2
    37
// basic property input
williamr@2
    38
williamr@2
    39
template<class Tag, class Value, class Next>
williamr@2
    40
std::istream& operator >> ( std::istream& in, property<Tag,Value,Next>& p )
williamr@2
    41
{
williamr@2
    42
        in >> p.m_value >> *(static_cast<Next*>(&p)); // houpla !!
williamr@2
    43
        return in;
williamr@2
    44
}
williamr@2
    45
williamr@2
    46
template<class Tag, class Value>
williamr@2
    47
std::istream& operator >> ( std::istream& in, property<Tag,Value,no_property>& p )
williamr@2
    48
{
williamr@2
    49
        in >> p.m_value;
williamr@2
    50
        return in;
williamr@2
    51
}
williamr@2
    52
williamr@2
    53
inline std::istream& operator >> ( std::istream& in, no_property& )
williamr@2
    54
{
williamr@2
    55
        return in;
williamr@2
    56
}
williamr@2
    57
williamr@2
    58
// basic property input
williamr@2
    59
//===========================================================================
williamr@2
    60
// get property subsets
williamr@2
    61
williamr@2
    62
// get a single property tagged Stag
williamr@2
    63
template<class Tag, class Value, class Next, class V, class Stag>
williamr@2
    64
void get
williamr@2
    65
( property<Tag,Value,Next>& p, const V& v, Stag s )
williamr@2
    66
{
williamr@2
    67
        get( *(static_cast<Next*>(&p)),v,s );
williamr@2
    68
}
williamr@2
    69
williamr@2
    70
template<class Value, class Next, class V, class Stag>
williamr@2
    71
void get
williamr@2
    72
( property<Stag,Value,Next>& p, const V& v, Stag )
williamr@2
    73
{
williamr@2
    74
        p.m_value = v;
williamr@2
    75
}
williamr@2
    76
williamr@2
    77
// get a subset of properties tagged Stag
williamr@2
    78
template<class Tag, class Value, class Next, 
williamr@2
    79
        class Stag, class Svalue, class Snext>
williamr@2
    80
void getSubset
williamr@2
    81
( property<Tag,Value,Next>& p, const property<Stag,Svalue,Snext>& s )
williamr@2
    82
{
williamr@2
    83
        get( p, s.m_value, Stag() );
williamr@2
    84
        getSubset( p, Snext(s) );
williamr@2
    85
}
williamr@2
    86
williamr@2
    87
template<class Tag, class Value, class Next, 
williamr@2
    88
        class Stag, class Svalue>
williamr@2
    89
void getSubset
williamr@2
    90
( property<Tag,Value,Next>& p, const property<Stag,Svalue,no_property>& s)
williamr@2
    91
{
williamr@2
    92
        get( p, s.m_value, Stag() );
williamr@2
    93
}
williamr@2
    94
williamr@2
    95
inline void getSubset
williamr@2
    96
( no_property& p, const no_property& s )
williamr@2
    97
{
williamr@2
    98
}
williamr@2
    99
williamr@2
   100
#if !defined(BOOST_GRAPH_NO_BUNDLED_PROPERTIES)
williamr@2
   101
template<typename T, typename U>
williamr@2
   102
void getSubset(T& p, const U& s)
williamr@2
   103
{
williamr@2
   104
  p = s;
williamr@2
   105
}
williamr@2
   106
williamr@2
   107
template<typename T>
williamr@2
   108
void getSubset(T&, const no_property&)
williamr@2
   109
{
williamr@2
   110
}
williamr@2
   111
williamr@2
   112
williamr@2
   113
#endif
williamr@2
   114
williamr@2
   115
//  get property subset
williamr@2
   116
//===========================================================================
williamr@2
   117
// graph parser
williamr@2
   118
typedef enum{ PARSE_NUM_NODES, PARSE_VERTEX, PARSE_EDGE } GraphParserState;
williamr@2
   119
williamr@2
   120
template<class Graph_t, class VertexProperty, class EdgeProperty, class VertexPropertySubset,
williamr@2
   121
class EdgePropertySubset>
williamr@2
   122
struct GraphParser
williamr@2
   123
{
williamr@2
   124
williamr@2
   125
        typedef Graph_t Graph;
williamr@2
   126
        
williamr@2
   127
        GraphParser( Graph* g ): graph(g)
williamr@2
   128
        {}      
williamr@2
   129
        
williamr@2
   130
        GraphParser& operator () ( std::istream& in )
williamr@2
   131
        {
williamr@2
   132
                typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
williamr@2
   133
                std::vector<Vertex> nodes;
williamr@2
   134
williamr@2
   135
                GraphParserState state = PARSE_VERTEX;
williamr@2
   136
williamr@2
   137
                unsigned int numLine = 1;
williamr@2
   138
                char c;
williamr@2
   139
                while ( in.get(c) )
williamr@2
   140
                {
williamr@2
   141
                        if( c== '#' ) skip(in);
williamr@2
   142
                        else if( c== 'n' ) state = PARSE_NUM_NODES;
williamr@2
   143
                        else if( c== 'v' ) state = PARSE_VERTEX;
williamr@2
   144
                        else if( c== 'e' ) state = PARSE_EDGE;
williamr@2
   145
                        else if( c== '\n' ) numLine++;
williamr@2
   146
                        else if( !std::isspace(c) ){
williamr@2
   147
                                in.putback(c);
williamr@2
   148
                                if( state == PARSE_VERTEX ){
williamr@2
   149
                                        VertexPropertySubset readProp;
williamr@2
   150
                                        if( in >> readProp )
williamr@2
   151
                                        {
williamr@2
   152
                                                VertexProperty vp;
williamr@2
   153
                                                getSubset( vp, readProp );
williamr@2
   154
                                                nodes.push_back( add_vertex(vp, *graph) );
williamr@2
   155
                                        }
williamr@2
   156
                                        else
williamr@2
   157
                                                std::cerr<<"read vertex, parse error at line"<<numLine<<std::endl;
williamr@2
   158
                                }
williamr@2
   159
                                else if( state == PARSE_EDGE ) {
williamr@2
   160
                                        int source, target;
williamr@2
   161
                                        EdgePropertySubset readProp;
williamr@2
   162
                                        in >> source >> target;
williamr@2
   163
                                        if( in >> readProp ) 
williamr@2
   164
                                        {
williamr@2
   165
                                                EdgeProperty ep;
williamr@2
   166
                                                getSubset( ep, readProp );
williamr@2
   167
                                                add_edge(nodes[source], nodes[target], ep, *graph);
williamr@2
   168
                                        }
williamr@2
   169
                                        else
williamr@2
   170
                                                std::cerr<<"read edge, parse error at line"<<numLine<<std::endl;
williamr@2
   171
                                }
williamr@2
   172
                                else { // state == PARSE_NUM_NODES
williamr@2
   173
                                        int n;
williamr@2
   174
                                        if( in >> n ){
williamr@2
   175
                                                for( int i=0; i<n; ++i )
williamr@2
   176
                                                        nodes.push_back( add_vertex( *graph ));
williamr@2
   177
                                        }
williamr@2
   178
                                        else 
williamr@2
   179
                                                std::cerr<<"read num_nodes, parse error at line "<< numLine << std::endl;
williamr@2
   180
                                }
williamr@2
   181
                        }
williamr@2
   182
                }
williamr@2
   183
        return (*this);
williamr@2
   184
        }
williamr@2
   185
        
williamr@2
   186
        
williamr@2
   187
protected:
williamr@2
   188
williamr@2
   189
        Graph* graph;
williamr@2
   190
        
williamr@2
   191
        void skip( std::istream& in )
williamr@2
   192
        {
williamr@2
   193
                char c = 0;
williamr@2
   194
                while( c!='\n' && !in.eof() ) 
williamr@2
   195
                       in.get(c);
williamr@2
   196
                in.putback(c);
williamr@2
   197
        }
williamr@2
   198
};
williamr@2
   199
williamr@2
   200
// parser
williamr@2
   201
//=======================================================================
williamr@2
   202
// property printer
williamr@2
   203
williamr@2
   204
#if defined(BOOST_GRAPH_NO_BUNDLED_PROPERTIES)
williamr@2
   205
template<class Graph, class Property>
williamr@2
   206
struct PropertyPrinter
williamr@2
   207
{
williamr@2
   208
        typedef typename Property::value_type Value;
williamr@2
   209
        typedef typename Property::tag_type Tag;
williamr@2
   210
        typedef typename Property::next_type Next;
williamr@2
   211
        
williamr@2
   212
        PropertyPrinter( const Graph& g ):graph(&g){}
williamr@2
   213
        
williamr@2
   214
        template<class Iterator>
williamr@2
   215
        PropertyPrinter& operator () ( std::ostream& out, Iterator it )
williamr@2
   216
        {
williamr@2
   217
                typename property_map<Graph,Tag>::type ps = get(Tag(), *graph);
williamr@2
   218
                out << ps[ *it ] <<" ";
williamr@2
   219
                PropertyPrinter<Graph,Next> print(*graph);
williamr@2
   220
                print(out, it);
williamr@2
   221
                return (*this);
williamr@2
   222
        }
williamr@2
   223
private:
williamr@2
   224
        const Graph* graph;
williamr@2
   225
};
williamr@2
   226
#else
williamr@2
   227
template<class Graph, typename Property>
williamr@2
   228
struct PropertyPrinter
williamr@2
   229
{
williamr@2
   230
        PropertyPrinter( const Graph& g ):graph(&g){}
williamr@2
   231
        
williamr@2
   232
        template<class Iterator>
williamr@2
   233
        PropertyPrinter& operator () ( std::ostream& out, Iterator it )
williamr@2
   234
        {
williamr@2
   235
                out << (*graph)[ *it ] <<" ";
williamr@2
   236
                return (*this);
williamr@2
   237
        }
williamr@2
   238
private:
williamr@2
   239
        const Graph* graph;
williamr@2
   240
};
williamr@2
   241
williamr@2
   242
template<class Graph, typename Tag, typename Value, typename Next>
williamr@2
   243
struct PropertyPrinter<Graph, property<Tag, Value, Next> >
williamr@2
   244
{
williamr@2
   245
        PropertyPrinter( const Graph& g ):graph(&g){}
williamr@2
   246
        
williamr@2
   247
        template<class Iterator>
williamr@2
   248
        PropertyPrinter& operator () ( std::ostream& out, Iterator it )
williamr@2
   249
        {
williamr@2
   250
                typename property_map<Graph,Tag>::type ps = get(Tag(), *graph);
williamr@2
   251
                out << ps[ *it ] <<" ";
williamr@2
   252
                PropertyPrinter<Graph,Next> print(*graph);
williamr@2
   253
                print(out, it);
williamr@2
   254
                return (*this);
williamr@2
   255
        }
williamr@2
   256
private:
williamr@2
   257
        const Graph* graph;
williamr@2
   258
};
williamr@2
   259
#endif
williamr@2
   260
williamr@2
   261
template<class Graph>
williamr@2
   262
struct PropertyPrinter<Graph, no_property>
williamr@2
   263
{
williamr@2
   264
        PropertyPrinter( const Graph& ){}
williamr@2
   265
williamr@2
   266
        template<class Iterator>
williamr@2
   267
        PropertyPrinter& operator () ( std::ostream&, Iterator it ){ return *this; }
williamr@2
   268
};
williamr@2
   269
williamr@2
   270
// property printer
williamr@2
   271
//=========================================================================
williamr@2
   272
// graph printer
williamr@2
   273
williamr@2
   274
template<class Graph_t, class EdgeProperty>
williamr@2
   275
struct EdgePrinter
williamr@2
   276
{
williamr@2
   277
williamr@2
   278
        typedef Graph_t Graph;
williamr@2
   279
        typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
williamr@2
   280
        
williamr@2
   281
        EdgePrinter( const Graph& g )
williamr@2
   282
                : graph(g)
williamr@2
   283
        {}      
williamr@2
   284
        
williamr@2
   285
        const EdgePrinter& operator () ( std::ostream& out ) const
williamr@2
   286
        {
williamr@2
   287
                // assign indices to vertices
williamr@2
   288
                std::map<Vertex,int> indices;
williamr@2
   289
                int num = 0;
williamr@2
   290
                typename graph_traits<Graph>::vertex_iterator vi;
williamr@2
   291
                for (vi = vertices(graph).first; vi != vertices(graph).second; ++vi){
williamr@2
   292
                        indices[*vi] = num++;
williamr@2
   293
                }
williamr@2
   294
williamr@2
   295
                // write edges
williamr@2
   296
                PropertyPrinter<Graph, EdgeProperty> print_Edge(graph);
williamr@2
   297
                out << "e" << std::endl;
williamr@2
   298
                typename graph_traits<Graph>::edge_iterator ei;
williamr@2
   299
                for (ei = edges(graph).first; ei != edges(graph).second; ++ei){
williamr@2
   300
                        out << indices[source(*ei,graph)] <<  " " << indices[target(*ei,graph)] << "  "; 
williamr@2
   301
                        print_Edge(out,ei); 
williamr@2
   302
                        out << std::endl;
williamr@2
   303
                }
williamr@2
   304
                out << std::endl;            
williamr@2
   305
                return (*this);
williamr@2
   306
        }
williamr@2
   307
        
williamr@2
   308
protected:
williamr@2
   309
williamr@2
   310
        const Graph& graph;
williamr@2
   311
        
williamr@2
   312
};
williamr@2
   313
williamr@2
   314
template<class Graph, class V, class E>
williamr@2
   315
struct GraphPrinter: public EdgePrinter<Graph,E>
williamr@2
   316
{
williamr@2
   317
        GraphPrinter( const Graph& g )
williamr@2
   318
          : EdgePrinter<Graph,E>(g)
williamr@2
   319
        {}
williamr@2
   320
        
williamr@2
   321
        const GraphPrinter& operator () ( std::ostream& out ) const
williamr@2
   322
        {
williamr@2
   323
                PropertyPrinter<Graph, V> printNode(this->graph);
williamr@2
   324
                out << "v"<<std::endl;
williamr@2
   325
                typename graph_traits<Graph>::vertex_iterator vi;
williamr@2
   326
                for (vi = vertices(this->graph).first; vi != vertices(this->graph).second; ++vi){
williamr@2
   327
                        printNode(out,vi); 
williamr@2
   328
                        out << std::endl;
williamr@2
   329
                }
williamr@2
   330
                
williamr@2
   331
                EdgePrinter<Graph,E>::operator ()( out );
williamr@2
   332
                return (*this);
williamr@2
   333
        }
williamr@2
   334
};
williamr@2
   335
williamr@2
   336
template<class Graph, class E>
williamr@2
   337
struct GraphPrinter<Graph,no_property,E> 
williamr@2
   338
  : public EdgePrinter<Graph,E>
williamr@2
   339
{
williamr@2
   340
        GraphPrinter( const Graph& g )
williamr@2
   341
          : EdgePrinter<Graph,E>(g)
williamr@2
   342
        {}
williamr@2
   343
        
williamr@2
   344
        const GraphPrinter& operator () ( std::ostream& out ) const
williamr@2
   345
        {
williamr@2
   346
                out << "n "<< num_vertices(this->graph) << std::endl;
williamr@2
   347
                EdgePrinter<Graph,E>::operator ()( out );
williamr@2
   348
                return (*this);
williamr@2
   349
        }
williamr@2
   350
};
williamr@2
   351
williamr@2
   352
// graph printer
williamr@2
   353
//=========================================================================
williamr@2
   354
// user methods
williamr@2
   355
williamr@2
   356
/// input stream for reading a graph
williamr@2
   357
template<class Graph, class VP, class EP, class VPS, class EPS>
williamr@2
   358
std::istream& operator >> ( std::istream& in, GraphParser<Graph,VP,EP,VPS,EPS> gp ) 
williamr@2
   359
{ 
williamr@2
   360
        gp(in); 
williamr@2
   361
        return in; 
williamr@2
   362
}
williamr@2
   363
williamr@2
   364
/// graph parser for given subsets of internal vertex and edge properties
williamr@2
   365
template<class EL, class VL, class D, class VP, class EP, class GP, class VPS, class EPS>
williamr@2
   366
GraphParser<adjacency_list<EL,VL,D,VP,EP,GP>,VP,EP,VPS,EPS> 
williamr@2
   367
read( adjacency_list<EL,VL,D,VP,EP,GP>& g, VPS vps, EPS eps )
williamr@2
   368
{
williamr@2
   369
        return GraphParser<adjacency_list<EL,VL,D,VP,EP,GP>,VP,EP,VPS,EPS>(&g);
williamr@2
   370
}
williamr@2
   371
williamr@2
   372
/// graph parser for all internal vertex and edge properties
williamr@2
   373
template<class EL, class VL, class D, class VP, class EP, class GP>
williamr@2
   374
GraphParser<adjacency_list<EL,VL,D,VP,EP,GP>,VP,EP,VP,EP> 
williamr@2
   375
read( adjacency_list<EL,VL,D,VP,EP,GP>& g )
williamr@2
   376
{
williamr@2
   377
        return GraphParser<adjacency_list<EL,VL,D,VP,EP,GP>,VP,EP,VP,EP>(&g);
williamr@2
   378
}
williamr@2
   379
williamr@2
   380
williamr@2
   381
/// output stream for writing a graph
williamr@2
   382
template<class Graph, class VP, class EP>
williamr@2
   383
std::ostream& operator << ( std::ostream& out, const GraphPrinter<Graph,VP,EP>& gp ) 
williamr@2
   384
{ 
williamr@2
   385
        gp(out); 
williamr@2
   386
        return out; 
williamr@2
   387
}
williamr@2
   388
williamr@2
   389
/// write the graph with given property subsets
williamr@2
   390
template<class EL, class VL, class D, class VP, class EP, class GP, class VPS, class EPS>
williamr@2
   391
GraphPrinter<adjacency_list<EL,VL,D,VP,EP,GP>,VPS,EPS> 
williamr@2
   392
write( const adjacency_list<EL,VL,D,VP,EP,GP>& g, VPS, EPS )
williamr@2
   393
{
williamr@2
   394
        return GraphPrinter<adjacency_list<EL,VL,D,VP,EP,GP>,VPS,EPS>(g);
williamr@2
   395
}
williamr@2
   396
williamr@2
   397
/// write the graph with all internal vertex and edge properties
williamr@2
   398
template<class EL, class VL, class D, class VP, class EP, class GP>
williamr@2
   399
GraphPrinter<adjacency_list<EL,VL,D,VP,EP,GP>,VP,EP> 
williamr@2
   400
write( const adjacency_list<EL,VL,D,VP,EP,GP>& g )
williamr@2
   401
{
williamr@2
   402
        return GraphPrinter<adjacency_list<EL,VL,D,VP,EP,GP>,VP,EP>(g);
williamr@2
   403
}
williamr@2
   404
williamr@2
   405
// user methods
williamr@2
   406
//=========================================================================
williamr@2
   407
}// boost
williamr@2
   408
#endif