gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Fixes in adaptors.h to compile on AIX
0 1 0
default
1 file changed with 6 insertions and 6 deletions:
↑ Collapse diff ↑
Show white space 384 line context
... ...
@@ -3006,403 +3006,403 @@
3006 3006
      }
3007 3007
    }
3008 3008

	
3009 3009
    void nextOut(Arc& e) const {
3010 3010
      if (!e._item.firstState()) {
3011 3011
        e._item.setFirst(INVALID);
3012 3012
      } else {
3013 3013
        _digraph->nextOut(e._item.first());
3014 3014
      }
3015 3015
    }
3016 3016

	
3017 3017
    void firstIn(Arc& e, const Node& n) const {
3018 3018
      if (!n._in) {
3019 3019
        e._item.setSecond(n);
3020 3020
      } else {
3021 3021
        e._item.setFirst();
3022 3022
        _digraph->firstIn(e._item.first(), n);
3023 3023
      }
3024 3024
    }
3025 3025

	
3026 3026
    void nextIn(Arc& e) const {
3027 3027
      if (!e._item.firstState()) {
3028 3028
        e._item.setFirst(INVALID);
3029 3029
      } else {
3030 3030
        _digraph->nextIn(e._item.first());
3031 3031
      }
3032 3032
    }
3033 3033

	
3034 3034
    Node source(const Arc& e) const {
3035 3035
      if (e._item.firstState()) {
3036 3036
        return Node(_digraph->source(e._item.first()), false);
3037 3037
      } else {
3038 3038
        return Node(e._item.second(), true);
3039 3039
      }
3040 3040
    }
3041 3041

	
3042 3042
    Node target(const Arc& e) const {
3043 3043
      if (e._item.firstState()) {
3044 3044
        return Node(_digraph->target(e._item.first()), true);
3045 3045
      } else {
3046 3046
        return Node(e._item.second(), false);
3047 3047
      }
3048 3048
    }
3049 3049

	
3050 3050
    int id(const Node& n) const {
3051 3051
      return (_digraph->id(n) << 1) | (n._in ? 0 : 1);
3052 3052
    }
3053 3053
    Node nodeFromId(int ix) const {
3054 3054
      return Node(_digraph->nodeFromId(ix >> 1), (ix & 1) == 0);
3055 3055
    }
3056 3056
    int maxNodeId() const {
3057 3057
      return 2 * _digraph->maxNodeId() + 1;
3058 3058
    }
3059 3059

	
3060 3060
    int id(const Arc& e) const {
3061 3061
      if (e._item.firstState()) {
3062 3062
        return _digraph->id(e._item.first()) << 1;
3063 3063
      } else {
3064 3064
        return (_digraph->id(e._item.second()) << 1) | 1;
3065 3065
      }
3066 3066
    }
3067 3067
    Arc arcFromId(int ix) const {
3068 3068
      if ((ix & 1) == 0) {
3069 3069
        return Arc(_digraph->arcFromId(ix >> 1));
3070 3070
      } else {
3071 3071
        return Arc(_digraph->nodeFromId(ix >> 1));
3072 3072
      }
3073 3073
    }
3074 3074
    int maxArcId() const {
3075 3075
      return std::max(_digraph->maxNodeId() << 1,
3076 3076
                      (_digraph->maxArcId() << 1) | 1);
3077 3077
    }
3078 3078

	
3079 3079
    static bool inNode(const Node& n) {
3080 3080
      return n._in;
3081 3081
    }
3082 3082

	
3083 3083
    static bool outNode(const Node& n) {
3084 3084
      return !n._in;
3085 3085
    }
3086 3086

	
3087 3087
    static bool origArc(const Arc& e) {
3088 3088
      return e._item.firstState();
3089 3089
    }
3090 3090

	
3091 3091
    static bool bindArc(const Arc& e) {
3092 3092
      return e._item.secondState();
3093 3093
    }
3094 3094

	
3095 3095
    static Node inNode(const DigraphNode& n) {
3096 3096
      return Node(n, true);
3097 3097
    }
