rework param-spec-helper code to avoid having to deal with pointers to member functions et al.
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Wed, 13 Feb 2008 21:00:33 +0100
changeset 2408 04fe819b3ad1
parent 2407 a39f985b9936
child 2409 8744ec60e8e6
rework param-spec-helper code to avoid having to deal with pointers to member functions et al.
src/core/boolean-value.h
src/core/fp-value.h
src/core/int-value.h
src/core/param-spec-helper.h
src/core/random-variable.h
src/core/uint-value.h
src/mobility/rectangle.h
src/mobility/vector.h
src/simulator/nstime.h
--- a/src/core/boolean-value.h	Mon Feb 11 05:11:55 2008 +0100
+++ b/src/core/boolean-value.h	Wed Feb 13 21:00:33 2008 +0100
@@ -25,20 +25,11 @@
 };
 
 
-template <typename T>
-Ptr<ParamSpec> MakeBooleanParamSpec (bool T::*v, bool initialValue);
-
-template <typename T>
-Ptr<ParamSpec> MakeBooleanParamSpec (bool (T::*getter) (void) const, 
-				     bool initialValue);
+template <typename T1>
+Ptr<ParamSpec> MakeBooleanParamSpec (T1 a1, bool initialValue);
 
-template <typename T>
-Ptr<ParamSpec> MakeBooleanParamSpec (bool (T::*getter) (void) const,
-				     void (T::*setter) (bool),
-				     bool initialValue);
-template <typename T>
-Ptr<ParamSpec> MakeBooleanParamSpec (void (T::*setter) (bool),
-				     bool initialValue);
+template <typename T1, typename T2>
+Ptr<ParamSpec> MakeBooleanParamSpec (T1 a1, T2 a2, bool initialValue);
 
 } // namespace ns3
 
@@ -46,33 +37,19 @@
 // Implementation of template functions below.
 namespace ns3 {
 
-template <typename T>
-Ptr<ParamSpec> MakeBooleanParamSpec (bool T::*v, bool initialValue)
+template <typename T1>
+Ptr<ParamSpec> MakeBooleanParamSpec (T1 a1, bool initialValue)
 {
-  return MakeMemberVariableParamSpec (v, BooleanValue (initialValue));
-}
-
-template <typename T>
-Ptr<ParamSpec> MakeBooleanParamSpec (void (T::*setter) (bool),
-				     bool (T::*getter) (void) const,
-				     bool initialValue)
-{
-  return MakeMemberMethodParamSpec (setter, getter, BooleanValue (initialValue));
+  return MakeParamSpecHelper (a1, BooleanValue (initialValue));
 }
 
-template <typename T>
-Ptr<ParamSpec> MakeBooleanParamSpec (bool (T::*getter) (void) const,
-				     bool initialValue)
+template <typename T1, typename T2>
+Ptr<ParamSpec> MakeBooleanParamSpec (T1 a1, T2 a2, bool initialValue)
 {
-  return MakeMemberMethodGetterParamSpec (getter, BooleanValue (initialValue));
+  return MakeParamSpecHelper (a1, a2, BooleanValue (initialValue));
 }
 
-template <typename T>
-Ptr<ParamSpec> MakeBooleanParamSpec (void (T::*setter) (bool),
-				     bool initialValue)
-{
-  return MakeMemberMethodSetterParamSpec (setter, BooleanValue (initialValue));
-}
+
 
 } // namespace ns3
 
--- a/src/core/fp-value.h	Mon Feb 11 05:11:55 2008 +0100
+++ b/src/core/fp-value.h	Wed Feb 13 21:00:33 2008 +0100
@@ -26,11 +26,11 @@
 };
 
 
