00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "nel/ai/agent/agent.h"
00025
00026 namespace NLAIAGENT
00027 {
00028
00029
00030 IAgentComposite::IAgentComposite(const IAgentComposite &a): IBasicAgent(a),_SizeChild(0)
00031 {
00032 std::list<IBasicAgent *>::const_iterator i = a._AgentList.begin();
00033 while(i != a._AgentList.end())
00034 {
00035 IBasicAgent *b = ( *i++ );
00036 addChild( b );
00037 }
00038 }
00039
00040 IAgentComposite::IAgentComposite(IBasicAgent *parent): IBasicAgent(parent != NULL ? (const IWordNumRef *) *parent:NULL),_SizeChild(0)
00041 {
00042 if(parent) parent->addChild(this);
00043 }
00044
00045 IAgentComposite::IAgentComposite(IBasicAgent *parent,IMailBox *m): IBasicAgent(parent != NULL ? (const IWordNumRef *) *parent:NULL,m),_SizeChild(0)
00046 {
00047 if(parent) parent->addChild(this);
00048 }
00049
00050 IAgentComposite::~IAgentComposite()
00051 {
00052
00053
00054
00055
00056
00057 deleteListe();
00058 }
00059
00060 void IAgentComposite::onKill(IConnectIA *a)
00061 {
00062
00063 IBasicAgent::onKill(a);
00064 }
00065
00066
00067 std::list<IBasicAgent *>::iterator IAgentComposite::addChild(IBasicAgent *p)
00068 {
00069 p->incRef();
00070 _AgentList.push_front((IBasicAgent *)p);
00071
00072 p->getMail()->addMailBox( this->getMail() );
00073 _SizeChild ++;
00074
00075 return _AgentList.begin();
00076 }
00077
00078 void IAgentComposite::cpyChild(const IBasicAgent &p)
00079 {
00080 _AgentList.push_front((IBasicAgent *)p.clone());
00081 _SizeChild ++;
00082 }
00083
00084 void IAgentComposite::removeChild(std::list<IBasicAgent *>::iterator &iter)
00085 {
00086 _AgentList.erase(iter);
00087 _SizeChild --;
00088 }
00089
00090 void IAgentComposite::removeChild(const IBasicAgent &p)
00091 {
00092 std::list<IBasicAgent *>::iterator i = _AgentList.begin();
00093 while(i != _AgentList.end())
00094 {
00095 if(*((*i)) == p)
00096 {
00097 (*i)->release();
00098 _AgentList.erase(i);
00099
00100 p.getMail()->removeMailBox( this->getMail() );
00101 _SizeChild --;
00102 return;
00103 }
00104 i++;
00105 }
00106 }
00107
00108 void IAgentComposite::removeChild(const IBasicAgent *p)
00109 {
00110 std::list<IBasicAgent *>::iterator i = _AgentList.begin();
00111 while(i != _AgentList.end())
00112 {
00113 IBasicAgent *c = *i;
00114 if(c == p)
00115 {
00116 _AgentList.erase(i);
00117 p->getMail()->removeMailBox( this->getMail() );
00118 c->release();
00119 _SizeChild --;
00120
00121 break;
00122 }
00123 i++;
00124 }
00125 }
00126 void IAgentComposite::deleteListe()
00127 {
00128 std::list<IBasicAgent *>::iterator i = _AgentList.begin();
00129 while(i != _AgentList.end())
00130 {
00131 IBasicAgent *b = (*i++);
00132 b->setParent(NULL);
00133 b->release();
00134 }
00135 _SizeChild = 0;
00136 }
00137
00138 void IAgentComposite::save(NLMISC::IStream &os)
00139 {
00140 IBasicAgent::save(os);
00141
00142 sint32 size = _AgentList.size();
00143 os.serial(size);
00144 std::list<IBasicAgent *>::const_iterator i = _AgentList.begin();
00145 while(i != _AgentList.end())
00146 {
00147 IBasicAgent &a = *(*i++);
00148 os.serial( (NLAIC::CIdentType &) a.getType() );
00149 a.save(os);
00150 }
00151 }
00152
00153 void IAgentComposite::load(NLMISC::IStream &is)
00154 {
00155 deleteListe();
00156 IBasicAgent::load(is);
00157 NLAIC::CIdentTypeAlloc id;
00158 sint32 i;
00159
00160 is.serial(i);
00161 _SizeChild = 0;
00162 while(i--)
00163 {
00164 is.serial( id );
00165 IBasicAgent &a = *((IBasicAgent *)id.allocClass());
00166 a.load(is);
00167 addChild(&a);
00168 }
00169 }
00170 }