3098 3098

	
3099 3099
    static Node outNode(const DigraphNode& n) {
3100 3100
      return Node(n, false);
3101 3101
    }
3102 3102

	
3103 3103
    static Arc arc(const DigraphNode& n) {
3104 3104
      return Arc(n);
3105 3105
    }
3106 3106

	
3107 3107
    static Arc arc(const DigraphArc& e) {
3108 3108
      return Arc(e);
3109 3109
    }
3110 3110

	
3111 3111
    typedef True NodeNumTag;
3112 3112
    int nodeNum() const {
3113 3113
      return  2 * countNodes(*_digraph);
3114 3114
    }
3115 3115

	
3116 3116
    typedef True ArcNumTag;
3117 3117
    int arcNum() const {
3118 3118
      return countArcs(*_digraph) + countNodes(*_digraph);
3119 3119
    }
3120 3120

	
3121 3121
    typedef True FindArcTag;
3122 3122
    Arc findArc(const Node& u, const Node& v,
3123 3123
                const Arc& prev = INVALID) const {
3124 3124
      if (inNode(u) && outNode(v)) {
3125 3125
        if (static_cast<const DigraphNode&>(u) ==
3126 3126
            static_cast<const DigraphNode&>(v) && prev == INVALID) {
3127 3127
          return Arc(u);
3128 3128
        }
3129 3129
      }
3130 3130
      else if (outNode(u) && inNode(v)) {
3131 3131
        return Arc(::lemon::findArc(*_digraph, u, v, prev));
3132 3132
      }
3133 3133
      return INVALID;
3134 3134
    }
3135 3135

	
3136 3136
  private:
3137 3137

	
3138 3138
    template <typename V>
3139 3139
    class NodeMapBase
3140 3140
      : public MapTraits<typename Parent::template NodeMap<V> > {
3141 3141
      typedef typename Parent::template NodeMap<V> NodeImpl;
3142 3142
    public:
3143 3143
      typedef Node Key;
3144 3144
      typedef V Value;
3145 3145
      typedef typename MapTraits<NodeImpl>::ReferenceMapTag ReferenceMapTag;
3146 3146
      typedef typename MapTraits<NodeImpl>::ReturnValue ReturnValue;
3147 3147
      typedef typename MapTraits<NodeImpl>::ConstReturnValue ConstReturnValue;
3148 3148
      typedef typename MapTraits<NodeImpl>::ReturnValue Reference;
3149 3149
      typedef typename MapTraits<NodeImpl>::ConstReturnValue ConstReference;
3150 3150

	
3151 3151
      NodeMapBase(const SplitNodesBase<DGR>& adaptor)
3152 3152
        : _in_map(*adaptor._digraph), _out_map(*adaptor._digraph) {}
3153 3153
      NodeMapBase(const SplitNodesBase<DGR>& adaptor, const V& value)
3154 3154
        : _in_map(*adaptor._digraph, value),
3155 3155
          _out_map(*adaptor._digraph, value) {}
3156 3156

	
3157 3157
      void set(const Node& key, const V& val) {
3158 3158
        if (SplitNodesBase<DGR>::inNode(key)) { _in_map.set(key, val); }
3159 3159
        else {_out_map.set(key, val); }
3160 3160
      }
3161 3161

	
3162 3162
      ReturnValue operator[](const Node& key) {
3163 3163
        if (SplitNodesBase<DGR>::inNode(key)) { return _in_map[key]; }
3164 3164
        else { return _out_map[key]; }
3165 3165
      }
3166 3166

	
3167 3167
      ConstReturnValue operator[](const Node& key) const {
3168 3168
        if (Adaptor::inNode(key)) { return _in_map[key]; }
3169 3169
        else { return _out_map[key]; }
3170 3170
      }
3171 3171

	
3172 3172
    private:
3173 3173
      NodeImpl _in_map, _out_map;
3174 3174
    };
3175 3175

	
3176 3176
    template <typename V>
