• Main Page
  • Related Pages
  • Modules
  • Data Structures
  • Files
  • File List
  • Globals

sst/core/clock.h

00001 // Copyright 2009-2010 Sandia Corporation. Under the terms
00002 // of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S.
00003 // Government retains certain rights in this software.
00004 // 
00005 // Copyright (c) 2009-2010, Sandia Corporation
00006 // All rights reserved.
00007 // 
00008 // This file is part of the SST software package. For license
00009 // information, see the LICENSE file in the top level directory of the
00010 // distribution.
00011 
00012 
00013 #ifndef SST_CLOCK_H
00014 #define SST_CLOCK_H
00015 
00016 #include <deque>
00017 #include <list>
00018 #include <vector>
00019 
00020 #include <sst/core/action.h>
00021 //#include <sst/core/clockHandler.h>
00022 
00023 #define _CLE_DBG( fmt, args...)__DBG( DBG_CLOCK, Clock, fmt, ## args )
00024 
00025 namespace SST {
00026 
00027 class TimeConverter;
00028 
00029 class Clock : public Action
00030 {
00031 public:
00032 //     typedef enum { DEFAULT, PRE, POST } Which_t;
00033 
00034     Clock( TimeConverter* period );
00035 
00036     // Functor classes for Clock handling
00037     class HandlerBase {
00038     public:
00039         virtual bool operator()(Cycle_t) = 0;
00040         virtual ~HandlerBase() {}
00041     };
00042     
00043 
00044     template <typename classT, typename argT = void>
00045     class Handler : public HandlerBase {
00046     private:
00047         typedef bool (classT::*PtrMember)(Cycle_t, argT);
00048         classT* object;
00049         const PtrMember member;
00050         argT data;
00051         
00052     public:
00053         Handler( classT* const object, PtrMember member, argT data ) :
00054             object(object),
00055             member(member),
00056             data(data)
00057         {}
00058 
00059             bool operator()(Cycle_t cycle) {
00060                 return (object->*member)(cycle,data);
00061             }
00062     };
00063     
00064     template <typename classT>
00065     class Handler<classT, void> : public HandlerBase {
00066     private:
00067         typedef bool (classT::*PtrMember)(Cycle_t);
00068         classT* object;
00069         const PtrMember member;
00070         
00071     public:
00072         Handler( classT* const object, PtrMember member ) :
00073             object(object),
00074             member(member)
00075         {}
00076 
00077             bool operator()(Cycle_t cycle) {
00078                 return (object->*member)(cycle);
00079             }
00080     };
00081 
00082 
00083     
00084 //     bool HandlerRegister( Which_t which, Clock::HandlerBase* handler ); 
00085 //     bool HandlerUnregister( Which_t which, Clock::HandlerBase* handler, bool& empty );
00086     bool HandlerRegister( Clock::HandlerBase* handler ); 
00087     bool HandlerUnregister( Clock::HandlerBase* handler, bool& empty );
00088 
00089     
00090 private:
00091 //     typedef std::deque<Clock::HandlerBase*> HandlerMap_t;
00092 //     typedef std::vector<Clock::HandlerBase*> HandlerMap_t;
00093     typedef std::list<Clock::HandlerBase*> HandlerMap_t;
00094 
00095     Clock() { }
00096 
00097     void execute( void );
00098 
00099     Cycle_t         currentCycle;
00100     TimeConverter*  period;
00101     HandlerMap_t    handlerMap;
00102 
00103     friend class boost::serialization::access;
00104     template<class Archive>
00105     void serialize(Archive & ar, const unsigned int version )
00106     {
00107         ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Action);
00108         ar & BOOST_SERIALIZATION_NVP(currentCycle);
00109         ar & BOOST_SERIALIZATION_NVP(period);
00110         ar & BOOST_SERIALIZATION_NVP(handlerMap);
00111     }
00112 };
00113 
00114 } // namespace SST
00115 
00116 BOOST_CLASS_EXPORT_KEY(SST::Clock)
00117 
00118 #endif // SST_CLOCK_H

Generated on Fri Oct 22 2010 11:02:13 for SST by  doxygen 1.7.1