SL-18837: Ditch Boost.Phoenix implicit lambda syntax.

It's cool to be able to write 'arg1 << "stuff" << var ...;' for a lambda
accepting a std::ostream reference, but cascading compile errors mean it's no
longer worth trying to make that work -- given actual C++ lambdas.

Also clean up a lingering BOOST_FOREACH() and a boost::bind() while at it.
master
Nat Goodspeed 2023-06-06 10:04:26 -04:00
parent 1db7ac7139
commit c4366378b6
2 changed files with 15 additions and 24 deletions

View File

@ -18,8 +18,6 @@
#include <functional>
// external library headers
#include <boost/assign/list_of.hpp>
#include <boost/phoenix/core/argument.hpp>
#include <boost/phoenix/operator/bitwise.hpp> // operator<<()
// other Linden headers
#include "../test/lltut.h"
#include "../test/namedtempfile.h"
@ -105,7 +103,7 @@ namespace tut
llleap_data():
reader(".py",
// This logic is adapted from vita.viewerclient.receiveEvent()
boost::phoenix::placeholders::arg1 <<
[](std::ostream& out){ out <<
"import re\n"
"import os\n"
"import sys\n"
@ -189,7 +187,7 @@ namespace tut
"def request(pump, data):\n"
" # we expect 'data' is a dict\n"
" data['reply'] = _reply\n"
" send(pump, data)\n"),
" send(pump, data)\n";}),
// Get the actual pathname of the NamedExtTempFile and trim off
// the ".py" extension. (We could cache reader.getName() in a
// separate member variable, but I happen to know getName() just
@ -383,7 +381,7 @@ namespace tut
AckAPI api;
Result result;
NamedExtTempFile script("py",
boost::phoenix::placeholders::arg1 <<
[&](std::ostream& out){ out <<
"from " << reader_module << " import *\n"
// make a request on our little API
"request(pump='" << api.getName() << "', data={})\n"
@ -391,7 +389,7 @@ namespace tut
"resp = get()\n"
"result = '' if resp == dict(pump=replypump(), data='ack')\\\n"
" else 'bad: ' + str(resp)\n"
"send(pump='" << result.getName() << "', data=result)\n");
"send(pump='" << result.getName() << "', data=result)\n";});
waitfor(LLLeap::create(get_test_name(), sv(list_of(PYTHON)(script.getName()))));
result.ensure();
}
@ -421,7 +419,7 @@ namespace tut
ReqIDAPI api;
Result result;
NamedExtTempFile script("py",
boost::phoenix::placeholders::arg1 <<
[&](std::ostream& out){ out <<
"import sys\n"
"from " << reader_module << " import *\n"
// Note that since reader imports llsd, this
@ -450,7 +448,7 @@ namespace tut
" if resp['data']['reqid'] != i:\n"
" result = 'expected reqid=%s in %s' % (i, resp)\n"
" break\n"
"send(pump='" << result.getName() << "', data=result)\n");
"send(pump='" << result.getName() << "', data=result)\n";});
waitfor(LLLeap::create(get_test_name(), sv(list_of(PYTHON)(script.getName()))),
300); // needs more realtime than most tests
result.ensure();
@ -464,7 +462,7 @@ namespace tut
ReqIDAPI api;
Result result;
NamedExtTempFile script("py",
boost::phoenix::placeholders::arg1 <<
[&](std::ostream& out){ out <<
"import sys\n"
"from " << reader_module << " import *\n"
// Generate a very large string value.
@ -516,7 +514,7 @@ namespace tut
" send('" << result.getName() << "',\n"
" 'at offset %s, expected %r but got %r' %\n"
" (start, large[start:end], echoed[start:end]))\n"
"sys.exit(1)\n");
"sys.exit(1)\n";});
waitfor(LLLeap::create(test_name,
sv(list_of
(PYTHON)

View File

@ -45,13 +45,6 @@ typedef U32 uint32_t;
#endif
#include "boost/range.hpp"
#include "boost/foreach.hpp"
#include "boost/function.hpp"
#include "boost/bind.hpp"
#include "boost/phoenix/bind/bind_function.hpp"
#include "boost/phoenix/core/argument.hpp"
#include <boost/phoenix/operator/bitwise.hpp>
using namespace boost::phoenix;
#include "../llsd.h"
#include "../llsdserialize.h"
@ -1802,7 +1795,7 @@ namespace tut
// helper for test<3>
static void writeLLSDArray(std::ostream& out, const LLSD& array)
{
BOOST_FOREACH(LLSD item, llsd::inArray(array))
for (const LLSD& item: llsd::inArray(array))
{
LLSDSerialize::toNotation(item, out);
// It's important to separate with newlines because Python's llsd
@ -1842,21 +1835,21 @@ namespace tut
// Create an llsdXXXXXX file containing 'data' serialized to
// notation.
NamedTempFile file("llsd",
// NamedTempFile's boost::function constructor
// NamedTempFile's function constructor
// takes a callable. To this callable it passes the
// std::ostream with which it's writing the
// NamedTempFile.
boost::bind(writeLLSDArray, _1, cdata));
[&](std::ostream& out){ writeLLSDArray(out, cdata); });
python("read C++ notation",
placeholders::arg1 <<
[&](std::ostream& out){ out <<
import_llsd <<
"def parse_each(iterable):\n"
" for item in iterable:\n"
" yield llsd.parse(item)\n" <<
pydata <<
// Don't forget raw-string syntax for Windows pathnames.
"verify(parse_each(open(r'" << file.getName() << "', 'rb')))\n");
"verify(parse_each(open(r'" << file.getName() << "', 'rb')))\n";});
}
template<> template<>
@ -1870,7 +1863,7 @@ namespace tut
NamedTempFile file("llsd", "");
python("write Python notation",
placeholders::arg1 <<
[&](std::ostream& out){ out <<
import_llsd <<
"DATA = [\n"
" 17,\n"
@ -1884,7 +1877,7 @@ namespace tut
// N.B. Using 'print' implicitly adds newlines.
"with open(r'" << file.getName() << "', 'w') as f:\n"
" for item in DATA:\n"
" print(llsd.format_notation(item).decode(), file=f)\n");
" print(llsd.format_notation(item).decode(), file=f)\n";});
std::ifstream inf(file.getName().c_str());
LLSD item;