3177 3177
    class ArcMapBase
3178 3178
      : public MapTraits<typename Parent::template ArcMap<V> > {
3179 3179
      typedef typename Parent::template ArcMap<V> ArcImpl;
3180 3180
      typedef typename Parent::template NodeMap<V> NodeImpl;
3181 3181
    public:
3182 3182
      typedef Arc Key;
3183 3183
      typedef V Value;
3184 3184
      typedef typename MapTraits<ArcImpl>::ReferenceMapTag ReferenceMapTag;
3185 3185
      typedef typename MapTraits<ArcImpl>::ReturnValue ReturnValue;
3186 3186
      typedef typename MapTraits<ArcImpl>::ConstReturnValue ConstReturnValue;
3187 3187
      typedef typename MapTraits<ArcImpl>::ReturnValue Reference;
3188 3188
      typedef typename MapTraits<ArcImpl>::ConstReturnValue ConstReference;
3189 3189

	
3190 3190
      ArcMapBase(const SplitNodesBase<DGR>& adaptor)
3191 3191
        : _arc_map(*adaptor._digraph), _node_map(*adaptor._digraph) {}
3192 3192
      ArcMapBase(const SplitNodesBase<DGR>& adaptor, const V& value)
3193 3193
        : _arc_map(*adaptor._digraph, value),
3194 3194
          _node_map(*adaptor._digraph, value) {}
3195 3195

	
3196 3196
      void set(const Arc& key, const V& val) {
3197 3197
        if (SplitNodesBase<DGR>::origArc(key)) {
3198
          _arc_map.set(key._item.first(), val);
3198
          _arc_map.set(static_cast<const DigraphArc&>(key), val);
3199 3199
        } else {
3200
          _node_map.set(key._item.second(), val);
3200
          _node_map.set(static_cast<const DigraphNode&>(key), val);
3201 3201
        }
3202 3202
      }
3203 3203

	
3204 3204
      ReturnValue operator[](const Arc& key) {
3205 3205
        if (SplitNodesBase<DGR>::origArc(key)) {
3206
          return _arc_map[key._item.first()];
3206
          return _arc_map[static_cast<const DigraphArc&>(key)];
3207 3207
        } else {
3208
          return _node_map[key._item.second()];
3208
          return _node_map[static_cast<const DigraphNode&>(key)];
3209 3209
        }
3210 3210
      }
3211 3211

	
3212 3212
      ConstReturnValue operator[](const Arc& key) const {
3213 3213
        if (SplitNodesBase<DGR>::origArc(key)) {
3214
          return _arc_map[key._item.first()];
3214
          return _arc_map[static_cast<const DigraphArc&>(key)];
3215 3215
        } else {
3216
          return _node_map[key._item.second()];
3216
          return _node_map[static_cast<const DigraphNode&>(key)];
3217 3217
        }
3218 3218
      }
3219 3219

	
3220 3220
    private:
3221 3221
      ArcImpl _arc_map;
3222 3222
      NodeImpl _node_map;
3223 3223
    };
3224 3224

	
3225 3225
  public:
3226 3226

	
3227 3227
    template <typename V>
3228 3228
    class NodeMap
3229 3229
      : public SubMapExtender<SplitNodesBase<DGR>, NodeMapBase<V> >
3230 3230
    {
3231 3231
    public:
3232 3232
      typedef V Value;
3233 3233
      typedef SubMapExtender<SplitNodesBase<DGR>, NodeMapBase<Value> > Parent;
3234 3234

	
3235 3235
      NodeMap(const SplitNodesBase<DGR>& adaptor)
3236 3236
        : Parent(adaptor) {}
3237 3237

	
3238 3238
      NodeMap(const SplitNodesBase<DGR>& adaptor, const V& value)
3239 3239
        : Parent(adaptor, value) {}
3240 3240

	
3241 3241
    private:
3242 3242
      NodeMap& operator=(const NodeMap& cmap) {
3243 3243
        return operator=<NodeMap>(cmap);
3244 3244
      }
3245 3245

	
3246 3246
      template <typename CMap>
3247 3247
      NodeMap& operator=(const CMap& cmap) {
3248 3248
        Parent::operator=(cmap);
3249 3249
        return *this;
3250 3250
      }
3251 3251
    };
