diff -r ac4f18445e75 -r 76cd1fcea02d src/common/ui-variable-tracer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/common/ui-variable-tracer.h Mon Sep 04 15:09:58 2006 +0200 @@ -0,0 +1,239 @@ +/* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */ +/* + * Copyright (c) 2006 INRIA + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Mathieu Lacage + */ + +#ifndef UI_VARIABLE_TRACER_H +#define UI_VARIABLE_TRACER_H + +#include "ns3/callback.h" +#include + +namespace ns3 { + +class UiVariableTracerBase { +public: + typedef Callback ChangeNotifyCallback; + + UiVariableTracerBase () + : m_callback () {} + /* We don't want to copy the base callback. Only set_callback on + * a specific instance will do something to it. */ + UiVariableTracerBase (UiVariableTracerBase const &o) + : m_callback () {} + UiVariableTracerBase &operator = (UiVariableTracerBase const &o) { + return *this; + } + ~UiVariableTracerBase () {} + + void set_callback(ChangeNotifyCallback callback) { + m_callback = callback; + } +protected: + void notify (uint64_t old_val, uint64_t new_val) { + if (old_val != new_val && !m_callback.is_null ()) { + m_callback (old_val, new_val); + } + } +private: + ChangeNotifyCallback m_callback; +}; + +template +class SiVariableTracer; + + +/** + * \brief trace variables of type "unsigned integer" + * + * This template class implements a POD type: it + * behaves like any other variable of type "unsigned integer" + * except that it also reports any changes to its + * value with its internal callback. + * + * To instantiate a 32-bit unsigned variable (to store + * a TCP counter for example), you would create a variable of type + * ns3::UiVariableTracer : + \code + #include + #include "ns3/ui-traced-variable.tcc" + + ns3::UiVariableTracer var; + \endcode + * and you would use it like any other variable of type uint32_t: + \code + var += 12; + var = 10; + \endcode + */ +template +class UiVariableTracer : public UiVariableTracerBase { +public: + UiVariableTracer () + : m_var () + {} + UiVariableTracer (T const &var) + : m_var (var) + {} + + UiVariableTracer &operator = (UiVariableTracer const &o) { + assign (o.get ()); + return *this; + } + template + UiVariableTracer &operator = (UiVariableTracer const &o) { + assign (o.get ()); + return *this; + } + template + UiVariableTracer &operator = (SiVariableTracer const &o) { + assign (o.get ()); + return *this; + } + UiVariableTracer &operator++ () { + assign (get () + 1); + return *this; + } + UiVariableTracer &operator-- () { + assign (get () - 1); + return *this; + } + UiVariableTracer operator++ (int) { + UiVariableTracer old (*this); + ++*this; + return old; + } + UiVariableTracer operator-- (int) { + UiVariableTracer old (*this); + --*this; + return old; + } + operator T () const { + return get (); + } + + + void assign (T var) { + notify (m_var, var); + m_var = var; + } + T get (void) const { + return m_var; + } + +private: + T m_var; +}; + +template +UiVariableTracer &operator += (UiVariableTracer &lhs, UiVariableTracer const &rhs) { + lhs.assign (lhs.get () + rhs.get ()); + return lhs; +} +template +UiVariableTracer &operator -= (UiVariableTracer &lhs, UiVariableTracer const &rhs) { + lhs.assign (lhs.get () - rhs.get ()); + return lhs; +} +template +UiVariableTracer &operator *= (UiVariableTracer &lhs, UiVariableTracer const &rhs) { + lhs.assign (lhs.get () * rhs.get ()); + return lhs; +} +template +UiVariableTracer &operator /= (UiVariableTracer &lhs, UiVariableTracer const &rhs) { + lhs.assign (lhs.get () / rhs.get ()); + return lhs; +} +template +UiVariableTracer &operator <<= (UiVariableTracer &lhs, UiVariableTracer const &rhs) { + lhs.assign (lhs.get () << rhs.get ()); + return lhs; +} +template +UiVariableTracer &operator >>= (UiVariableTracer &lhs, UiVariableTracer const &rhs) { + lhs.assign (lhs.get () >> rhs.get ()); + return lhs; +} +template +UiVariableTracer &operator &= (UiVariableTracer &lhs, UiVariableTracer const &rhs) { + lhs.assign (lhs.get () & rhs.get ()); + return lhs; +} +template +UiVariableTracer &operator |= (UiVariableTracer &lhs, UiVariableTracer const &rhs) { + lhs.assign (lhs.get () | rhs.get ()); + return lhs; +} +template +UiVariableTracer &operator ^= (UiVariableTracer &lhs, UiVariableTracer const &rhs) { + lhs.assign (lhs.get () ^ rhs.get ()); + return lhs; +} + + +template +UiVariableTracer &operator += (UiVariableTracer &lhs, U const &rhs) { + lhs.assign (lhs.get () + rhs); + return lhs; +} +template +UiVariableTracer &operator -= (UiVariableTracer &lhs, U const &rhs) { + lhs.assign (lhs.get () - rhs); + return lhs; +} +template +UiVariableTracer &operator *= (UiVariableTracer &lhs, U const &rhs) { + lhs.assign (lhs.get () * rhs); + return lhs; +} +template +UiVariableTracer &operator /= (UiVariableTracer &lhs, U const &rhs) { + lhs.assign (lhs.get () / rhs); + return lhs; +} +template +UiVariableTracer &operator <<= (UiVariableTracer &lhs, U const &rhs) { + lhs.assign (lhs.get () << rhs); + return lhs; +} +template +UiVariableTracer &operator >>= (UiVariableTracer &lhs, U const &rhs) { + lhs.assign (lhs.get () >> rhs); + return lhs; +} +template +UiVariableTracer &operator &= (UiVariableTracer &lhs, U const &rhs) { + lhs.assign (lhs.get () & rhs); + return lhs; +} +template +UiVariableTracer &operator |= (UiVariableTracer &lhs, U const &rhs) { + lhs.assign (lhs.get () | rhs); + return lhs; +} +template +UiVariableTracer &operator ^= (UiVariableTracer &lhs, U const &rhs) { + lhs.assign (lhs.get () ^ rhs); + return lhs; +} + +}; // namespace ns3 + +#endif /* UI_VARIABLE_TRACER_H */