Main Page | Class Hierarchy | Class List | Directories | File List | Class Members | Related Pages

kernel.cpp

00001 /***************************************************************************
00002                         kernel.cpp  -  description
00003                             -------------------
00004     begin                : nov 29th 2005
00005     copyright            : (C) 2005-2006 by Duong-Khang NGUYEN
00006     email                : neoneurone @ users sourceforge net
00007     author               : Victor STINNER
00008 
00009     $Id: kernel.cpp 32 2006-08-06 18:59:25Z neoneurone $
00010  ***************************************************************************/
00011 
00012 /***************************************************************************
00013  *                                                                         *
00014  *   This program is free software; you can redistribute it and/or modify  *
00015  *   it under the terms of the GNU General Public License as published by  *
00016  *   the Free Software Foundation; either version 2 of the License, or     *
00017  *   any later version.                                                    *
00018  *                                                                         *
00019  ***************************************************************************/
00020 
00021 
00022 #include "kernel.h"
00023 #include "agent.h"
00024 #include "message.h"
00025 
00026 #include <cassert>
00027 #include <iostream>
00028 
00029 
00030 Kernel* Kernel::m_singleton = NULL;             
00031 
00032 
00033    /*=====================================================================*/
00034 Kernel::Kernel():
00035 m_step(0),
00036 m_agent_uniq_id(1)
00037 {
00038     m_singleton = this;
00039 }
00040 
00041     
00042    /*=====================================================================*/
00043 Kernel::~Kernel()
00044 {
00045 // FIXME: quick and dirty, the yellow page is not handled yet
00046     m_white_pages_it it=m_white_pages.begin(), end=m_white_pages.end();
00047     for (; it != end; ++it) {
00048         it->second->die();
00049         delete it->second;
00050     }
00051     m_white_pages.clear();
00052     m_singleton = NULL;
00053 }
00054 
00055 
00056    /*=====================================================================*/
00057 unsigned long Kernel::getStep() const
00058 {
00059     return m_step;
00060 }
00061 
00062 
00063    /*=====================================================================*/
00064 void Kernel::live()
00065 {
00066 // debug
00067     ++m_step;
00068 /*  if (!(++m_step % 10))
00069         std::cout << "Kernel is at step: " << m_step << std::endl; */
00070 
00071 // Die and Kill
00072     m_agent_dying_it a_it=m_agent_dying.begin(), a_end=m_agent_dying.end();
00073     for (; a_it != a_end; ++a_it) {
00074         MAS_DEBUG( "Agent: " << (*a_it)->getId() << " has been killed " );
00075         (*a_it)->die();
00076         delete *a_it;
00077     }
00078     if (!m_agent_dying.empty())
00079         m_agent_dying.clear();
00080 
00081 // Live
00082     m_white_pages_it it=m_white_pages.begin(), end=m_white_pages.end();
00083     for (; it != end; ++it)
00084         (*it->second).live();
00085 }
00086 
00087 
00088    /*=====================================================================*/
00089 Kernel*
00090 Kernel::getSingleton()
00091 {
00092     return m_singleton;
00093 }
00094 
00095 
00096    /*=====================================================================*/
00097 AgentID_t Kernel::getAgentUniqId()
00098 {
00099     return m_agent_uniq_id++;
00100 }
00101 
00102 
00103    /*=====================================================================*/
00104 void Kernel::registerAgent(Agent *agent)
00105 {
00106     m_white_pages[agent->getId()] = agent;
00107 }
00108 
00109 
00110    /*=====================================================================*/
00111 void
00112 Kernel::unregisterAgent(Agent *agent)
00113 {
00114     m_white_pages.erase(agent->getId());
00115 }
00116 
00117 
00118    /*=====================================================================*/
00119 void Kernel::registerRole(Agent* agent, Role_t role)
00120 {
00121     m_yellow_pages[role].push_back(agent);
00122 }
00123 
00124 
00125    /*=====================================================================*/
00126 void
00127 Kernel::unregisterRole(Agent* agent, Role_t role)
00128 {
00129     m_agent_set_it iter = find( m_yellow_pages[role].begin(), m_yellow_pages[role].end(), agent);
00130     if (iter != m_yellow_pages[role].end())
00131         m_yellow_pages[role].erase(iter);
00132 }
00133 
00134 
00135    /*=====================================================================*/
00136 void
00137 Kernel::killAgent(Agent* agent)
00138 {
00139     Message msg = Message( Message::MSG_AGENT_DIE );
00140 
00141     this->sendMessageToAgent(agent->getId(), msg);
00142     m_agent_dying.push_back(agent);
00143 }
00144 
00145 
00146    /*=====================================================================*/
00147 void Kernel::sendMessage(Role_t role, const Message &msg)
00148 {
00149     m_yellow_pages_it set_it=m_yellow_pages.find(role);
00150     if (set_it == m_yellow_pages.end()) return;
00151     m_agent_set_it
00152         it = (*set_it).second.begin(),
00153         end = (*set_it).second.end();
00154     for (; it != end; ++it)
00155     {
00156         (**it).receiveMessage(msg);
00157     }
00158 }
00159 
00160 
00161    /*=====================================================================*/
00162 Agent& Kernel::getAgentById(AgentID_t agent)
00163 {
00164     assert (m_white_pages.find(agent) != m_white_pages.end());
00165     return *m_white_pages[agent];
00166 }
00167 
00168 
00169    /*=====================================================================*/
00170 void Kernel::sendMessageToAgent(AgentID_t agent, const Message &msg)
00171 {
00172     getAgentById(agent).receiveMessage(msg);
00173 }
00174 
00175 
00176 
00177 
00178 
00179 
00180 
00181 
00182 
00183 
00184 
00185 
00186 
00187 
00188 
00189 
00190 
00191 
00192 
00193 
00194 
00195 
00196 
00197 
00198 
00199 
00200 
00201 
00202 
00203 
00204 
00205 
00206 

Generated on Sat Nov 11 10:21:10 2006 for OpenCity by  doxygen 1.4.2