src/simulator/nstime.h
changeset 159 e2c8e211039e
parent 158 47af319de4b8
child 162 5b398ac221c7
--- a/src/simulator/nstime.h	Fri Nov 03 09:28:29 2006 +0100
+++ b/src/simulator/nstime.h	Fri Nov 03 10:22:45 2006 +0100
@@ -27,6 +27,51 @@
 
 namespace ns3 {
 
+/**
+ * \brief keep track of time unit.
+ *
+ * This template class is used to keep track of the value 
+ * of a specific time unit: the type TimeUnit<1> is used to 
+ * keep track of seconds, the type TimeUnit<2> is used to keep
+ * track of seconds squared, the type TimeUnit<-1> is used to
+ * keep track of 1/seconds, etc.
+ *
+ * This base class defines all the functionality shared by all
+ * these time unit objects: it defines all the classic arithmetic
+ * operators +, -, *, /, and all the classic comparison operators:
+ * ==, !=, <, >, <=, >=. It is thus easy to add, substract, or 
+ * multiply multiple TimeUnit objects. The return type of any such
+ * arithmetic expression is always a TimeUnit object.
+ *
+ * The ns3::Scalar, ns3::Time, ns3::TimeSquare, and ns3::TimeInvert classes 
+ * are aliases for the TimeUnit<0>, TimeUnit<1>, TimeUnit<2> and TimeUnit<-1>
+ * types respectively.
+ *
+ * For example:
+ * \code
+ * Time<1> t1 = Seconds (10.0);
+ * Time<1> t2 = Seconds (10.0);
+ * Time<2> t3 = t1 * t2;
+ * Time<0> t4 = t1 / t2;
+ * Time<3> t5 = t3 * t1;
+ * Time<-2> t6 = t1 / t5;
+ * TimeSquare t7 = t3;
+ * Scalar s = t4;
+ * \endcode
+ *
+ * If you try to assign the result of an expression which does not 
+ * match the type of the variable it is assigned to, you will get a
+ * compiler error. For example, the following will not compile:
+ * \code
+ * Time<1> = Seconds (10.0) * Seconds (1.5);
+ * \endcode
+ *
+ * You can also use the following non-member functions to manipulate
+ * any of these ns3::TimeUnit object:
+ *  - \ref ns3-Time-Abs ns3::Abs
+ *  - \ref ns3-Time-Max ns3::Max
+ *  - \ref ns3-Time-Min ns3::Min
+ */
 template <int N>
 class TimeUnit
 {
@@ -35,12 +80,32 @@
   TimeUnit (TimeUnit const &o);
   TimeUnit operator = (TimeUnit const &o);
   TimeUnit (HighPrecision data);
+
+  /**
+   * \return the ns3::HighPrecision object which holds the value 
+   *         stored in this Time<N> type.
+   */
   HighPrecision GetHighPrecision (void) const;
 
+  /**
+   * \return true if the time is zero, false otherwise.
+   */
   bool IsZero (void) const;
+  /**
+   * \return true if the time is negative or zero, false otherwise.
+   */
   bool IsNegative (void) const;
+  /**
+   * \return true if the time is positive or zero, false otherwise.
+   */
   bool IsPositive (void) const;
+  /**
+   * \return true if the time is strictly negative, false otherwise.
+   */
   bool IsStrictlyNegative (void) const;
+  /**
+   * \return true if the time is strictly positive, false otherwise.
+   */
   bool IsStrictlyPositive (void) const;
 
 private:
@@ -167,11 +232,24 @@
   return TimeUnit<N1-N2> (retval);
 }
 
+/**
+ * \anchor ns3-Time-Abs
+ * \relates ns3::TimeUnit
+ * \param time the input value
+ * \returns the absolute value of the input value.
+ */
 template <int N>
 TimeUnit<N> Abs (TimeUnit<N> const &time)
 {
   return TimeUnit<N> (Abs (time.GetHighPrecision ()));
 }
+/**
+ * \anchor ns3-Time-Max
+ * \relates ns3::TimeUnit
+ * \param ta the first value
+ * \param tb the seconds value
+ * \returns the max of the two input values.
+ */
 template <int N>
 TimeUnit<N> Max (TimeUnit<N> const &ta, TimeUnit<N> const &tb)
 {
@@ -179,6 +257,13 @@
   HighPrecision b = tb.GetHighPrecision ();  
   return TimeUnit<N> (Max (a, b));
 }
+/**
+ * \anchor ns3-Time-Min
+ * \relates ns3::TimeUnit
+ * \param ta the first value
+ * \param tb the seconds value
+ * \returns the min of the two input values.
+ */
 template <int N>
 TimeUnit<N> Min (TimeUnit<N> const &ta, TimeUnit<N> const &tb)
 {
@@ -187,20 +272,68 @@
   return TimeUnit<N> (Max (a, b));
 }
 
-
+/**
+ * \brief keep track of seconds.
+ *
+ * This is an instance of type ns3::TimeUnit<1>: it is
+ * the return value of the ns3::Simulator::Now method
+ * and is needed for the Simulator::Schedule methods
+ *
+ * Time instances can be created through any of the following classes:
+ *  - ns3::Seconds
+ *  - ns3::MilliSeconds
+ *  - ns3::MicroSeconds
+ *  - ns3::NanoSeconds
+ *  - ns3::Now
+ *
+ * Time instances can be added, substracted, multipled and divided using
+ * the standard C++ operators (if you make sure to obey the rules
+ * of the ns3::TimeUnit class template)
+ * To scale a Time instance, you can multiply it with an instance of
+ * the ns3::Scalar class.
+ * Time instances can also be manipulated through the following non-member 
+ * functions:
+ *  - \ref ns3-Time-Abs ns3::Abs
+ *  - \ref ns3-Time-Max ns3::Max
+ *  - \ref ns3-Time-Min ns3::Min
+ */
 class Time : public TimeUnit<1>
 {
 public:
   Time ();
   Time (TimeUnit<1> time);
 
+  /**
+   * \returns an approximation in seconds of the time stored in this
+   *          instance.
+   */
   double ApproximateToSeconds (void) const;
+  /**
+   * \returns an approximation in milliseconds of the time stored in this
+   *          instance.
+   */
   int32_t ApproximateToMilliSeconds (void) const;
+  /**
+   * \returns an approximation in microseconds of the time stored in this
+   *          instance.
+   */
   int64_t ApproximateToMicroSeconds (void) const;
+  /**
+   * \returns an approximation in nanoseconds of the time stored in this
+   *          instance.
+   */
   int64_t ApproximateToNanoSeconds (void) const;
 };
 
-
+/**
+ * \brief create ns3::Time instances in units of seconds.
+ *
+ * For example:
+ * \code
+ * Time t = Seconds (2.0);
+ * Simulator::Schedule (Now () + NanoSeconds (5.0), ...);
+ * \endcode
+ */
 class Seconds : public TimeUnit<1>
 {
 public:
@@ -208,18 +341,45 @@
   Seconds (double seconds);
 };
 
+/**
+ * \brief create ns3::Time instances in units of milliseconds.
+ *
+ * For example:
+ * \code
+ * Time t = MilliSeconds (2);
+ * Simulator::Schedule (Now () + MilliSeconds (5), ...);
+ * \endcode
+ */
 class MilliSeconds : public TimeUnit<1>
 {
 public:
   MilliSeconds ();
   MilliSeconds (uint32_t ms);
 };
+/**
+ * \brief create ns3::Time instances in units of microseconds.
+ *
+ * For example:
+ * \code
+ * Time t = MicroSeconds (2);
+ * Simulator::Schedule (Now () + MicroSeconds (5), ...);
+ * \endcode
+ */
 class MicroSeconds : public TimeUnit<1>
 {
 public:
   MicroSeconds ();
   MicroSeconds (uint32_t ms);
 };
+/**
+ * \brief create ns3::Time instances in units of nanoseconds.
+ *
+ * For example:
+ * \code
+ * Time t = NanoSeconds (2);
+ * Simulator::Schedule (Now () + NanoSeconds (5), ...);
+ * \endcode
+ */
 class NanoSeconds : public TimeUnit<1>
 {
 public:
@@ -227,13 +387,38 @@
   NanoSeconds (uint32_t ms);
 };
 
+/**
+ * \brief create an ns3::Time instance which contains the
+ *        current simulation time.
+ *
+ * This is really a shortcut for the ns3::Simulator::Now method.
+ * It is typically used as shown below to schedule an event
+ * which expires in 2 seconds from now:
+ * \code
+ * Simulator::Schedule (Now () + Seconds (2.0), &my_function);
+ * \endcode
+ */
 class Now : public Time
 {
 public:
   Now ();
 };
 
-
+/**
+ * \brief hold scalar values
+ *
+ * This class is used both to construct scalar values to multiply
+ * ns3::Time instances and to hold the return value of
+ * an expression which returns a scalar. For example, the 
+ * following code will output on your terminal 1.5:
+ * \code
+ * Scalar s0 = Scalar (1.5);
+ * Time t1 = Seconds (10.0) * s0;
+ * Time t2 = Seconds (10.0) * Scalar (2.5);
+ * Scalar s1 = Seconds (15.0) / Seconds (10.0);
+ * std::cout << s1.GetDouble () << std::endl;
+ * \endcode
+ */
 class Scalar : public TimeUnit<0>
 {
 public: