Chris@16: #ifndef BOOST_STATECHART_EVENT_BASE_HPP_INCLUDED Chris@16: #define BOOST_STATECHART_EVENT_BASE_HPP_INCLUDED Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: // Copyright 2002-2006 Andreas Huber Doenni Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompany- Chris@16: // ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: namespace statechart Chris@16: { Chris@16: namespace detail Chris@16: { Chris@16: Chris@16: Chris@16: Chris@16: // This helper is necessary because there doesn't seem to be consensus among Chris@16: // compilers on how a friend declaration for a function in another namespace Chris@16: // has to look like. Chris@16: class delete_helper Chris@16: { Chris@16: public: Chris@16: template< class T > Chris@16: static void delete_object( const T * pObject ) Chris@16: { Chris@16: delete pObject; Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: } // namespace detail Chris@16: Chris@16: Chris@16: Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: class event_base : public detail::rtti_policy::rtti_base_type< Chris@16: detail::counted_base<> > Chris@16: { Chris@16: typedef detail::rtti_policy::rtti_base_type< Chris@16: detail::counted_base<> > base_type; Chris@16: public: Chris@16: ////////////////////////////////////////////////////////////////////////// Chris@16: intrusive_ptr< const event_base > intrusive_from_this() const; Chris@16: Chris@16: protected: Chris@16: ////////////////////////////////////////////////////////////////////////// Chris@16: event_base( detail::rtti_policy::id_provider_type idProvider ) : Chris@16: base_type( idProvider ) Chris@16: { Chris@16: } Chris@16: Chris@16: virtual ~event_base() {} Chris@16: Chris@16: private: Chris@16: ////////////////////////////////////////////////////////////////////////// Chris@16: virtual intrusive_ptr< const event_base > clone() const = 0; Chris@16: Chris@16: friend class detail::delete_helper; Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: #ifdef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP Chris@16: } // namespace statechart Chris@16: #endif Chris@16: Chris@16: Chris@16: Chris@16: inline void intrusive_ptr_add_ref( const ::boost::statechart::event_base * pBase ) Chris@16: { Chris@16: pBase->add_ref(); Chris@16: } Chris@16: Chris@16: inline void intrusive_ptr_release( const ::boost::statechart::event_base * pBase ) Chris@16: { Chris@16: if ( pBase->release() ) Chris@16: { Chris@16: ::boost::statechart::detail::delete_helper::delete_object( pBase ); Chris@16: } Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: #ifndef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP Chris@16: } // namespace statechart Chris@16: #endif Chris@16: namespace statechart Chris@16: { Chris@16: Chris@16: Chris@16: Chris@16: // We're implementing this here so that GCC3.4.2 can find Chris@16: // intrusive_ptr_add_ref, which is indirectly called from the intrusive_ptr Chris@16: // ctor. Chris@16: inline intrusive_ptr< const event_base > event_base::intrusive_from_this() const Chris@16: { Chris@16: if ( base_type::ref_counted() ) Chris@16: { Chris@16: return intrusive_ptr< const event_base >( this ); Chris@16: } Chris@16: else Chris@16: { Chris@16: return clone(); Chris@16: } Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: } // namespace statechart Chris@16: } // namespace boost Chris@16: Chris@16: Chris@16: Chris@16: #endif