diff options
author | Nat Goodspeed <nat@lindenlab.com> | 2014-12-12 13:46:41 -0800 |
---|---|---|
committer | Nat Goodspeed <nat@lindenlab.com> | 2014-12-12 13:46:41 -0800 |
commit | eae38f7d57be5576199294b501e082c6d850473c (patch) | |
tree | 2ca2cac78beeb339676d9a405462f3ed83776fa3 /indra/newview | |
parent | 7282d29bf82deaeb5649b09f062d42c04df6eb55 (diff) |
Eliminate use of boost::lambda with boost::function (Trac #10864).
https://svn.boost.org/trac/boost/ticket/10864
I've used boost::lambda with boost::function in a number of creative ways over
the years. But the clang 6 shipped with Xcode 6 seems to have somehow broken
lambda + function in Boost 1.57. boost::phoenix is a partial workaround.
Sadly, lambda's comma-operator overload doesn't seem to be supported,
necessitating a couple ugly workarounds.
With real lambdas now supported by current compilers, I'm sure the Boost
community has little incentive to repair the lambda + function problem.
Presumably we'll be able to use such features ourselves Real Soon Now...
Diffstat (limited to 'indra/newview')
-rwxr-xr-x | indra/newview/llwindowlistener.cpp | 49 |
1 files changed, 34 insertions, 15 deletions
diff --git a/indra/newview/llwindowlistener.cpp b/indra/newview/llwindowlistener.cpp index a8e06511d7..734018cfc2 100755 --- a/indra/newview/llwindowlistener.cpp +++ b/indra/newview/llwindowlistener.cpp @@ -44,10 +44,7 @@ #include <typeinfo> #include <map> #include <boost/scoped_ptr.hpp> -#include <boost/lambda/core.hpp> -#include <boost/lambda/bind.hpp> - -namespace bll = boost::lambda; +#include <boost/bind.hpp> LLWindowListener::LLWindowListener(LLViewerWindow *window, const KeyboardGetter& kbgetter) : LLEventAPI("LLWindow", "Inject input events into the LLWindow instance"), @@ -358,6 +355,30 @@ static WhichButton buttons; typedef boost::function<bool(LLCoordGL, MASK)> MouseFunc; +// Wrap a function returning 'void' to return 'true' instead. I'm sure there's +// a more generic way to accomplish this, but generically handling the +// arguments seems to require variadic templates and perfect forwarding. (We +// used to be able to write (boost::lambda::bind(...), true), counting on +// boost::lambda's comma operator overload, until +// https://svn.boost.org/trac/boost/ticket/10864. And boost::phoenix doesn't +// seem to overload comma the same way; or at least not with bind().) +class MouseFuncTrue +{ + typedef boost::function<void(LLCoordGL, MASK)> MouseFuncVoid; + MouseFuncVoid mFunc; + +public: + MouseFuncTrue(const MouseFuncVoid& func): + mFunc(func) + {} + + bool operator()(LLCoordGL coords, MASK mask) const + { + mFunc(coords, mask); + return true; + } +}; + static void mouseEvent(const MouseFunc& func, const LLSD& request) { // Ensure we send response @@ -464,11 +485,11 @@ void LLWindowListener::mouseDown(LLSD const & request) if (actions.valid) { // Normally you can pass NULL to an LLWindow* without compiler - // complaint, but going through boost::lambda::bind() evidently + // complaint, but going through boost::bind() evidently // bypasses that special case: it only knows you're trying to pass an // int to a pointer. Explicitly cast NULL to the desired pointer type. - mouseEvent(bll::bind(actions.down, mWindow, - static_cast<LLWindow*>(NULL), bll::_1, bll::_2), + mouseEvent(boost::bind(actions.down, mWindow, + static_cast<LLWindow*>(NULL), _1, _2), request); } } @@ -478,8 +499,8 @@ void LLWindowListener::mouseUp(LLSD const & request) Actions actions(buttons.lookup(request["button"])); if (actions.valid) { - mouseEvent(bll::bind(actions.up, mWindow, - static_cast<LLWindow*>(NULL), bll::_1, bll::_2), + mouseEvent(boost::bind(actions.up, mWindow, + static_cast<LLWindow*>(NULL), _1, _2), request); } } @@ -489,12 +510,10 @@ void LLWindowListener::mouseMove(LLSD const & request) // We want to call the same central mouseEvent() routine for // handleMouseMove() as for button clicks. But handleMouseMove() returns // void, whereas mouseEvent() accepts a function returning bool -- and - // uses that bool return. Use (void-lambda-expression, true) to construct - // a callable that returns bool anyway. Pass 'true' because we expect that - // our caller will usually treat 'false' as a problem. - mouseEvent((bll::bind(&LLWindowCallbacks::handleMouseMove, mWindow, - static_cast<LLWindow*>(NULL), bll::_1, bll::_2), - true), + // uses that bool return. Use MouseFuncTrue to construct a callable that + // returns bool anyway. + mouseEvent(MouseFuncTrue(boost::bind(&LLWindowCallbacks::handleMouseMove, mWindow, + static_cast<LLWindow*>(NULL), _1, _2)), request); } |