-template <typename U, typename T>
-Ptr<ParamSpec> MakeFpParamSpec (U T::*memberVariable,
+template <typename T1>
+Ptr<ParamSpec> MakeFpParamSpec (T1 a1,
 				double initialValue);
-template <typename U, typename T>
-Ptr<ParamSpec> MakeFpParamSpec (U T::*memberVariable,
+template <typename T1, typename T2>
+Ptr<ParamSpec> MakeFpParamSpec (T1 a1, T2 a2,
 				double initialValue,
 				double minValue,
 				double maxValue);
@@ -42,37 +42,65 @@
 class FpValueChecker
 {
 public:
-  FpValueChecker (double min, double max);
-  bool Check (double v) const;
+  FpValueChecker (double minValue, double maxValue);
+  bool Check (double value) const;
+
+  template <typename T, typename U>
+  static FpValueChecker Create (U T::*) {
+    return FpValueChecker (-std::numeric_limits<U>::max (),
+			   std::numeric_limits<U>::max ());
+  }
+  template <typename T, typename U>
+  static FpValueChecker Create (U (T::*) (void) const) {
+    return FpValueChecker (-std::numeric_limits<U>::max (),
+			   std::numeric_limits<U>::max ());
+  }
+  template <typename T, typename U>
+  static FpValueChecker Create (void (T::*) (U)) {
+    return FpValueChecker (-std::numeric_limits<U>::max (),
+			   std::numeric_limits<U>::max ());
+  }
 private:
   double m_min;
   double m_max;
 };
 
-template <typename U, typename T>
-Ptr<ParamSpec>
-MakeFpParamSpec (U T::*memberVariable,
-		 double initialValue)
+template <typename T1>
+Ptr<ParamSpec> 
+MakeFpParamSpec (T1 a1,
+		  double initialValue)
 {
-  double minValue = -std::numeric_limits<U>::max ();
-  double maxValue = std::numeric_limits<U>::max ();
-  return MakeMemberVariableParamSpecWithChecker (memberVariable, 
-						 FpValue (initialValue), 
-						 FpValueChecker (minValue, maxValue));
+  return MakeParamSpecHelperWithChecker (a1, FpValue (initialValue),
+					 FpValueChecker::Create (a1));
 }
 
-template <typename U, typename T>
-Ptr<ParamSpec>
-MakeFpParamSpec (U T::*memberVariable,
-		 double initialValue,
-		 double minValue,
-		 double maxValue)
+template <typename T1>
+Ptr<ParamSpec> MakeFpParamSpec (T1 a1,
+				 double initialValue,
+				 double minValue,
+				 double maxValue)
 {
-  return MakeMemberVariableParamSpecWithChecker (memberVariable, 
-						 FpValue (initialValue), 
-						 FpValueChecker (minValue, maxValue));
+  return MakeParamSpecHelperWithChecker (a1, FpValue (initialValue),
+					 FpValueChecker (minValue, maxValue));
+}
+template <typename T1, typename T2>
+Ptr<ParamSpec> MakeFpParamSpec (T1 a1, T2 a2, 
+				 double initialValue)
+{
+  return MakeParamSpecHelperWithChecker (a1, a2, FpValue (initialValue),
+					 FpValueChecker::Create (a1));
+}
+template <typename T1, typename T2>
+Ptr<ParamSpec> MakeFpParamSpec (T1 a1, T2 a2,
+				 double initialValue,
+				 double minValue,
+				 double maxValue)
+{
+  return MakeParamSpecHelperWithChecker (a1, a2, FpValue (initialValue),
+					 FpValueChecker (minValue, maxValue));
 }
 
 } // namespace ns3
 
+
 #endif /* FP_VALUE_H */
--- a/src/core/int-value.h	Mon Feb 11 05:11:55 2008 +0100
+++ b/src/core/int-value.h	Wed Feb 13 21:00:33 2008 +0100
@@ -24,21 +24,19 @@
   int64_t m_value;
 };
 