3252 3252

	
3253 3253
    template <typename V>
3254 3254
    class ArcMap
3255 3255
      : public SubMapExtender<SplitNodesBase<DGR>, ArcMapBase<V> >
3256 3256
    {
3257 3257
    public:
3258 3258
      typedef V Value;
3259 3259
      typedef SubMapExtender<SplitNodesBase<DGR>, ArcMapBase<Value> > Parent;
3260 3260

	
3261 3261
      ArcMap(const SplitNodesBase<DGR>& adaptor)
3262 3262
        : Parent(adaptor) {}
3263 3263

	
3264 3264
      ArcMap(const SplitNodesBase<DGR>& adaptor, const V& value)
3265 3265
        : Parent(adaptor, value) {}
3266 3266

	
3267 3267
    private:
3268 3268
      ArcMap& operator=(const ArcMap& cmap) {
3269 3269
        return operator=<ArcMap>(cmap);
3270 3270
      }
3271 3271

	
3272 3272
      template <typename CMap>
3273 3273
      ArcMap& operator=(const CMap& cmap) {
3274 3274
        Parent::operator=(cmap);
3275 3275
        return *this;
3276 3276
      }
3277 3277
    };
3278 3278

	
3279 3279
  protected:
3280 3280

	
3281 3281
    SplitNodesBase() : _digraph(0) {}
3282 3282

	
3283 3283
    DGR* _digraph;
3284 3284

	
3285 3285
    void initialize(Digraph& digraph) {
3286 3286
      _digraph = &digraph;
3287 3287
    }
3288 3288

	
3289 3289
  };
3290 3290

	
3291 3291
  /// \ingroup graph_adaptors
3292 3292
  ///
3293 3293
  /// \brief Adaptor class for splitting the nodes of a digraph.
3294 3294
  ///
3295 3295
  /// SplitNodes adaptor can be used for splitting each node into an
3296 3296
  /// \e in-node and an \e out-node in a digraph. Formaly, the adaptor
3297 3297
  /// replaces each node \f$ u \f$ in the digraph with two nodes,
3298 3298
  /// namely node \f$ u_{in} \f$ and node \f$ u_{out} \f$.
3299 3299
  /// If there is a \f$ (v, u) \f$ arc in the original digraph, then the
3300 3300
  /// new target of the arc will be \f$ u_{in} \f$ and similarly the
3301 3301
  /// source of each original \f$ (u, v) \f$ arc will be \f$ u_{out} \f$.
3302 3302
  /// The adaptor adds an additional \e bind \e arc from \f$ u_{in} \f$
3303 3303
  /// to \f$ u_{out} \f$ for each node \f$ u \f$ of the original digraph.
3304 3304
  ///
3305 3305
  /// The aim of this class is running an algorithm with respect to node
3306 3306
  /// costs or capacities if the algorithm considers only arc costs or
3307 3307
  /// capacities directly.
3308 3308
  /// In this case you can use \c SplitNodes adaptor, and set the node
3309 3309
  /// costs/capacities of the original digraph to the \e bind \e arcs
3310 3310
  /// in the adaptor.
3311 3311
  ///
3312 3312
  /// \tparam DGR The type of the adapted digraph.
3313 3313
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
3314 3314
  /// It is implicitly \c const.
3315 3315
  ///
3316 3316
  /// \note The \c Node type of this adaptor is converible to the \c Node
3317 3317
  /// type of the adapted digraph.
3318 3318
  template <typename DGR>
3319 3319
#ifdef DOXYGEN
3320 3320
  class SplitNodes {
3321 3321
#else
3322 3322
  class SplitNodes
3323 3323
    : public DigraphAdaptorExtender<SplitNodesBase<const DGR> > {
3324 3324
#endif
3325 3325
  public:
3326 3326
    typedef DGR Digraph;
3327 3327
    typedef DigraphAdaptorExtender<SplitNodesBase<const DGR> > Parent;
3328 3328

	
3329 3329
    typedef typename DGR::Node DigraphNode;
3330 3330
    typedef typename DGR::Arc DigraphArc;
3331 3331

	
3332 3332
    typedef typename Parent::Node Node;
3333 3333
    typedef typename Parent::Arc Arc;
3334 3334

	
3335 3335
    /// \brief Constructor
3336 3336
    ///
3337 3337
    /// Constructor of the adaptor.
3338 3338
    SplitNodes(const DGR& g) {
3339 3339
      Parent::initialize(g);
3340 3340
    }
3341 3341

	
3342 3342
    /// \brief Returns \c true if the given node is an in-node.
3343 3343
    ///
3344 3344
    /// Returns \c true if the given node is an in-node.
3345 3345
    static bool inNode(const Node& n) {
3346 3346
      return Parent::inNode(n);
3347 3347
    }
3348 3348

	
3349 3349
    /// \brief Returns \c true if the given node is an out-node.
3350 3350
    ///
3351 3351
    /// Returns \c true if the given node is an out-node.
3352 3352
    static bool outNode(const Node& n) {
3353 3353
      return Parent::outNode(n);
3354 3354
    }
3355 3355

	
3356 3356
    /// \brief Returns \c true if the given arc is an original arc.
3357 3357
    ///
3358 3358
    /// Returns \c true if the given arc is one of the arcs in the
3359 3359
    /// original digraph.
3360 3360
    static bool origArc(const Arc& a) {
3361 3361
      return Parent::origArc(a);
3362 3362
    }
3363 3363

	
3364 3364
    /// \brief Returns \c true if the given arc is a bind arc.
3365 3365
    ///
3366 3366
    /// Returns \c true if the given arc is a bind arc, i.e. it connects
3367 3367
    /// an in-node and an out-node.
3368 3368
    static bool bindArc(const Arc& a) {
3369 3369
      return Parent::bindArc(a);
3370 3370
    }
3371 3371

	
3372 3372
    /// \brief Returns the in-node created from the given original node.
3373 3373
    ///
3374 3374
    /// Returns the in-node created from the given original node.
3375 3375
    static Node inNode(const DigraphNode& n) {
3376 3376
      return Parent::inNode(n);
3377 3377
    }
3378 3378

	
3379 3379
    /// \brief Returns the out-node created from the given original node.
3380 3380
    ///
3381 3381
    /// Returns the out-node created from the given original node.
3382 3382
    static Node outNode(const DigraphNode& n) {
3383 3383
      return Parent::outNode(n);
3384 3384
    }
3385 3385

	
3386 3386
    /// \brief Returns the bind arc that corresponds to the given
3387 3387
    /// original node.
3388 3388
    ///
3389 3389
    /// Returns the bind arc in the adaptor that corresponds to the given
3390 3390
    /// original node, i.e. the arc connecting the in-node and out-node
3391 3391
    /// of \c n.
3392 3392
    static Arc arc(const DigraphNode& n) {
3393 3393
      return Parent::arc(n);
3394 3394
    }
3395 3395

	
3396 3396
    /// \brief Returns the arc that corresponds to the given original arc.
3397 3397
    ///
3398 3398
    /// Returns the arc in the adaptor that corresponds to the given
3399 3399
    /// original arc.
3400 3400
    static Arc arc(const DigraphArc& a) {
3401 3401
      return Parent::arc(a);
3402 3402
    }
3403 3403

	
3404 3404
    /// \brief Node map combined from two original node maps
3405 3405
    ///
3406 3406
    /// This map adaptor class adapts two node maps of the original digraph
3407 3407
    /// to get a node map of the split digraph.
3408 3408
    /// Its value type is inherited from the first node map type
0 comments (0 inline)