From d9994a01bca43aab08fc67b789e71d28672c6ba1 Mon Sep 17 00:00:00 2001
From: Tobias Markmann <tm@ayena.de>
Date: Mon, 7 May 2018 20:48:01 +0200
Subject: Replace boost::lambda with C++11 lambdas

Test-Information:

Builds on macOS 10.13.4 with clang trunk. All unit and
integration tests pass. Produces fewer warnings with clang
trunk (previously reported marked-unused-but-used warnings).

Change-Id: I849d764537cfbc380155e87b033dc5e517b3c342

diff --git a/Sluift/client.cpp b/Sluift/client.cpp
index ae2f610..ec208bc 100644
--- a/Sluift/client.cpp
+++ b/Sluift/client.cpp
@@ -1,12 +1,10 @@
 /*
- * Copyright (c) 2013-2017 Isode Limited.
+ * Copyright (c) 2013-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
 
 #include <boost/assign/list_of.hpp>
-#include <boost/lambda/bind.hpp>
-#include <boost/lambda/lambda.hpp>
 
 #include <Swiften/Base/IDGenerator.h>
 #include <Swiften/Disco/ClientDiscoManager.h>
@@ -42,7 +40,6 @@
 #include <Sluift/globals.h>
 
 using namespace Swift;
-namespace lambda = boost::lambda;
 
 static inline SluiftClient* getClient(lua_State* L) {
     return *Lua::checkUserData<SluiftClient>(L, 1);
@@ -659,7 +656,9 @@ SLUIFT_LUA_FUNCTION(Client, get_next_event) {
     }
     else if (type) {
         event = client->getNextEvent(
-                timeout, lambda::bind(&SluiftClient::Event::type, lambda::_1) == *type);
+                timeout, [&](const SluiftClient::Event& event) {
+                    return event.type == *type;
+                });
     }
     else {
         event = client->getNextEvent(timeout);
diff --git a/Sluift/component.cpp b/Sluift/component.cpp
index df96d43..f3c2e37 100644
--- a/Sluift/component.cpp
+++ b/Sluift/component.cpp
@@ -1,12 +1,10 @@
 /*
- * Copyright (c) 2014-2016 Isode Limited.
+ * Copyright (c) 2014-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
 
 #include <boost/assign/list_of.hpp>
-#include <boost/lambda/bind.hpp>
-#include <boost/lambda/lambda.hpp>
 
 #include <Swiften/Base/IDGenerator.h>
 #include <Swiften/Elements/DiscoInfo.h>
@@ -41,7 +39,6 @@
 #include <Sluift/globals.h>
 
 using namespace Swift;
-namespace lambda = boost::lambda;
 
 static inline SluiftComponent* getComponent(lua_State* L) {
     return *Lua::checkUserData<SluiftComponent>(L, 1);
@@ -433,7 +430,9 @@ SLUIFT_LUA_FUNCTION(Component, get_next_event) {
     }
     else if (type) {
         event = component->getNextEvent(
-                timeout, lambda::bind(&SluiftComponent::Event::type, lambda::_1) == *type);
+                timeout, [&](const SluiftComponent::Event& event) {
+                    return event.type == *type;
+                });
     }
     else {
         event = component->getNextEvent(timeout);
diff --git a/Swift/Controllers/ContactSuggester.cpp b/Swift/Controllers/ContactSuggester.cpp
index eb27ed4..4b621db 100644
--- a/Swift/Controllers/ContactSuggester.cpp
+++ b/Swift/Controllers/ContactSuggester.cpp
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2014-2016 Isode Limited.
+ * Copyright (c) 2014-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -19,16 +19,12 @@
 #include <boost/algorithm/string.hpp>
 #include <boost/algorithm/string/find.hpp>
 #include <boost/bind.hpp>
-#include <boost/lambda/bind.hpp>
-#include <boost/lambda/lambda.hpp>
 
 #include <Swiften/Base/Algorithm.h>
 #include <Swiften/JID/JID.h>
 
 #include <Swift/Controllers/ContactProvider.h>
 
-namespace lambda = boost::lambda;
-
 namespace Swift {
 
 ContactSuggester::ContactSuggester() {
@@ -60,8 +56,9 @@ std::vector<Contact::ref> ContactSuggester::getSuggestions(const std::string& se
 
     std::sort(results.begin(), results.end(), Contact::lexicographicalSortPredicate);
     results.erase(std::unique(results.begin(), results.end(), Contact::equalityPredicate), results.end());
-    results.erase(std::remove_if(results.begin(), results.end(), !lambda::bind(&matchContact, search, lambda::_1)),
-        results.end());
+    results.erase(std::remove_if(results.begin(), results.end(), [&](const Contact::ref contact) {
+        return !matchContact(search, contact);
+    }), results.end());
     std::sort(results.begin(), results.end(), boost::bind(&Contact::sortPredicate, _1, _2, search));
 
     return results;
diff --git a/Swift/QtUI/QtStatusWidget.cpp b/Swift/QtUI/QtStatusWidget.cpp
index b175e5c..5e2ba5f 100644
--- a/Swift/QtUI/QtStatusWidget.cpp
+++ b/Swift/QtUI/QtStatusWidget.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -8,9 +8,6 @@
 
 #include <algorithm>
 
-#include <boost/lambda/bind.hpp>
-#include <boost/lambda/lambda.hpp>
-
 #include <QApplication>
 #include <QBoxLayout>
 #include <QComboBox>
@@ -32,8 +29,6 @@
 #include <Swift/QtUI/QtLineEdit.h>
 #include <Swift/QtUI/QtSwiftUtil.h>
 
-namespace lambda = boost::lambda;
-
 namespace Swift {
 
 QtStatusWidget::QtStatusWidget(StatusCache* statusCache, QWidget *parent) : QWidget(parent), statusCache_(statusCache), editCursor_(Qt::IBeamCursor), viewCursor_(Qt::PointingHandCursor) {
@@ -153,8 +148,9 @@ void QtStatusWidget::generateList() {
     }
     std::vector<StatusCache::PreviousStatus> previousStatuses = statusCache_->getMatches(Q2PSTRING(text), 8);
     for (const auto& savedStatus : previousStatuses) {
-        if (savedStatus.first.empty() || std::find_if(allTypes_.begin(), allTypes_.end(),
-                    savedStatus.second == lambda::_1 && savedStatus.first == lambda::bind(&statusShowTypeToFriendlyName, lambda::_1)) != allTypes_.end()) {
+        if (savedStatus.first.empty() || std::find_if(allTypes_.begin(), allTypes_.end(), [&](StatusShow::Type type) {
+            return (savedStatus.second == type) && (savedStatus.first == statusShowTypeToFriendlyName(type));
+            }) != allTypes_.end()) {
             continue;
         }
         QListWidgetItem* item = new QListWidgetItem(P2QSTRING(savedStatus.first), menu_);
diff --git a/Swiften/EventLoop/EventLoop.cpp b/Swiften/EventLoop/EventLoop.cpp
index 186616f..f6af699 100644
--- a/Swiften/EventLoop/EventLoop.cpp
+++ b/Swiften/EventLoop/EventLoop.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -10,15 +10,10 @@
 #include <cassert>
 #include <vector>
 
-#include <boost/bind.hpp>
-#include <boost/lambda/bind.hpp>
-#include <boost/lambda/lambda.hpp>
 #include <boost/optional.hpp>
 
 #include <Swiften/Base/Log.h>
 
-namespace lambda = boost::lambda;
-
 namespace Swift {
 
 inline void invokeCallback(const Event& event) {
@@ -96,7 +91,9 @@ void EventLoop::removeEventsFromOwner(std::shared_ptr<EventOwner> owner) {
 
     std::lock(removeLock, eventsLock);
 
-    events_.remove_if(lambda::bind(&Event::owner, lambda::_1) == owner);
+    events_.remove_if([&](const Event& event) {
+        return event.owner == owner;
+    });
 }
 
 }
diff --git a/Swiften/Network/DomainNameServiceQuery.cpp b/Swiften/Network/DomainNameServiceQuery.cpp
index 0c6c543..548c837 100644
--- a/Swiften/Network/DomainNameServiceQuery.cpp
+++ b/Swiften/Network/DomainNameServiceQuery.cpp
@@ -11,14 +11,11 @@
 #include <iterator>
 #include <numeric>
 
-#include <boost/lambda/bind.hpp>
-#include <boost/lambda/lambda.hpp>
 #include <boost/numeric/conversion/cast.hpp>
 
 #include <Swiften/Base/RandomGenerator.h>
 
 using namespace Swift;
-namespace lambda = boost::lambda;
 
 namespace {
     struct ResultPriorityComparator {
@@ -42,9 +39,10 @@ void DomainNameServiceQuery::sortResults(std::vector<DomainNameServiceQuery::Res
         std::vector<DomainNameServiceQuery::Result>::iterator next = std::upper_bound(i, queries.end(), *i, comparator);
         if (std::distance(i, next) > 1) {
             std::vector<int> weights;
-            std::transform(i, next, std::back_inserter(weights),
-                    /* easy hack to account for '0' weights getting at least some weight */
-                    lambda::bind(&Result::weight, lambda::_1) + 1);
+            std::transform(i, next, std::back_inserter(weights), [](const DomainNameServiceQuery::Result& result) {
+                /* easy hack to account for '0' weights getting at least some weight */
+                return result.weight + 1;
+            });
             for (int j = 0; j < boost::numeric_cast<int>(weights.size() - 1); ++j) {
                 std::vector<int> cumulativeWeights;
                 std::partial_sum(
diff --git a/Swiften/Parser/AttributeMap.cpp b/Swiften/Parser/AttributeMap.cpp
index c112d52..f6767de 100644
--- a/Swiften/Parser/AttributeMap.cpp
+++ b/Swiften/Parser/AttributeMap.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -8,19 +8,17 @@
 
 #include <algorithm>
 
-#include <boost/lambda/bind.hpp>
-#include <boost/lambda/lambda.hpp>
 #include <boost/optional.hpp>
 
 using namespace Swift;
-namespace lambda = boost::lambda;
 
 AttributeMap::AttributeMap() {
 }
 
 std::string AttributeMap::getAttribute(const std::string& attribute, const std::string& ns) const {
-    AttributeValueMap::const_iterator i = std::find_if(attributes.begin(), attributes.end(),
-            lambda::bind(&AttributeMap::Entry::getAttribute, lambda::_1) == Attribute(attribute, ns));
+    const auto i = std::find_if(attributes.begin(), attributes.end(), [&](const Entry& entry) {
+        return entry.getAttribute() == Attribute(attribute, ns);
+    });
     if (i == attributes.end()) {
         return "";
     }
@@ -30,8 +28,9 @@ std::string AttributeMap::getAttribute(const std::string& attribute, const std::
 }
 
 bool AttributeMap::getBoolAttribute(const std::string& attribute, bool defaultValue) const {
-    AttributeValueMap::const_iterator i = std::find_if(attributes.begin(), attributes.end(),
-            lambda::bind(&AttributeMap::Entry::getAttribute, lambda::_1) == Attribute(attribute, ""));
+    const auto i = std::find_if(attributes.begin(), attributes.end(), [&](const Entry& entry) {
+        return entry.getAttribute() == Attribute(attribute, "");
+    });
     if (i == attributes.end()) {
         return defaultValue;
     }
@@ -41,8 +40,9 @@ bool AttributeMap::getBoolAttribute(const std::string& attribute, bool defaultVa
 }
 
 boost::optional<std::string> AttributeMap::getAttributeValue(const std::string& attribute) const {
-    AttributeValueMap::const_iterator i = std::find_if(attributes.begin(), attributes.end(),
-            lambda::bind(&AttributeMap::Entry::getAttribute, lambda::_1) == Attribute(attribute, ""));
+    const auto i = std::find_if(attributes.begin(), attributes.end(), [&](const Entry& entry) {
+        return entry.getAttribute() == Attribute(attribute, "");
+    });
     if (i == attributes.end()) {
         return boost::optional<std::string>();
     }
diff --git a/Swiften/Parser/Tree/ParserElement.cpp b/Swiften/Parser/Tree/ParserElement.cpp
index 5415945..988bc13 100644
--- a/Swiften/Parser/Tree/ParserElement.cpp
+++ b/Swiften/Parser/Tree/ParserElement.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -7,13 +7,8 @@
 
 #include <Swiften/Parser/Tree/ParserElement.h>
 
-#include <boost/lambda/bind.hpp>
-#include <boost/lambda/lambda.hpp>
-
 #include <Swiften/Parser/Tree/NullParserElement.h>
 
-namespace lambda = boost::lambda;
-
 namespace Swift {
 
 ParserElement::ParserElement(const std::string& name, const std::string& xmlns, const AttributeMap& attributes) : name_(name), xmlns_(xmlns), attributes_(attributes) {
@@ -34,8 +29,9 @@ void ParserElement::appendCharacterData(const std::string& data) {
 
 std::vector<ParserElement::ref> ParserElement::getChildren(const std::string& name, const std::string& xmlns) const {
     std::vector<ParserElement::ref> result;
-    std::remove_copy_if(children_.begin(), children_.end(), std::back_inserter(result),
-        lambda::bind(&ParserElement::getName, *lambda::_1) != name || lambda::bind(&ParserElement::getNamespace, *lambda::_1) != xmlns);
+    std::remove_copy_if(children_.begin(), children_.end(), std::back_inserter(result), [&](const ParserElement::ref& element) {
+        return (element->getName() != name) || (element->getNamespace() != xmlns);
+    });
     return result;
 }
 
-- 
cgit v0.10.2-6-g49f6