-template <typename U, typename T>
-Ptr<ParamSpec> MakeIntParamSpec (U T::*memberVariable,
+template <typename T1>
+Ptr<ParamSpec> MakeIntParamSpec (T1 a1,
 				 int64_t initialValue);
-template <typename U, typename T>
-Ptr<ParamSpec> MakeIntParamSpec (U T::*memberVariable,
+template <typename T1>
+Ptr<ParamSpec> MakeIntParamSpec (T1 a1,
 				 int64_t initialValue,
 				 int64_t minValue,
 				 int64_t maxValue);
-template <typename U, typename T>
-Ptr<ParamSpec> MakeIntParamSpec (void (T::*setter) (U),
-				 U (T::*getter) (void) const,
+template <typename T1, typename T2>
+Ptr<ParamSpec> MakeIntParamSpec (T1 a1, T2 a2,
 				 int64_t initialValue);
-template <typename U, typename T>
-Ptr<ParamSpec> MakeIntParamSpec (void (T::*setter) (U),
-				 U (T::*getter) (void) const,
+template <typename T1, typename T2>
+Ptr<ParamSpec> MakeIntParamSpec (T1 a1, T2 a2,
 				 int64_t initialValue,
 				 int64_t minValue,
 				 int64_t maxValue);
@@ -52,54 +50,62 @@
 public:
   IntValueChecker (int64_t minValue, int64_t maxValue);
   bool Check (const int64_t &value) const;
+
+  template <typename T, typename U>
+  static IntValueChecker Create (U T::*) {
+    return IntValueChecker (std::numeric_limits<U>::min (),
+			    std::numeric_limits<U>::max ());
+  }
+  template <typename T, typename U>
+  static IntValueChecker Create (U (T::*) (void) const) {
+    return IntValueChecker (std::numeric_limits<U>::min (),
+			    std::numeric_limits<U>::max ());
+  }
+  template <typename T, typename U>
+  static IntValueChecker Create (void (T::*) (U)) {
+    return IntValueChecker (std::numeric_limits<U>::min (),
+			    std::numeric_limits<U>::max ());
+  }
 private:
   int64_t m_minValue;
   int64_t m_maxValue;
 };
 
-
-template <typename U, typename T>
+template <typename T1>
 Ptr<ParamSpec> 
-MakeIntParamSpec (U T::*memberVariable,
+MakeIntParamSpec (T1 a1,
 		  int64_t initialValue)
 {
-  int64_t minValue = std::numeric_limits<U>::min ();
-  int64_t maxValue = std::numeric_limits<U>::max ();
-  return MakeMemberVariableParamSpecWithChecker (memberVariable, IntValue (initialValue),
-						 IntValueChecker (minValue, maxValue));
+  return MakeParamSpecHelperWithChecker (a1, IntValue (initialValue),
+					 IntValueChecker::Create (a1));
 }
 
-template <typename U, typename T>
-Ptr<ParamSpec> MakeIntParamSpec (U T::*memberVariable,
+template <typename T1>
+Ptr<ParamSpec> MakeIntParamSpec (T1 a1,
 				 int64_t initialValue,
 				 int64_t minValue,
 				 int64_t maxValue)
 {
-  return MakeMemberVariableParamSpecWithChecker (memberVariable, IntValue (initialValue),
-						 IntValueChecker (minValue, maxValue));
+  return MakeParamSpecHelperWithChecker (a1, IntValue (initialValue),
+					 IntValueChecker (minValue, maxValue));
 }
-template <typename U, typename T>
-Ptr<ParamSpec> MakeIntParamSpec (void (T::*setter) (U),
-				 U (T::*getter) (void) const,
+template <typename T1, typename T2>
+Ptr<ParamSpec> MakeIntParamSpec (T1 a1, T2 a2, 
 				 int64_t initialValue)
 {
-  int64_t minValue = std::numeric_limits<U>::min ();
-  int64_t maxValue = std::numeric_limits<U>::max ();
-  return MakeMemberMethodParamSpecWithChecker (setter, getter, IntValue (initialValue),
-					       IntValueChecker (minValue, maxValue));
+  return MakeParamSpecHelperWithChecker (a1, a2, IntValue (initialValue),
+					 IntValueChecker::Create (a1));
 }
-template <typename U, typename T>
-Ptr<ParamSpec> MakeIntParamSpec (void (T::*setter) (U),
-				 U (T::*getter) (void) const,
+template <typename T1, typename T2>
+Ptr<ParamSpec> MakeIntParamSpec (T1 a1, T2 a2,
 				 int64_t initialValue,
 				 int64_t minValue,
 				 int64_t maxValue)
 {
-  return MakeMemberMethodParamSpecWithChecker (setter, getter, IntValue (initialValue),
-					       IntValueChecker (minValue, maxValue));
+  return MakeParamSpecHelperWithChecker (a1, a2, IntValue (initialValue),
+					 IntValueChecker (minValue, maxValue));
 }
 
-
 } // namespace ns3
 
 #endif /* INT_VALUE_H */
--- a/src/core/param-spec-helper.h	Mon Feb 11 05:11:55 2008 +0100
+++ b/src/core/param-spec-helper.h	Wed Feb 13 21:00:33 2008 +0100
@@ -3,23 +3,29 @@
 
 namespace ns3 {
 
-template <typename T, typename U, typename V>
+template <typename T1, typename V>
 Ptr<ParamSpec>
-MakeMemberVariableParamSpec (U T::*memberVariable, V initialValue);
+MakeParamSpecHelper (T1 a1, V initialValue);
+
+template <typename T1, typename T2, typename V>
+Ptr<ParamSpec>
+MakeParamSpecHelper (T1 a1, T2 a2, V initialValue);
 
-template <typename T, typename U, typename V, typename W>
+template <typename T1, typename V, typename CHECKER>
 Ptr<ParamSpec>
-MakeMemberMethodParamSpec (void (T::*setter) (U), 
-			   V (T::*getter) (void) const, 
-			   W initialValue);
+MakeParamSpecHelperWithChecker (T1 a1, V initialValue, CHECKER checker);
 
+template <typename T1, typename T2, typename V, typename CHECKER>
+Ptr<ParamSpec>
+MakeParamSpecHelperWithChecker (T1 a1, T2 a2, V initialValue, CHECKER checker);
 
 } // namespace ns3
 
+/***************************************************************
+ *        The implementation of the above functions.
+ ***************************************************************/
 
-/***************************************************************
- *        The implementation of the above class functions
- ***************************************************************/
+#include "type-traits.h"
 
 namespace ns3 {
 
@@ -48,11 +54,9 @@
   bool Check (const T &value) const {return true;}
 };
 
-
-
 template <typename T, typename U, typename V, typename CHECKER>
 Ptr<ParamSpec>
-MakeMemberVariableParamSpecWithChecker (U T::*memberVariable, V initialValue, CHECKER checker)
+DoMakeParamSpecHelperOne (U T::*memberVariable, V initialValue, CHECKER checker)
 {
   class MemberVariable : public ParamSpecHelper<T,V,CHECKER>
     {
@@ -75,20 +79,92 @@
     };
   return Ptr<ParamSpec> (new MemberVariable (memberVariable, initialValue, checker), false);
 }
+template <typename T, typename U, typename V>
+Ptr<ParamSpec>
+DoMakeParamSpecHelperOne (U T::*memberVariable, V initialValue)
+{
+  return DoMakeParamSpecHelperOne (memberVariable, initialValue, ParamSpecHelperSimpleChecker<U> ());
+}
+
+
+template <typename T, typename U, typename V, typename CHECKER>
+Ptr<ParamSpec>
+DoMakeParamSpecHelperOne (U (T::*getter) (void) const, 
+			  V initialValue, CHECKER checker)
+{
+  class MemberMethod : public ParamSpecHelper<T,V,CHECKER>
+    {
+    public:
+      MemberMethod (U (T::*getter) (void) const,
+		    V initialValue, CHECKER checker)
+	: ParamSpecHelper<T,V,CHECKER> (initialValue, checker),
+	m_getter (getter)
+	{}
+    private:
+      virtual bool DoSet (T *object, const V *v) const {
+	return false;
+      }
+      virtual bool DoGet (const T *object, V *v) const {
+	v->Set ((object->*m_getter) ());
+	return true;
+      }
+      U (T::*m_getter) (void) const;
+    };
+  return Ptr<ParamSpec> (new MemberMethod (getter, initialValue, checker), false);
+}
 
 template <typename T, typename U, typename V>
 Ptr<ParamSpec>
-MakeMemberVariableParamSpec (U T::*memberVariable, V initialValue)
+DoMakeParamSpecHelperOne (U (T::*getter) (void) const, 
+			  V initialValue)
+{
+  return DoMakeParamSpecHelperOne (getter, initialValue, ParamSpecHelperSimpleChecker<U> ());
+}
+
+
+
+template <typename T, typename U, typename V, typename CHECKER>
+Ptr<ParamSpec>
+DoMakeParamSpecHelperOne (void (T::*setter) (U), 
+			  V initialValue, CHECKER checker)
 {
-  return MakeMemberVariableParamSpecWithChecker (memberVariable, initialValue, 
-						 ParamSpecHelperSimpleChecker<U> ());
+  class MemberMethod : public ParamSpecHelper<T,V,CHECKER>
+    {
+    public:
+      MemberMethod (void (T::*setter) (U), 
+		    V initialValue, CHECKER checker)
+	: ParamSpecHelper<T,V,CHECKER> (initialValue, checker),
+	m_setter (setter)
+	{}
+    private:
+      virtual bool DoSet (T *object, const V *v) const {
+	(object->*m_setter) (v->Get ());
+	return true;
+      }
+      virtual void DoGet (const T *object, V *v) const {
+	return false;
+      }
+      void (T::*m_setter) (U);
+    };
+  return Ptr<ParamSpec> (new MemberMethod (setter, initialValue, checker), false);
 }
 
+template <typename T, typename U, typename V>
+Ptr<ParamSpec>
+DoMakeParamSpecHelperOne (void (T::*setter) (U), 
+			  V initialValue)
+{
+  return DoMakeParamSpecHelperOne (setter, initialValue, 
+				   ParamSpecHelperSimpleChecker<typename TypeTraits<U>::ReferencedType> ());
+}
+
+
 template <typename T, typename U, typename V, typename W, typename CHECKER>
 Ptr<ParamSpec>
-MakeMemberMethodParamSpecWithChecker (void (T::*setter) (U), 
-				      V (T::*getter) (void) const, 
-				      W initialValue, CHECKER checker)
+DoMakeParamSpecHelperTwo (void (T::*setter) (U), 
+			  V (T::*getter) (void) const, 
+			  W initialValue, 
+			  CHECKER checker = ParamSpecHelperSimpleChecker<V> ())
 {
   class MemberMethod : public ParamSpecHelper<T,W,CHECKER>
     {
@@ -115,89 +191,32 @@
   return Ptr<ParamSpec> (new MemberMethod (setter, getter, initialValue, checker), false);
 }
 
-
 template <typename T, typename U, typename V, typename W>
 Ptr<ParamSpec>
-MakeMemberMethodParamSpec (void (T::*setter) (U), 
-			   V (T::*getter) (void) const, 
-			   W initialValue)
-{
-  return MakeMemberMethodParamSpecWithChecker (setter, getter, initialValue, 
-					       ParamSpecHelperSimpleChecker<V> ());
-}
-
-
-template <typename T, typename U, typename V, typename CHECKER>
-Ptr<ParamSpec>
-MakeMemberMethodGetterParamSpecWithChecker (U (T::*getter) (void) const, 
-					    V initialValue, CHECKER checker)
+DoMakeParamSpecHelperTwo (void (T::*setter) (U), 
+		      V (T::*getter) (void) const, 
+		      W initialValue)
 {
-  class MemberMethod : public ParamSpecHelper<T,V,CHECKER>
-    {
-    public:
-      MemberMethod (U (T::*getter) (void) const,
-		    V initialValue, CHECKER checker)
-	: ParamSpecHelper<T,V,CHECKER> (initialValue, checker),
-	m_getter (getter)
-	{}
-    private:
-      virtual bool DoSet (T *object, const V *v) const {
-	return false;
-      }
-      virtual bool DoGet (const T *object, V *v) const {
-	v->Set ((object->*m_getter) ());
-	return true;
-      }
-      U (T::*m_getter) (void) const;
-    };
-  return Ptr<ParamSpec> (new MemberMethod (getter, initialValue, checker), false);
+  return DoMakeParamSpecHelperTwo (setter, getter, initialValue, ParamSpecHelperSimpleChecker<V> ());
 }
 
-
-template <typename T, typename U, typename V>
+template <typename T, typename U, typename V, typename W, typename CHECKER>
 Ptr<ParamSpec>
-MakeMemberMethodGetterParamSpec (U (T::*getter) (void) const, 
-				 V initialValue)
+DoMakeParamSpecHelperTwo (V (T::*getter) (void) const, 
+			  void (T::*setter) (U), 
+			  W initialValue, 
+			  CHECKER checker)
 {
-  return MakeMemberMethodGetterParamSpecWithChecker (getter, initialValue, 
-						     ParamSpecHelperSimpleChecker<U> ());
+  return DoMakeParamSpecHelperTwo (setter, getter, initialValue, checker);
 }
 
-
-template <typename T, typename U, typename V, typename CHECKER>
+template <typename T, typename U, typename V, typename W, typename CHECKER>
 Ptr<ParamSpec>
-MakeMemberMethodSetterParamSpecWithChecker (void (T::*setter) (U), 
-					    V initialValue, CHECKER checker)
+DoMakeParamSpecHelperTwo (V (T::*getter) (void) const, 
+			  void (T::*setter) (U), 
+			  W initialValue)
 {
-  class MemberMethod : public ParamSpecHelper<T,V,CHECKER>
-    {
-    public:
-      MemberMethod (void (T::*setter) (U), 
-		    V initialValue, CHECKER checker)
-	: ParamSpecHelper<T,V,CHECKER> (initialValue, checker),
-	m_setter (setter)
-	{}
-    private:
-      virtual bool DoSet (T *object, const V *v) const {
-	(object->*m_setter) (v->Get ());
-	return true;
-      }
-      virtual void DoGet (const T *object, V *v) const {
-	return false;
-      }
-      void (T::*m_setter) (U);
-    };
-  return Ptr<ParamSpec> (new MemberMethod (setter, initialValue, checker), false);
-}
-
-
-template <typename T, typename U, typename V>
-Ptr<ParamSpec>
-MakeMemberMethodParamSpec (void (T::*setter) (U), 
-			   V initialValue)
-{
-  return MakeMemberMethodSetterParamSpecWithChecker (setter, initialValue, 
-						     ParamSpecHelperSimpleChecker<U> ());
+  return DoMakeParamSpecHelperTwo (setter, getter, initialValue);
 }
 
 
@@ -263,6 +282,36 @@
   return m_initialValue.Copy ();
 }
 
+
+
+template <typename T1, typename V>
+Ptr<ParamSpec>
+MakeParamSpecHelper (T1 a1, V initialValue)
+{
+  return DoMakeParamSpecHelperOne (a1, initialValue);
+}
+
+template <typename T1, typename T2, typename V>
+Ptr<ParamSpec>
+MakeParamSpecHelper (T1 a1, T2 a2, V initialValue)
+{
+  return DoMakeParamSpecHelperTwo (a1, a2, initialValue);
+}
+
+template <typename T1, typename V, typename CHECKER>
+Ptr<ParamSpec>
+MakeParamSpecHelperWithChecker (T1 a1, V initialValue, CHECKER checker)
+{
+  return DoMakeParamSpecHelperOne (a1, initialValue, checker);
+}
+
+template <typename T1, typename T2, typename V, typename CHECKER>
+Ptr<ParamSpec>
+MakeParamSpecHelperWithChecker (T1 a1, T2 a2, V initialValue, CHECKER checker)
+{
+  return DoMakeParamSpecHelperTwo (a1, a2, initialValue, checker);
+}
+
 } // namespace ns3
 
 #endif /* PARAM_SPEC_HELPER_H */
--- a/src/core/random-variable.h	Mon Feb 11 05:11:55 2008 +0100
+++ b/src/core/random-variable.h	Wed Feb 13 21:00:33 2008 +0100
@@ -673,21 +673,33 @@
   RandomVariable m_variable;
 };
 
-template <typename T>
-Ptr<ParamSpec> MakeRandomVariableParamSpec (RandomVariable T::*m_memberVariable,
+template <typename T1>
+Ptr<ParamSpec> MakeRandomVariableParamSpec (T1 a1,
                                             RandomVariable initialValue);
+template <typename T1, typename T2>
+Ptr<ParamSpec> MakeRandomVariableParamSpec (T1 a1, T2 a2,
+                                            RandomVariable initialValue);
+
 
 }//namespace ns3
 
 
 namespace ns3 {
 
-template <typename T>
-Ptr<ParamSpec> MakeRandomVariableParamSpec (RandomVariable T::*memberVariable,
+template <typename T1>
+Ptr<ParamSpec> MakeRandomVariableParamSpec (T1 a1,
                                             RandomVariable initialValue)
 {
-  return MakeMemberVariableParamSpec (memberVariable, RandomVariableValue (initialValue));
+  return MakeParamSpecHelper (a1, RandomVariableValue (initialValue));
 }
 
+template <typename T1, typename T2>
+Ptr<ParamSpec> MakeRandomVariableParamSpec (T1 a1, T2 a2,
+                                            RandomVariable initialValue)
+{
+  return MakeParamSpecHelper (a1, a2, RandomVariableValue (initialValue));
+}
+
+
 } // namespace ns3
 #endif
--- a/src/core/uint-value.h	Mon Feb 11 05:11:55 2008 +0100
+++ b/src/core/uint-value.h	Wed Feb 13 21:00:33 2008 +0100
@@ -24,24 +24,22 @@
   uint64_t m_value;
 };
 
-template <typename U, typename T>
-Ptr<const ParamSpec> MakeUintParamSpec (uint64_t initialValue,
-					U T::*memberVariable);
-template <typename U, typename T>
-Ptr<const ParamSpec> MakePtrUintParamSpec (uint64_t initialValue,
-					   uint64_t minValue,
-					   uint64_t maxValue,
-					   U T::*memberVariable);
-template <typename U, typename T>
-Ptr<const ParamSpec> MakeUintParamSpec (uint64_t initialValue,
-					void (T::*setter) (U),
-					U (T::*getter) (void) const);
-template <typename U, typename T>
-Ptr<const ParamSpec> MakeUintParamSpec (uint64_t initialValue,
-					uint64_t minValue,
-					uint64_t maxValue,
-					void (T::*setter) (U),
-					U (T::*getter) (void) const);
+template <typename T1>
+Ptr<ParamSpec> MakeUintParamSpec (T1 a1,
+				 uint64_t initialValue);
+template <typename T1>
+Ptr<ParamSpec> MakeUintParamSpec (T1 a1,
+				 uint64_t initialValue,
+				 uint64_t minValue,
+				 uint64_t maxValue);
+template <typename T1, typename T2>
+Ptr<ParamSpec> MakeUintParamSpec (T1 a1, T2 a2,
+				 uint64_t initialValue);
+template <typename T1, typename T2>
+Ptr<ParamSpec> MakeUintParamSpec (T1 a1, T2 a2,
+				 uint64_t initialValue,
+				 uint64_t minValue,
+				 uint64_t maxValue);
 
 } // namespace ns3
 
@@ -52,56 +50,61 @@
 public:
   UintValueChecker (uint64_t minValue, uint64_t maxValue);
   bool Check (const uint64_t &value) const;
+
+  template <typename T, typename U>
+  static UintValueChecker Create (U T::*) {
+    return UintValueChecker (std::numeric_limits<U>::min (),
+			    std::numeric_limits<U>::max ());
+  }
+  template <typename T, typename U>
+  static UintValueChecker Create (U (T::*) (void) const) {
+    return UintValueChecker (std::numeric_limits<U>::min (),
+			    std::numeric_limits<U>::max ());
+  }
+  template <typename T, typename U>
+  static UintValueChecker Create (void (T::*) (U)) {
+    return UintValueChecker (std::numeric_limits<U>::min (),
+			    std::numeric_limits<U>::max ());
+  }
 private:
   uint64_t m_minValue;
   uint64_t m_maxValue;
 };
 
-template <typename U, typename T>
-Ptr<const ParamSpec> 
-MakeUintParamSpec (U T::*memberVariable,
-		   uint64_t initialValue)
+template <typename T1>
+Ptr<ParamSpec> 
+MakeUintParamSpec (T1 a1,
+		  uint64_t initialValue)
 {
-  uint64_t minValue = std::numeric_limits<U>::min ();
-  uint64_t maxValue = std::numeric_limits<U>::max ();
-  return MakeMemberVariableParamSpecWithChecker (memberVariable, UintValue (initialValue),
-						 UintValueChecker (minValue, maxValue));
-}
-
-template <typename U, typename T>
-Ptr<const ParamSpec> 
-MakeUintParamSpec (U T::*memberVariable,
-		   uint64_t initialValue,
-		   uint64_t minValue,
-		   uint64_t maxValue)
-{
-  return MakeMemberVariableParamSpecWithChecker (memberVariable, UintValue (initialValue),
-						 UintValueChecker (minValue, maxValue));
+  return MakeParamSpecHelperWithChecker (a1, UintValue (initialValue),
+					 UintValueChecker::Create (a1));
 }
 
-template <typename U, typename T>
-Ptr<const ParamSpec> 
-MakeUintParamSpec (void (T::*setter) (U),
-		   U (T::*getter) (void) const,
-		   uint64_t initialValue)
+template <typename T1>
+Ptr<ParamSpec> MakeUintParamSpec (T1 a1,
+				 uint64_t initialValue,
+				 uint64_t minValue,
+				 uint64_t maxValue)
 {
-  uint64_t minValue = std::numeric_limits<U>::min ();
-  uint64_t maxValue = std::numeric_limits<U>::max ();
-  return MakeMemberMethodParamSpecWithChecker (setter, getter, UintValue (initialValue),
-					       UintValueChecker (minValue, maxValue));
+  return MakeParamSpecHelperWithChecker (a1, UintValue (initialValue),
+					 UintValueChecker (minValue, maxValue));
 }
-template <typename U, typename T>
-Ptr<const ParamSpec> 
-MakeUintParamSpec (void (T::*setter) (U),
-		   U (T::*getter) (void) const,
-		   uint64_t initialValue,
-		   uint64_t minValue,
-		   uint64_t maxValue)
+template <typename T1, typename T2>
+Ptr<ParamSpec> MakeUintParamSpec (T1 a1, T2 a2, 
+				 uint64_t initialValue)
 {
-  return MakeMemberMethodParamSpecWithChecker (setter, getter, UintValue (initialValue),
-					       UintValueChecker (minValue, maxValue));
+  return MakeParamSpecHelperWithChecker (a1, a2, UintValue (initialValue),
+					 UintValueChecker::Create (a1));
 }
-
+template <typename T1, typename T2>
+Ptr<ParamSpec> MakeUintParamSpec (T1 a1, T2 a2,
+				 uint64_t initialValue,
+				 uint64_t minValue,
+				 uint64_t maxValue)
+{
+  return MakeParamSpecHelperWithChecker (a1, a2, UintValue (initialValue),
+					 UintValueChecker (minValue, maxValue));
+}
 
 } // namespace ns3
 
--- a/src/mobility/rectangle.h	Mon Feb 11 05:11:55 2008 +0100
+++ b/src/mobility/rectangle.h	Wed Feb 13 21:00:33 2008 +0100
@@ -87,22 +87,29 @@
   Rectangle m_rectangle;
 };
 
