src/Sim/Foundation/TimeWheel/TimeWheelBase.cpp

説明を見る。
00001 // 
00002 // Copyright (c) 2005-2008 Kenichi Watanabe.
00003 // Copyright (c) 2005-2008 Yasuhiro Watari.
00004 // Copyright (c) 2005-2008 Hironori Ichibayashi.
00005 // Copyright (c) 2008-2009 Kazuo Horio.
00006 // Copyright (c) 2009-2013 Naruki Kurata.
00007 // Copyright (c) 2005-2013 Ryota Shioya.
00008 // Copyright (c) 2005-2013 Masahiro Goshima.
00009 // 
00010 // This software is provided 'as-is', without any express or implied
00011 // warranty. In no event will the authors be held liable for any damages
00012 // arising from the use of this software.
00013 // 
00014 // Permission is granted to anyone to use this software for any purpose,
00015 // including commercial applications, and to alter it and redistribute it
00016 // freely, subject to the following restrictions:
00017 // 
00018 // 1. The origin of this software must not be misrepresented; you must not
00019 // claim that you wrote the original software. If you use this software
00020 // in a product, an acknowledgment in the product documentation would be
00021 // appreciated but is not required.
00022 // 
00023 // 2. Altered source versions must be plainly marked as such, and must not be
00024 // misrepresented as being the original software.
00025 // 
00026 // 3. This notice may not be removed or altered from any source
00027 // distribution.
00028 // 
00029 // 
00030 
00031 
00032 #include <pch.h>
00033 
00034 #include <utility>
00035 
00036 #include "Env/Env.h"
00037 #include "Sim/Dumper/Dumper.h"
00038 
00039 #include "Sim/Foundation/TimeWheel/TimeWheelBase.h"
00040 
00041 using namespace std;
00042 using namespace Onikiri;
00043 
00044 
00045 TimeWheelBase::TimeWheelBase() :
00046     m_current(0),
00047     m_size(0),
00048     m_now(0)
00049 {
00050     LoadParam();
00051     m_eventWheel.Resize( m_size );  
00052 }
00053 
00054 TimeWheelBase::~TimeWheelBase()
00055 {
00056     ReleaseParam();
00057 }
00058 
00059 void TimeWheelBase::AddEvent( const ListNode& evnt, int time )
00060 {
00061     ASSERT(
00062         ( GetCurrentPhase() == PHASE_UPDATE || 
00063           GetCurrentPhase() == PHASE_END 
00064         ),
00065         "AddEvent() can be called only in PHASE_PROCESS/END."
00066     );
00067     ASSERT( time >= 0, "time is negative." );
00068     ASSERT( m_size > time, "event list is not enough." );
00069     
00070     if( /*m_processedThisCycle &&*/ time == 0 ){
00071         evnt->TriggerUpdate();
00072         return;
00073     }
00074 
00075     //ASSERT( !(time == 0 && m_processedThisCycle == true) , "event added after process.");
00076 
00077     int id = IndexAfterTime( time );
00078     m_eventWheel.GetEventList( id )->AddEvent( evnt );
00079 }
00080 
00081 
00082 // Proceed a time tick
00083 void TimeWheelBase::Tick()
00084 {
00085     m_current++;
00086     if(m_current >= m_size){
00087         m_current -= m_size;
00088     }
00089     ++m_now;
00090 }
00091 
00092 
00093 // Get time tick count.
00094 s64 TimeWheelBase::GetNow() const
00095 {
00096     ASSERT(
00097         ( GetCurrentPhase() == PHASE_UPDATE || 
00098           GetCurrentPhase() == PHASE_END 
00099         ),
00100         "GetNow() can be called only in PHASE_PROCESS/END."
00101     );
00102     return m_now;
00103 }
00104 
00105 // Process events.
00106 void TimeWheelBase::End()
00107 {
00108     if( !IsStalledThisCycle() ){
00109         // Clear events
00110         int current = m_current;
00111         ListType* curEvent = m_eventWheel.PeekEventList(current);
00112         if( curEvent ){
00113             curEvent->Clear();
00114             m_eventWheel.ReleaseEventList( curEvent, current );
00115         }
00116     }
00117 
00118     ClockedResourceBase::End();
00119 }
00120 

Onikiri2に対してTue Jun 18 14:34:23 2013に生成されました。  doxygen 1.4.7