-/*******************************************************************************
-
- Copyright (c) 2009, Charles McGarvey
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-*******************************************************************************/
+/*] Copyright (c) 2009-2010, Charles McGarvey [**************************
+**] All rights reserved.
+*
+* vi:ts=4 sw=4 tw=75
+*
+* Distributable under the terms and conditions of the 2-clause BSD license;
+* see the file COPYING for a complete text of the license.
+*
+**************************************************************************/
#ifndef _MOOF_DISPATCH_HH_
#define _MOOF_DISPATCH_HH_
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/shared_ptr.hpp>
+#include <boost/weak_ptr.hpp>
namespace Mf {
class Impl;
boost::shared_ptr<Impl> mImpl;
- void removeHandler(unsigned id);
+ void removeTarget(unsigned id);
public:
};
- class Handler
+ class Handle
{
public:
- Handler() :
- mDispatch(0),
+ Handle() :
mId(0) {}
- Handler(Impl* dispatch, unsigned id) :
+ Handle(boost::weak_ptr<Impl> dispatch, unsigned id) :
mDispatch(dispatch),
mId(id) {}
- Handler(const Handler& handler) :
- mDispatch(handler.mDispatch),
- mId(handler.mId)
+ Handle(const Handle& handle) :
+ mDispatch(handle.mDispatch),
+ mId(handle.mId)
{
- handler.mId = 0;
+ handle.mId = 0;
}
- ~Handler();
+ ~Handle()
+ {
+ clear();
+ }
- Handler& operator = (const Handler& handler)
+ Handle& operator = (const Handle& handle)
{
- mDispatch = handler.mDispatch;
- mId = handler.mId;
- handler.mId = 0;
+ clear();
+ mDispatch = handle.mDispatch;
+ mId = handle.mId;
+ handle.mId = 0;
return *this;
}
{
return mId;
}
+
+ void clear();
private:
- Impl* mDispatch;
- mutable unsigned mId;
-
+ boost::weak_ptr<Impl> mDispatch;
+ mutable unsigned mId;
};
typedef boost::function<void(const Message*)> Function;
Dispatch();
- // create and/or get a global instance
- static Dispatch& getInstance();
-
- Handler addHandler(const std::string& event, const Function& callback);
- Handler addHandler(const std::string& event, const Function& callback,
- Handler handler);
+ Handle addTarget(const std::string& event, const Function& callback);
+ Handle addTarget(const std::string& event, const Function& callback,
+ Handle handle);
void dispatch(const std::string& event, const Message* message = 0);
+
+ static Dispatch& global();
};
#endif // _MOOF_DISPATCH_HH_
-/** vim: set ts=4 sw=4 tw=80: *************************************************/
-