-template <typename T>
-Ptr<ParamSpec> MakeRectangleParamSpec (Rectangle T::*memberVariable,
+template <typename T1>
+Ptr<ParamSpec> MakeRectangleParamSpec (T1 a1,
+                                       Rectangle initialValue);
+template <typename T1, typename T2>
+Ptr<ParamSpec> MakeRectangleParamSpec (T1 a1, T2 a2,
                                        Rectangle initialValue);
 
 } // namespace ns3
 
 namespace ns3 {
 
-template <typename T>
-Ptr<ParamSpec>
-MakeRectangleParamSpec (Rectangle T::*memberVariable,
-                        Rectangle initialValue)
+template <typename T1>
+Ptr<ParamSpec> MakeRectangleParamSpec (T1 a1,
+                                       Rectangle initialValue)
 {
-  return MakeMemberVariableParamSpec (memberVariable, RectangleValue (initialValue));
+  return MakeParamSpecHelper (a1, RectangleValue (initialValue));
 }
-
+template <typename T1, typename T2>
+Ptr<ParamSpec> MakeRectangleParamSpec (T1 a1, T2 a2,
+                                       Rectangle initialValue)
+{
+  return MakeParamSpecHelper (a1, a2, RectangleValue (initialValue));
+}
 
 } // namespace ns3
 
