// // mp::callback_message // // Copyright (C) 2008 FURUHASHI Sadayuki // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #ifndef MP_CALLBACK_MESSAGE_H__ #define MP_CALLBACK_MESSAGE_H__ #include "mp/object_callback.h" namespace mp { struct callback_message { callback_message() {} virtual ~callback_message() {} virtual void operator() () = 0; MP_ARGS_BEGIN template static inline callback_message* create(R (*func)(void*, MP_ARGS_PARAMS), T* obj, MP_ARGS_PARAMS); MP_ARGS_END private: callback_message(const callback_message&); }; template struct callback_message_impl; template struct callback_message_impl : public callback_message { callback_message_impl(R (*func)(void*), void* obj) : m_func(func), m_obj(obj) {} R operator() () { return (*m_func)(m_obj); } private: R (*m_func)(void*); void* m_obj; }; MP_ARGS_BEGIN template struct callback_message_impl : public callback_message { callback_message_impl(R (*func)(void*, MP_ARGS_PARAMS), void* obj, MP_ARGS_PARAMS) : m_func(func), m_obj(obj), MP_ARGS_ITERATOR_BEGIN m_[MP_ARGS_ITERATOR](MP_ARGS_ITERATOR_PARAM)MP_ARGS_ITERATOR_LAST_COLON MP_ARGS_ITERATOR_END {} R operator() () { return (*m_func)(m_obj, MP_ARGS_ITERATOR_BEGIN m_[MP_ARGS_ITERATOR]MP_ARGS_ITERATOR_LAST_COLON MP_ARGS_ITERATOR_END ); } private: template static R mem_fun(void* obj) { return (reinterpret_cast(obj)->*MemFun)(); } private: R (*m_func)(void*, MP_ARGS_PARAMS); void* m_obj; MP_ARGS_ITERATOR_BEGIN MP_ARGS_ITERATOR_TYPE m_[MP_ARGS_ITERATOR]; MP_ARGS_ITERATOR_END }; MP_ARGS_END MP_ARGS_BEGIN template callback_message* callback_message::create(R (*func)(void*, MP_ARGS_PARAMS), T* obj, MP_ARGS_PARAMS) { return new callback_message_impl(func, reinterpret_cast(obj), MP_ARGS_FUNC); } MP_ARGS_END } // namespace mp #endif /* mp/callback_message.h */