[Lemon-commits] [lemon_svn] deba: r1890 - hugo/trunk/src/lemon

Lemon SVN svn at lemon.cs.elte.hu
Mon Nov 6 20:48:29 CET 2006


Author: deba
Date: Sat May 14 19:37:33 2005
New Revision: 1890

Modified:
   hugo/trunk/src/lemon/maps.h
   hugo/trunk/src/lemon/xy.h

Log:
Smart reference handling in map adaptors



Modified: hugo/trunk/src/lemon/maps.h
==============================================================================
--- hugo/trunk/src/lemon/maps.h	(original)
+++ hugo/trunk/src/lemon/maps.h	Sat May 14 19:37:33 2005
@@ -17,6 +17,9 @@
 #ifndef LEMON_MAPS_H
 #define LEMON_MAPS_H
 
+#include <lemon/graph_utils.h>
+#include <lemon/utility.h>
+
 
 ///\file
 ///\ingroup maps
@@ -55,6 +58,8 @@
   class NullMap : public MapBase<K,T>
   {
   public:
+    
+    typedef True NeedCopy;
 
     /// Gives back a default constructed element.
     T operator[](const K&) const { return T(); }
@@ -62,6 +67,11 @@
     void set(const K&, const T&) {}
   };
 
+  template <typename K, typename V> 
+  NullMap<K, V> nullMap() {
+    return NullMap<K, V>();
+  }
+
 
   /// Constant map.
 
@@ -74,6 +84,8 @@
     T v;
   public:
 
+    typedef True NeedCopy;
+
     /// Default constructor
 
     /// The value of the map will be uninitialized. 
@@ -208,10 +220,12 @@
   ///\endcode
   ///\bug wrong documentation
   template<class M, class T> 
-  class ConvertMap
-  {
-    const M &m;
+  class ConvertMap {
+    typename SmartConstReference<M>::Type m;
   public:
+
+    typedef True NeedCopy;
+
     typedef typename M::Key Key;
     typedef T Value;
 
@@ -250,9 +264,13 @@
   template<class M1,class M2> 
   class AddMap
   {
-    const M1 &m1;
-    const M2 &m2;
+    typename SmartConstReference<M1>::Type m1;
+    typename SmartConstReference<M2>::Type m2;
+
   public:
+
+    typedef True NeedCopy;
+
     typedef typename M1::Key Key;
     typedef typename M1::Value Value;
 
@@ -295,9 +313,11 @@
   template<class M> 
   class ShiftMap
   {
-    const M &m;
+    typename SmartConstReference<M>::Type m;
     typename M::Value v;
   public:
+
+    typedef True NeedCopy;
     typedef typename M::Key Key;
     typedef typename M::Value Value;
 
@@ -331,9 +351,11 @@
   template<class M1,class M2> 
   class SubMap
   {
-    const M1 &m1;
-    const M2 &m2;
+    typename SmartConstReference<M1>::Type m1;
+    typename SmartConstReference<M2>::Type m2;
   public:
+
+    typedef True NeedCopy;
     typedef typename M1::Key Key;
     typedef typename M1::Value Value;
 
@@ -367,9 +389,11 @@
   template<class M1,class M2> 
   class MulMap
   {
-    const M1 &m1;
-    const M2 &m2;
+    typename SmartConstReference<M1>::Type m1;
+    typename SmartConstReference<M2>::Type m2;
   public:
+
+    typedef True NeedCopy;
     typedef typename M1::Key Key;
     typedef typename M1::Value Value;
 
@@ -409,9 +433,11 @@
   template<class M> 
   class ScaleMap
   {
-    const M &m;
+    typename SmartConstReference<M>::Type m;
     typename M::Value v;
   public:
+
+    typedef True NeedCopy;
     typedef typename M::Key Key;
     typedef typename M::Value Value;
 
@@ -445,9 +471,11 @@
   template<class M1,class M2> 
   class DivMap
   {
-    const M1 &m1;
-    const M2 &m2;
+    typename SmartConstReference<M1>::Type m1;
+    typename SmartConstReference<M2>::Type m2;
   public:
+
+    typedef True NeedCopy;
     typedef typename M1::Key Key;
     typedef typename M1::Value Value;
 
@@ -489,12 +517,16 @@
   template<class M1,class M2> 
   class ComposeMap
   {
-    const M1 &m1;
-    const M2 &m2;
+    typename SmartConstReference<M1>::Type m1;
+    typename SmartConstReference<M2>::Type m2;
   public:
+
+    typedef True NeedCopy;
     typedef typename M2::Key Key;
     typedef typename M1::Value Value;
 
+    typedef True NeedCopy;
+
     ///Constructor
 
     ///\e
@@ -536,13 +568,15 @@
   ///to \c V.
   ///\todo Check the requirements.
 
-  template<class M1,class M2,class F,class V> 
+  template<class M1,class M2,class F,class V = typename F::result_type> 
   class CombineMap
   {
-    const M1 &m1;
-    const M2 &m2;
-    const F &f;
+    typename SmartConstReference<M1>::Type m1;
+    typename SmartConstReference<M2>::Type m2;
+    F f;
   public:
+
+    typedef True NeedCopy;
     typedef typename M1::Key Key;
     typedef V Value;
 
@@ -571,10 +605,10 @@
   ///\endcode
   ///
   ///\relates CombineMap
-  template<class V,class M1,class M2,class F> 
-  inline CombineMap<M1,M2,F,V> combineMap(const M1 &m1,const M2 &m2,const F &f) 
+  template<class M1,class M2,class F> 
+  inline CombineMap<M1,M2,F> combineMap(const M1 &m1,const M2 &m2,const F &f) 
   {
-    return CombineMap<M1,M2,F,V>(m1,m2,f);
+    return CombineMap<M1,M2,F>(m1,m2,f);
   }
 
   ///Negative value of a map
@@ -588,8 +622,10 @@
   template<class M> 
   class NegMap
   {
-    const M &m;
+    typename SmartConstReference<M>::Type m;
   public:
+
+    typedef True NeedCopy;
     typedef typename M::Key Key;
     typedef typename M::Value Value;
 
@@ -638,8 +674,10 @@
   template<class M> 
   class AbsMap
   {
-    const M &m;
+    typename SmartConstReference<M>::Type m;
   public:
+
+    typedef True NeedCopy;
     typedef typename M::Key Key;
     typedef typename M::Value Value;
 
@@ -679,6 +717,8 @@
   {
     const F &f;
   public:
+
+    typedef True NeedCopy;
     typedef K Key;
     typedef V Value;
 
@@ -714,8 +754,10 @@
   template<class M> 
   class MapFunctor
   {
-    const M &m;
+    typename SmartConstReference<M>::Type m;
   public:
+
+    typedef True NeedCopy;
     typedef typename M::Key argument_type;
     typedef typename M::Value result_type;
     typedef typename M::Key Key;
@@ -761,9 +803,11 @@
   template<class M1,class M2> 
   class ForkMap
   {
-    const M1 &m1;
-    const M2 &m2;
+    typename SmartConstReference<M1>::Type m1;
+    typename SmartConstReference<M2>::Type m2;
   public:
+
+    typedef True NeedCopy;
     typedef typename M1::Key Key;
     typedef typename M1::Value Value;
 

Modified: hugo/trunk/src/lemon/xy.h
==============================================================================
--- hugo/trunk/src/lemon/xy.h	(original)
+++ hugo/trunk/src/lemon/xy.h	Sat May 14 19:37:33 2005
@@ -18,6 +18,7 @@
 #define LEMON_XY_H
 
 #include <iostream>
+#include <lemon/utility.h>
 
 ///\ingroup misc
 ///\file
@@ -350,12 +351,14 @@
   template<class M>
   class XMap 
   {
-    M &_map;
+    typename SmartReference<M>::Type _map;
   public:
+    typedef True NeedCopy;
+
     typedef typename M::Value::Value Value;
     typedef typename M::Key Key;
     ///\e
-    XMap(M &map) : _map(map) {}
+    XMap(typename SmartParameter<M>::Type map) : _map(map) {}
     Value operator[](Key k) const {return _map[k].x;}
     void set(Key k,Value v) {_map.set(k,typename M::Value(v,_map[k].y));}
   };
@@ -372,6 +375,12 @@
     return XMap<M>(m);
   }
 
+  template<class M> 
+  inline XMap<M> xMap(const M &m) 
+  {
+    return XMap<M>(m);
+  }
+
   ///Constant (read only) version of \ref XMap
 
   ///\ingroup maps
@@ -379,8 +388,10 @@
   template<class M>
   class ConstXMap 
   {
-    const M &_map;
+    typename SmartConstReference<M>::Type _map;
   public:
+    typedef True NeedCopy;
+
     typedef typename M::Value::Value Value;
     typedef typename M::Key Key;
     ///\e
@@ -407,12 +418,14 @@
   template<class M>
   class YMap 
   {
-    M &_map;
+    typename SmartReference<M>::Type _map;
   public:
+    typedef True NeedCopy;
+
     typedef typename M::Value::Value Value;
     typedef typename M::Key Key;
     ///\e
-    YMap(M &map) : _map(map) {}
+    YMap(typename SmartParameter<M>::Type map) : _map(map) {}
     Value operator[](Key k) const {return _map[k].y;}
     void set(Key k,Value v) {_map.set(k,typename M::Value(_map[k].x,v));}
   };
@@ -429,6 +442,12 @@
     return YMap<M>(m);
   }
 
+  template<class M> 
+  inline YMap<M> yMap(const M &m) 
+  {
+    return YMap<M>(m);
+  }
+
   ///Constant (read only) version of \ref YMap
 
   ///\ingroup maps
@@ -436,8 +455,10 @@
   template<class M>
   class ConstYMap 
   {
-    const M &_map;
+    typename SmartConstReference<M>::Type _map;
   public:
+    typedef True NeedCopy;
+
     typedef typename M::Value::Value Value;
     typedef typename M::Key Key;
     ///\e
@@ -466,8 +487,10 @@
   template<class M>
   class NormSquareMap 
   {
-    const M &_map;
+    typename SmartConstReference<M>::Type _map;
   public:
+    typedef True NeedCopy;
+
     typedef typename M::Value::Value Value;
     typedef typename M::Key Key;
     ///\e



More information about the Lemon-commits mailing list