diff --git a/include/dynamic-graph/signal-time-dependent.h b/include/dynamic-graph/signal-time-dependent.h new file mode 100644 index 0000000000000000000000000000000000000000..14d4a5741019f280dbd7ead076b065eb1be0f45f --- /dev/null +++ b/include/dynamic-graph/signal-time-dependent.h @@ -0,0 +1,153 @@ +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + * Copyright Projet JRL-Japan, 2007 + *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + * + * File: signal-time-dependent.h + * Project: DYNAMIC-GRAPH + * Author: Nicolas Mansard + * + * Version control + * =============== + * + * $Id$ + * + * Description + * ============ + * + * + * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ + + + + +#ifndef __DEPENDENT_SIGNAL_HH +#define __DEPENDENT_SIGNAL_HH + +#include <dynamic-graph/signal.h> + +#include <dynamic-graph/time-dependency.h> + +namespace dynamicgraph { + +template< class T,class Time > +class SignalTimeDependent +: public virtual Signal<T,Time> +, public TimeDependency<Time> +{ + + //TimeDependency<Time> timeDependency; + + public: + SignalTimeDependent( std::string name = "" ); + SignalTimeDependent( const SignalArray_const<Time> & arr + ,std::string name = "" ); + SignalTimeDependent( boost::function2<T&,T&,Time> t + ,const SignalArray_const<Time> & sig + ,std::string name = "" ); + + virtual ~SignalTimeDependent( void ) {} + + inline const T& operator() ( const Time& t1 ){ return access(t1); } + const T& access( const Time& t1 ); + + virtual void addDependency( const SignalBase<Time>& signal ) ; + virtual void removeDependency( const SignalBase<Time>& signal ) ; + virtual void clearDependencies( void ); + + std::ostream& writeGraph(std::ostream &os) const + { return os;} + + std::ostream& displayDependencies( std::ostream& os,const int depth=-1, + std::string space="", + std::string next1="",std::string next2="" ) const + { return TimeDependency<Time>::displayDependencies( os,depth,space,next1,next2 ); } + + + virtual bool needUpdate( const Time& t ) const; + virtual void setPeriodTime( const Time& p ) ; + virtual Time getPeriodTime( void ) const; + +}; + + +/* -------------------------------------------- */ + + +template < class T,class Time > +SignalTimeDependent<T,Time>:: +SignalTimeDependent( std::string name ) + :Signal<T,Time>(name) + ,TimeDependency<Time>(this) + {} + +template< class T,class Time> +SignalTimeDependent<T,Time>:: +SignalTimeDependent( const SignalArray_const<Time> & arr + ,std::string name ) + :Signal<T,Time>(name) + ,TimeDependency<Time>(this,arr) + {} + +template< class T,class Time> +SignalTimeDependent<T,Time>:: + SignalTimeDependent( boost::function2<T&,T&,Time> t + ,const SignalArray_const<Time> & sig + ,std::string name ) + :Signal<T,Time>(name) + ,TimeDependency<Time>(this,sig) + { setFunction(t); } + +template< class T,class Time> + const T& SignalTimeDependent<T,Time>:: +access( const Time& t1 ) + { + const bool up = TimeDependency<Time>::needUpdate(t1); + //SignalBase<Time>::setReady(false); + +/* std::cout << "Time before: "<< signalTime << " -- " */ +/* << t1<< " -> Up: "<<up <<std::endl ; */ + if( up ) + { + TimeDependency<Time>::lastAskForUpdate = false; + const T& Tres = Signal<T,Time>::access(t1); + SignalBase<Time>::setReady(false); + return Tres; + } + else { return Signal<T,Time>::accessCopy(); } + } + + +template< class T,class Time> + void SignalTimeDependent<T,Time>:: +addDependency( const SignalBase<Time>& signal ) + { TimeDependency<Time>::addDependency(signal); } + +template< class T,class Time> + void SignalTimeDependent<T,Time>:: +removeDependency( const SignalBase<Time>& signal ) + { TimeDependency<Time>::removeDependency(signal); } + +template< class T,class Time> + void SignalTimeDependent<T,Time>:: +clearDependencies( void ) + { TimeDependency<Time>::clearDependency(); } + +template< class T,class Time> + bool SignalTimeDependent<T,Time>:: +needUpdate( const Time& t ) const +{ + return TimeDependency<Time>::needUpdate(t); +} + +template< class T,class Time> + void SignalTimeDependent<T,Time>:: +setPeriodTime( const Time& p ) + { TimeDependency<Time>::setPeriodTime( p ); } +template< class T,class Time> + Time SignalTimeDependent<T,Time>:: +getPeriodTime( void ) const + { return TimeDependency<Time>::getPeriodTime(); } + +} // namespace dynamicgraph + +#endif /* #ifndef __DEPENDENT_SIGNAL_HH */