--- a/src/mobility/vector.h	Mon Feb 11 05:11:55 2008 +0100
+++ b/src/mobility/vector.h	Wed Feb 13 21:00:33 2008 +0100
@@ -82,53 +82,34 @@
   Vector m_vector;
 };
 
-template <typename T>
-Ptr<ParamSpec>
-MakeVectorParamSpec (Vector T::*memberVariable, const Vector &initialValue);
-
-template <typename T>
+template <typename T1>
 Ptr<ParamSpec>
-MakeVectorParamSpec (void (T::*setter) (const Vector &), 
-                     Vector (T::*getter) (void) const,
-                     const Vector &initialValue);
+MakeVectorParamSpec (T1 a1, const Vector &initialValue);
 
-template <typename T>
+template <typename T1, typename T2>
 Ptr<ParamSpec>
-MakeVectorParamSpec (Vector (T::*getter) (void) const,
+MakeVectorParamSpec (T1 a1, T2 a2,
                      const Vector &initialValue);
 
-
 } // namespace ns3
 
 namespace ns3 {
 
-template <typename T>
+template <typename T1>
 Ptr<ParamSpec>
-MakeVectorParamSpec (Vector T::*memberVariable, const Vector &initialValue)
+MakeVectorParamSpec (T1 a1, const Vector &initialValue)
 {
-  return MakeMemberVariableParamSpec (memberVariable, VectorValue (initialValue));
+  return MakeParamSpecHelper (a1, VectorValue (initialValue));
 }
 
-template <typename T>
+template <typename T1, typename T2>
 Ptr<ParamSpec>
-MakeVectorParamSpec (void (T::*setter) (const Vector &), 
-                     Vector (T::*getter) (void) const,
+MakeVectorParamSpec (T1 a1, T2 a2,
                      const Vector &initialValue)
 {
-  return MakeMemberMethodParamSpec (setter, getter, VectorValue (initialValue));
+  return MakeParamSpecHelper (a1, a2, VectorValue (initialValue));
 }
 
-template <typename T>
-Ptr<ParamSpec>
-MakeVectorParamSpec (Vector (T::*getter) (void) const,
-                     const Vector &initialValue)
-{
-  return MakeMemberMethodGetterParamSpec (getter, VectorValue (initialValue));
-}
-
-
-
-
 } // namespace ns3
 
 #endif /* VECTOR_H */
--- a/src/simulator/nstime.h	Mon Feb 11 05:11:55 2008 +0100
+++ b/src/simulator/nstime.h	Wed Feb 13 21:00:33 2008 +0100
@@ -688,19 +688,30 @@
   Time m_time;
 };
 
-template <typename T>
-Ptr<ParamSpec> MakeTimeParamSpec (Time T::*memberVariable,
+template <typename T1>
+Ptr<ParamSpec> MakeTimeParamSpec (T1 a1,
                                   Time initialValue);
+template <typename T1, typename T2>
+Ptr<ParamSpec> MakeTimeParamSpec (T1 a1, T2 a2,
+                                  Time initialValue);
+
 
 } // namespace ns3
 
 namespace ns3 {
 
-template <typename T>
-Ptr<ParamSpec> MakeTimeParamSpec (Time T::*memberVariable,
+template <typename T1>
+Ptr<ParamSpec> MakeTimeParamSpec (T1 a1,
                                   Time initialValue)
 {
-  return MakeMemberVariableParamSpec (memberVariable, TimeValue (initialValue));
+  return MakeParamSpecHelper (a1, TimeValue (initialValue));
+}
+
+template <typename T1, typename T2>
+Ptr<ParamSpec> MakeTimeParamSpec (T1 a1, T2 a2,
+                                  Time initialValue)
+{
+  return MakeParamSpecHelper (a1, a2, TimeValue (initialValue));
 }