[Yake-svn] SF.net SVN: yake: [1459] trunk/yake
Status: Beta
Brought to you by:
psyclonist
From: <psy...@us...> - 2006-09-12 21:23:11
|
Revision: 1459 http://svn.sourceforge.net/yake/?rev=1459&view=rev Author: psyclonist Date: 2006-09-12 14:22:45 -0700 (Tue, 12 Sep 2006) Log Message: ----------- - ent: Implemented basic object messaging for targetted and broadcasted messages. - msg: Fixed a number of issues. Modified Paths: -------------- trunk/yake/src/yake/ent/object.cpp trunk/yake/src/yake/ent/object_mgr.cpp trunk/yake/src/yake/samples/ent/sampleEntFsm/demo.cpp trunk/yake/yake/ent/object.h trunk/yake/yake/ent/object_mgr.h trunk/yake/yake/ent/prerequisites.h trunk/yake/yake/msg/listener_mgr.h trunk/yake/yake/msg/message.h trunk/yake/yake/msg/processors.h trunk/yake/yake/msg/router.h Modified: trunk/yake/src/yake/ent/object.cpp =================================================================== --- trunk/yake/src/yake/ent/object.cpp 2006-09-12 17:34:08 UTC (rev 1458) +++ trunk/yake/src/yake/ent/object.cpp 2006-09-12 21:22:45 UTC (rev 1459) @@ -34,20 +34,58 @@ void Object::setId(const ObjectId& id) { + YAKE_ASSERT( id != MessageTraits::kNoSource )(MessageTraits::kNoSource)(id); + YAKE_ASSERT( id != MessageTraits::kAnySource )(MessageTraits::kAnySource)(id); + YAKE_ASSERT( id != MessageTraits::kNoTarget )(MessageTraits::kNoTarget)(id); + YAKE_ASSERT( id != MessageTraits::kBroadcastTarget )(MessageTraits::kBroadcastTarget)(id); + YAKE_ASSERT( id != MessageTraits::kAnyTarget )(MessageTraits::kAnyTarget)(id); id_ = id; } const ObjectId& Object::getId() const { return id_; } + void Object::processMessage(const int& i) + { + std::cout << "Object::processMessage(" << i << ")\n"; + } + void Object::registerMessageListeners(detail::message_router_type& msgRouter) + { + YAKE_ASSERT( id_ != ObjectId::kNull ); + // let object listen to messages of type 'int' targetted to itself directly + listenerConnections_.push_back( + msgRouter.addListener( + msg::makeListener<ObjectId,ObjectId,int>(Bind1(&Object::processMessage,this)), + MessageTraits::kAnySource, + id_ ) + ); + + // let object listen to broadcasted messages of type 'int' + listenerConnections_.push_back( + msgRouter.addListener( + msg::makeListener<ObjectId,ObjectId,int>(Bind1(&Object::processMessage,this)), + MessageTraits::kAnySource, + MessageTraits::kBroadcastTarget ) + ); + } + void Object::destroy() + { + for (listenerconnetion_list::iterator it = listenerConnections_.begin(), itend = listenerConnections_.end(); + it != itend; ++it) + { + it->disconnect(); + } + listenerConnections_.clear(); + } + } } MSG_NAMESPACE_BEGIN -const traits<ent::ObjectId,ent::ObjectId>::Source traits<ent::ObjectId,ent::ObjectId>::kNoSource = ent::ObjectId(-1,0); -const traits<ent::ObjectId,ent::ObjectId>::Source traits<ent::ObjectId,ent::ObjectId>::kAnySource = ent::ObjectId(-1,1); -const traits<ent::ObjectId,ent::ObjectId>::Source traits<ent::ObjectId,ent::ObjectId>::kNoTarget = ent::ObjectId(-1,2); -const traits<ent::ObjectId,ent::ObjectId>::Source traits<ent::ObjectId,ent::ObjectId>::kBroadcastTarget = ent::ObjectId(-1,3); -const traits<ent::ObjectId,ent::ObjectId>::Source traits<ent::ObjectId,ent::ObjectId>::kAnyTarget = ent::ObjectId(-1,4); +const traits<ent::ObjectId,ent::ObjectId>::Source traits<ent::ObjectId,ent::ObjectId>::kNoSource = ent::ObjectId(ent::ObjectId::kNull-1,0); +const traits<ent::ObjectId,ent::ObjectId>::Source traits<ent::ObjectId,ent::ObjectId>::kAnySource = ent::ObjectId(ent::ObjectId::kNull-1,1); +const traits<ent::ObjectId,ent::ObjectId>::Target traits<ent::ObjectId,ent::ObjectId>::kNoTarget = ent::ObjectId(ent::ObjectId::kNull-1,2); +const traits<ent::ObjectId,ent::ObjectId>::Target traits<ent::ObjectId,ent::ObjectId>::kBroadcastTarget = ent::ObjectId(ent::ObjectId::kNull-1,3); +const traits<ent::ObjectId,ent::ObjectId>::Target traits<ent::ObjectId,ent::ObjectId>::kAnyTarget = ent::ObjectId(ent::ObjectId::kNull-1,4); MSG_NAMESPACE_END Modified: trunk/yake/src/yake/ent/object_mgr.cpp =================================================================== --- trunk/yake/src/yake/ent/object_mgr.cpp 2006-09-12 17:34:08 UTC (rev 1458) +++ trunk/yake/src/yake/ent/object_mgr.cpp 2006-09-12 21:22:45 UTC (rev 1459) @@ -43,6 +43,8 @@ YAKE_ASSERT( obj )(clsId); objs_.push_back( obj ); + obj->registerMessageListeners(msgRouter_); + listeners_onObjectCreated(obj); obj->init(); @@ -56,8 +58,9 @@ YAKE_ASSERT( obj ); listeners_onDestroyObject( obj ); - //obj->shutdown(); + obj->destroy(); + object_ptr_list::iterator it = std::find(objs_.begin(),objs_.end(),obj); if (it != objs_.end()) objs_.erase( it ); @@ -66,6 +69,7 @@ } void ObjectManager::tick() { + msgRouter_.processMessages(); yake::ConstVectorIterator<object_ptr_list> it(objs_); while (it.hasMoreElements()) it.getNext()->tick(); @@ -97,6 +101,19 @@ while (it.hasMoreElements()) it.getNext().first->onDestroyObject(obj); } + void ObjectManager::postMessage(Object* obj, ObjectMessageBase* msg, const MessageSource source) + { + YAKE_ASSERT( obj ); + YAKE_ASSERT( msg ); + msg->setTarget( obj->getId() ); + msgRouter_.post( msg ); + } + void ObjectManager::broadcastMessage(ObjectMessageBase* msg, const MessageSource source /* = MessageTraits::kNoSource */) + { + YAKE_ASSERT( msg ); + msg->setTarget( MessageTraits::kBroadcastTarget ); + msgRouter_.post( msg ); + } } } Modified: trunk/yake/src/yake/samples/ent/sampleEntFsm/demo.cpp =================================================================== --- trunk/yake/src/yake/samples/ent/sampleEntFsm/demo.cpp 2006-09-12 17:34:08 UTC (rev 1458) +++ trunk/yake/src/yake/samples/ent/sampleEntFsm/demo.cpp 2006-09-12 21:22:45 UTC (rev 1459) @@ -210,10 +210,15 @@ YAKE_ASSERT( e ); // NB At this point the FSM has been set up by the exapp listener! + // Also the scripting VM has been initialized and is ready for use. + // Do some message/event processing + objMgr.makeAndPostMessage( o, int(1) ); // to specific target + objMgr.makeAndBroadcastMessage( int(2) ); // to all objects + // Do some FSM event processing: e->processFsmEvent("spawn"); - objMgr.tick(); // triggers o->tick() + objMgr.tick(); // triggers o->tick(), also triggers message handling! objMgr.tick(); e->processFsmEvent("die"); Modified: trunk/yake/yake/ent/object.h =================================================================== --- trunk/yake/yake/ent/object.h 2006-09-12 17:34:08 UTC (rev 1458) +++ trunk/yake/yake/ent/object.h 2006-09-12 21:22:45 UTC (rev 1459) @@ -78,11 +78,18 @@ listeners_tick(*this); onTick(); } + void destroy(); + + void processMessage(const int&); + + void registerMessageListeners(detail::message_router_type& msgRouter); protected: virtual void onInit() {} virtual void onTick() {} private: ObjectId id_; + typedef std::deque<detail::ListenerConnection> listenerconnetion_list; + listenerconnetion_list listenerConnections_; }; } // namespace ent Modified: trunk/yake/yake/ent/object_mgr.h =================================================================== --- trunk/yake/yake/ent/object_mgr.h 2006-09-12 17:34:08 UTC (rev 1458) +++ trunk/yake/yake/ent/object_mgr.h 2006-09-12 21:22:45 UTC (rev 1459) @@ -81,37 +81,50 @@ return ret; } + template<typename MessageValueType> + void makeAndPostMessage(Object* obj, const MessageValueType& value, const MessageSource source = MessageTraits::kNoSource) + { + YAKE_ASSERT( obj ); + //this->postMessage( obj, msg::makeMessage<ObjectId,ObjectId,MessageValueType>(value,source,obj->getId()), source ); + this->postMessage( obj, new msg::message<ObjectId,ObjectId,MessageValueType>(value,source,obj->getId()) ); + } + template<typename MessageValueType> + void makeAndBroadcastMessage(const MessageValueType& value, const MessageSource source = MessageTraits::kNoSource) + { + this->broadcastMessage( new msg::message<ObjectId,ObjectId,MessageValueType>(value,source,MessageTraits::kBroadcastTarget) ); + } + /** Post a global message. This message is *not* broadcasted to every object! @see msg::makeMessage @see msg::makeListener @see broadcastMessage */ - void postMessage(ObjectMessage*, const MessageSource source = kNoSource); + void postMessage(ObjectMessageBase*, const MessageSource source = MessageTraits::kNoSource); /** Post a global message which is broadcasted to every object! @see msg::makeMessage @see msg::makeListener */ - void broadcastMessage(ObjectMessage*, const MessageSource source = kNoSource); + void broadcastMessage(ObjectMessageBase*, const MessageSource source = MessageTraits::kNoSource); /** Post message to a specific object. @see msg::makeMessage @see msg::makeListener */ - void postMessage(Object*, ObjectMessage*, const MessageSource source = kNoSource); + void postMessage(Object*, ObjectMessageBase*, const MessageSource source = MessageTraits::kNoSource); /** Post message to a specific object identified by its ObjectId. @see msg::makeMessage @see msg::makeListener */ - void postMessage(ObjectId, ObjectMessage*, const MessageSource source = kNoSource); + void postMessage(ObjectId, ObjectMessageBase*, const MessageSource source = MessageTraits::kNoSource); /** Post message to objects in a STL(-like) container with object pointers. @see msg::makeMessage @see msg::makeListener */ template<typename T_container> - void postMessage(const T_container& objCtr, ObjectMessage* msg, const MessageSource source = kNoSource) + void postMessage(const T_container& objCtr, ObjectMessageBase* msg, const MessageSource source = MessageTraits::kNoSource) { ConstVectorIterator<T_container> it(objCtr); while (it.hasMoreElements()) @@ -132,6 +145,8 @@ typedef AssocVector<String,StringMap> class_option_map; class_option_map objClsOptions_; + + detail::message_router_type msgRouter_; }; } // namespace ent Modified: trunk/yake/yake/ent/prerequisites.h =================================================================== --- trunk/yake/yake/ent/prerequisites.h 2006-09-12 17:34:08 UTC (rev 1458) +++ trunk/yake/yake/ent/prerequisites.h 2006-09-12 21:22:45 UTC (rev 1459) @@ -51,12 +51,6 @@ typedef object::ObjectId<object::default_objectid_traits> ObjectId; typedef ObjectId::ClassId ClassId; - struct ClsEntry - { - RttiClass* cls; - }; - typedef object::ClassAndObjectIdManager<ClsEntry> ClassAndObjectIdManager; - } // namespace ent } // namespace yake @@ -72,10 +66,10 @@ typedef ::yake::ent::ObjectId Target; YAKE_ENT_API static const Source kNoSource; - static const Source kAnySource; + YAKE_ENT_API static const Source kAnySource; static const Target kNoTarget; - static const Target kBroadcastTarget; + YAKE_ENT_API static const Target kBroadcastTarget; static const Target kAnyTarget; }; MSG_NAMESPACE_END @@ -86,12 +80,20 @@ // Pull in types typedef msg::traits<ObjectId,ObjectId> MessageTraits; - typedef msg::detail::message_base<ObjectId,ObjectId> ObjectMessage; + typedef msg::detail::message_base<ObjectId,ObjectId> ObjectMessageBase; typedef MessageTraits::Source MessageSource; typedef MessageTraits::Target MessageTarget; - static const MessageSource kNoSource = MessageTraits::kNoSource; + namespace detail { + typedef msg::DoubleQueuedProcessor<ObjectId,ObjectId> message_processor_type; + typedef msg::router<ObjectId,ObjectId,message_processor_type> message_router_type; + typedef msg::ListenerConnection<ObjectId,ObjectId,msg::detail::msg_listener_mgr<ObjectId,ObjectId> > ListenerConnection; + } + //static const MessageSource kNoSource = MessageTraits::kNoSource; + //static const MessageSource kAnySource = MessageTraits::kAnySource; + //static const MessageTarget kBroadcastTarget = MessageTraits::kBroadcastTarget; + } // namespace ent } // namespace yake Modified: trunk/yake/yake/msg/listener_mgr.h =================================================================== --- trunk/yake/yake/msg/listener_mgr.h 2006-09-12 17:34:08 UTC (rev 1458) +++ trunk/yake/yake/msg/listener_mgr.h 2006-09-12 21:22:45 UTC (rev 1459) @@ -39,10 +39,12 @@ template<typename source_type,typename target_type,typename msg_listener_mgr_type> struct ListenerConnection { - private: - ListenerConnection(); public: typedef detail::listener_base<source_type,target_type> listener_base_type; + ListenerConnection() : + mgr_(0), + listener_(0) + {} ListenerConnection( msg_listener_mgr_type* mgr, listener_base_type* listener, source_type source, @@ -115,6 +117,7 @@ protected: typedef std::deque<boost::shared_ptr<listener_base_type> > listener_list; typedef std::map<std::string,listener_list> listener_map; + typedef traits<source_type,target_type> traits_type; public: msg_listener_mgr() : isProcessing_(false) @@ -142,8 +145,8 @@ const source_type source = msg->source(); const target_type target = msg->target(); - YAKE_ASSERT( source != kAnySource ); // should be kNoSource if there's no source. - YAKE_ASSERT( target != kAnyTarget ); // should be kBroadcastTarget. + YAKE_ASSERT( source != traits_type::kAnySource ); // should be kNoSource if there's no source. + YAKE_ASSERT( target != traits_type::kAnyTarget ); // should be kBroadcastTarget. // find 'kAnySource' source source_map::const_iterator itSource = sources_.find(traits<source_type,target_type>::kAnySource); Modified: trunk/yake/yake/msg/message.h =================================================================== --- trunk/yake/yake/msg/message.h 2006-09-12 17:34:08 UTC (rev 1458) +++ trunk/yake/yake/msg/message.h 2006-09-12 21:22:45 UTC (rev 1459) @@ -82,6 +82,8 @@ /** Returns the target of the message. */ target_type target() const { return tgt_; } + void setTarget(const target_type tgt) + { tgt_ = tgt; } protected: boost::any value_; private: Modified: trunk/yake/yake/msg/processors.h =================================================================== --- trunk/yake/yake/msg/processors.h 2006-09-12 17:34:08 UTC (rev 1458) +++ trunk/yake/yake/msg/processors.h 2006-09-12 21:22:45 UTC (rev 1459) @@ -117,7 +117,7 @@ typedef msg_listener_mgr_type::listener_list listener_list; DoubleQueuedProcessor() : q_(&q1_) {} - void onPost(detail::message_base* msg) + void onPost(message_base_type* msg) { YAKE_ASSERT(msg); q_->push_back(msg); //@todo sort by msg type!? Modified: trunk/yake/yake/msg/router.h =================================================================== --- trunk/yake/yake/msg/router.h 2006-09-12 17:34:08 UTC (rev 1458) +++ trunk/yake/yake/msg/router.h 2006-09-12 21:22:45 UTC (rev 1459) @@ -67,6 +67,7 @@ typedef detail::message_base<source_type,target_type> message_base_type; typedef detail::listener_base<source_type,target_type> listener_base_type; + typedef typename processor_type::connection_type listener_connection_type; /** Post a message. Processing is controlled by T_processor. @see postMessage() @@ -84,13 +85,21 @@ target_type target = traits<source_type,target_type>::kNoTarget) { this->onPost( MSG_NAMESPACE::makeMessage<T,source_type,target_type>(v,source,target) ); } + listener_connection_type addListener( + listener_base_type* l, + source_type source = traits<source_type,target_type>::kNoSource, + target_type target = traits<source_type,target_type>::kNoTarget) + { + YAKE_ASSERT(l); + if (!l) + return listener_connection_type(); + return this->add(l,source,target); + } + /** Operator for listener registration (with source identifier kNoSource). */ router& operator << (listener_base_type* l) { - YAKE_ASSERT(l); - if (!l) - return *this; - this->add(l); + this->addListener(l); return *this; } /** Operator for listener registration with user supplied source identifier. */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |