Use wpi::span instead of wpi::ArrayRef across all libraries (#3414)

- Remove ArrayRef.h
- Add SpanExtras.h for a couple of convenience functions
This commit is contained in:
Peter Johnson
2021-06-06 19:51:14 -07:00
committed by GitHub
parent 2abbbd9e70
commit 64f5413253
167 changed files with 974 additions and 1433 deletions

View File

@@ -12,7 +12,7 @@ class HttpWebSocketServerConnectionTest
: public HttpWebSocketServerConnection<HttpWebSocketServerConnectionTest> {
public:
HttpWebSocketServerConnectionTest(std::shared_ptr<uv::Stream> stream,
ArrayRef<std::string_view> protocols)
span<const std::string_view> protocols)
: HttpWebSocketServerConnection{stream, protocols} {}
void ProcessRequest() override { ++gotRequest; }

View File

@@ -205,7 +205,7 @@ TEST_F(WebSocketClientTest, ProtocolReqNotResp) {
clientPipe->Connect(pipeName, [&] {
auto ws = WebSocket::CreateClient(*clientPipe, "/test", pipeName,
std::string_view{"myProtocol"});
{{"myProtocol"}});
ws->closed.connect([&](uint16_t code, std::string_view msg) {
Finish();
++gotClosed;
@@ -254,7 +254,7 @@ TEST_P(WebSocketClientDataTest, SendBinary) {
std::vector<uint8_t> data(GetParam(), 0x03u);
setupWebSocket = [&] {
ws->open.connect([&](std::string_view) {
ws->SendBinary(uv::Buffer(data), [&](auto bufs, uv::Error) {
ws->SendBinary({{data}}, [&](auto bufs, uv::Error) {
++gotCallback;
ws->Terminate();
ASSERT_FALSE(bufs.empty());
@@ -275,7 +275,7 @@ TEST_P(WebSocketClientDataTest, ReceiveBinary) {
int gotCallback = 0;
std::vector<uint8_t> data(GetParam(), 0x03u);
setupWebSocket = [&] {
ws->binary.connect([&](ArrayRef<uint8_t> inData, bool fin) {
ws->binary.connect([&](auto inData, bool fin) {
++gotCallback;
ws->Terminate();
ASSERT_TRUE(fin);
@@ -284,9 +284,7 @@ TEST_P(WebSocketClientDataTest, ReceiveBinary) {
});
};
auto message = BuildMessage(0x02, true, false, data);
connected = [&] {
conn->Write(uv::Buffer(message), [&](auto bufs, uv::Error) {});
};
connected = [&] { conn->Write({{message}}, [&](auto bufs, uv::Error) {}); };
loop->Run();
@@ -311,9 +309,7 @@ TEST_P(WebSocketClientDataTest, ReceiveMasked) {
});
};
auto message = BuildMessage(0x01, true, true, data);
connected = [&] {
conn->Write(uv::Buffer(message), [&](auto bufs, uv::Error) {});
};
connected = [&] { conn->Write({{message}}, [&](auto bufs, uv::Error) {}); };
loop->Run();

View File

@@ -87,7 +87,7 @@ TEST_F(WebSocketIntegrationTest, ServerSendBinary) {
auto conn = serverPipe->Accept();
auto server = WebSocketServer::Create(*conn);
server->connected.connect([&](std::string_view, WebSocket& ws) {
ws.SendBinary(uv::Buffer{"\x03\x04", 2}, [&](auto, uv::Error) {});
ws.SendBinary({uv::Buffer{"\x03\x04", 2}}, [&](auto, uv::Error) {});
ws.Close();
});
});
@@ -100,7 +100,7 @@ TEST_F(WebSocketIntegrationTest, ServerSendBinary) {
FAIL() << "Code: " << code << " Reason: " << reason;
}
});
ws->binary.connect([&](ArrayRef<uint8_t> data, bool) {
ws->binary.connect([&](auto data, bool) {
++gotData;
std::vector<uint8_t> recvData{data.begin(), data.end()};
std::vector<uint8_t> expectData{0x03, 0x04};
@@ -136,7 +136,7 @@ TEST_F(WebSocketIntegrationTest, ClientSendText) {
}
});
ws->open.connect([&, s = ws.get()](std::string_view) {
s->SendText(uv::Buffer{"hello"}, [&](auto, uv::Error) {});
s->SendText({{"hello"}}, [&](auto, uv::Error) {});
s->Close();
});
});

View File

@@ -126,7 +126,7 @@ TEST_F(WebSocketServerTest, CloseBasic) {
// need to respond with close for server to finish shutdown
auto message = BuildMessage(0x08, true, true, {});
handleData = [&](std::string_view) {
clientPipe->Write(uv::Buffer(message), [&](auto bufs, uv::Error) {});
clientPipe->Write({{message}}, [&](auto bufs, uv::Error) {});
};
loop->Run();
@@ -149,7 +149,7 @@ TEST_F(WebSocketServerTest, CloseCode) {
const uint8_t contents[] = {0x03u, 0xe8u};
auto message = BuildMessage(0x08, true, true, contents);
handleData = [&](std::string_view) {
clientPipe->Write(uv::Buffer(message), [&](auto bufs, uv::Error) {});
clientPipe->Write({{message}}, [&](auto bufs, uv::Error) {});
};
loop->Run();
@@ -173,7 +173,7 @@ TEST_F(WebSocketServerTest, CloseReason) {
const uint8_t contents[] = {0x03u, 0xe8u, 'h', 'a', 'n', 'g', 'u', 'p'};
auto message = BuildMessage(0x08, true, true, contents);
handleData = [&](std::string_view) {
clientPipe->Write(uv::Buffer(message), [&](auto bufs, uv::Error) {});
clientPipe->Write({{message}}, [&](auto bufs, uv::Error) {});
};
loop->Run();
@@ -197,7 +197,7 @@ TEST_F(WebSocketServerTest, ReceiveCloseBasic) {
};
auto message = BuildMessage(0x08, true, true, {});
resp.headersComplete.connect([&](bool) {
clientPipe->Write(uv::Buffer(message), [&](auto bufs, uv::Error) {});
clientPipe->Write({{message}}, [&](auto bufs, uv::Error) {});
});
loop->Run();
@@ -219,7 +219,7 @@ TEST_F(WebSocketServerTest, ReceiveCloseCode) {
const uint8_t contents[] = {0x03u, 0xe8u};
auto message = BuildMessage(0x08, true, true, contents);
resp.headersComplete.connect([&](bool) {
clientPipe->Write(uv::Buffer(message), [&](auto bufs, uv::Error) {});
clientPipe->Write({{message}}, [&](auto bufs, uv::Error) {});
});
loop->Run();
@@ -242,7 +242,7 @@ TEST_F(WebSocketServerTest, ReceiveCloseReason) {
const uint8_t contents[] = {0x03u, 0xe8u, 'h', 'a', 'n', 'g', 'u', 'p'};
auto message = BuildMessage(0x08, true, true, contents);
resp.headersComplete.connect([&](bool) {
clientPipe->Write(uv::Buffer(message), [&](auto bufs, uv::Error) {});
clientPipe->Write({{message}}, [&](auto bufs, uv::Error) {});
});
loop->Run();
@@ -278,7 +278,7 @@ TEST_P(WebSocketServerBadOpcodeTest, Receive) {
};
auto message = BuildMessage(GetParam(), true, true, data);
resp.headersComplete.connect([&](bool) {
clientPipe->Write(uv::Buffer(message), [&](auto bufs, uv::Error) {});
clientPipe->Write({{message}}, [&](auto bufs, uv::Error) {});
});
loop->Run();
@@ -309,7 +309,7 @@ TEST_P(WebSocketServerControlFrameTest, ReceiveFragment) {
};
auto message = BuildMessage(GetParam(), false, true, data);
resp.headersComplete.connect([&](bool) {
clientPipe->Write(uv::Buffer(message), [&](auto bufs, uv::Error) {});
clientPipe->Write({{message}}, [&](auto bufs, uv::Error) {});
});
loop->Run();
@@ -336,7 +336,7 @@ TEST_F(WebSocketServerTest, ReceiveFragmentInvalidNoPrevFrame) {
};
auto message = BuildMessage(0x00, false, true, data);
resp.headersComplete.connect([&](bool) {
clientPipe->Write(uv::Buffer(message), [&](auto bufs, uv::Error) {});
clientPipe->Write({{message}}, [&](auto bufs, uv::Error) {});
});
loop->Run();
@@ -357,8 +357,7 @@ TEST_F(WebSocketServerTest, ReceiveFragmentInvalidNoPrevFragment) {
auto message = BuildMessage(0x01, true, true, {}); // FIN=1
auto message2 = BuildMessage(0x00, false, true, data);
resp.headersComplete.connect([&](bool) {
clientPipe->Write({uv::Buffer(message), uv::Buffer(message2)},
[&](auto bufs, uv::Error) {});
clientPipe->Write({{message}, {message2}}, [&](auto bufs, uv::Error) {});
});
loop->Run();
@@ -379,9 +378,8 @@ TEST_F(WebSocketServerTest, ReceiveFragmentInvalidIncomplete) {
auto message2 = BuildMessage(0x00, false, true, {});
auto message3 = BuildMessage(0x01, true, true, {});
resp.headersComplete.connect([&](bool) {
clientPipe->Write(
{uv::Buffer(message), uv::Buffer(message2), uv::Buffer(message3)},
[&](auto bufs, uv::Error) {});
clientPipe->Write({{message}, {message2}, {message3}},
[&](auto bufs, uv::Error) {});
});
loop->Run();
@@ -401,7 +399,7 @@ TEST_F(WebSocketServerTest, ReceiveFragment) {
combData.insert(combData.end(), data3.begin(), data3.end());
setupWebSocket = [&] {
ws->binary.connect([&](ArrayRef<uint8_t> inData, bool fin) {
ws->binary.connect([&](auto inData, bool fin) {
++gotCallback;
ws->Terminate();
ASSERT_TRUE(fin);
@@ -414,9 +412,8 @@ TEST_F(WebSocketServerTest, ReceiveFragment) {
auto message2 = BuildMessage(0x00, false, true, data2);
auto message3 = BuildMessage(0x00, true, true, data3);
resp.headersComplete.connect([&](bool) {
clientPipe->Write(
{uv::Buffer(message), uv::Buffer(message2), uv::Buffer(message3)},
[&](auto bufs, uv::Error) {});
clientPipe->Write({{message}, {message2}, {message3}},
[&](auto bufs, uv::Error) {});
});
loop->Run();
@@ -437,7 +434,7 @@ TEST_F(WebSocketServerTest, ReceiveFragmentSeparate) {
setupWebSocket = [&] {
ws->SetCombineFragments(false);
ws->binary.connect([&](ArrayRef<uint8_t> inData, bool fin) {
ws->binary.connect([&](auto inData, bool fin) {
std::vector<uint8_t> recvData{inData.begin(), inData.end()};
switch (++gotCallback) {
case 1:
@@ -464,9 +461,8 @@ TEST_F(WebSocketServerTest, ReceiveFragmentSeparate) {
auto message2 = BuildMessage(0x00, false, true, data2);
auto message3 = BuildMessage(0x00, true, true, data3);
resp.headersComplete.connect([&](bool) {
clientPipe->Write(
{uv::Buffer(message), uv::Buffer(message2), uv::Buffer(message3)},
[&](auto bufs, uv::Error) {});
clientPipe->Write({{message}, {message2}, {message3}},
[&](auto bufs, uv::Error) {});
});
loop->Run();
@@ -495,7 +491,7 @@ TEST_F(WebSocketServerTest, ReceiveTooLarge) {
};
auto message = BuildMessage(0x01, true, true, data);
resp.headersComplete.connect([&](bool) {
clientPipe->Write(uv::Buffer(message), [&](auto bufs, uv::Error) {});
clientPipe->Write({{message}}, [&](auto bufs, uv::Error) {});
});
loop->Run();
@@ -521,8 +517,7 @@ TEST_F(WebSocketServerTest, ReceiveTooLargeFragmented) {
auto message = BuildMessage(0x01, false, true, data);
auto message2 = BuildMessage(0x00, true, true, data);
resp.headersComplete.connect([&](bool) {
clientPipe->Write({uv::Buffer(message), uv::Buffer(message2)},
[&](auto bufs, uv::Error) {});
clientPipe->Write({{message}, {message2}}, [&](auto bufs, uv::Error) {});
});
loop->Run();
@@ -545,7 +540,7 @@ TEST_P(WebSocketServerDataTest, SendText) {
std::vector<uint8_t> data(GetParam(), ' ');
setupWebSocket = [&] {
ws->open.connect([&](std::string_view) {
ws->SendText(uv::Buffer(data), [&](auto bufs, uv::Error) {
ws->SendText({{data}}, [&](auto bufs, uv::Error) {
++gotCallback;
ws->Terminate();
ASSERT_FALSE(bufs.empty());
@@ -566,7 +561,7 @@ TEST_P(WebSocketServerDataTest, SendBinary) {
std::vector<uint8_t> data(GetParam(), 0x03u);
setupWebSocket = [&] {
ws->open.connect([&](std::string_view) {
ws->SendBinary(uv::Buffer(data), [&](auto bufs, uv::Error) {
ws->SendBinary({{data}}, [&](auto bufs, uv::Error) {
++gotCallback;
ws->Terminate();
ASSERT_FALSE(bufs.empty());
@@ -587,7 +582,7 @@ TEST_P(WebSocketServerDataTest, SendPing) {
std::vector<uint8_t> data(GetParam(), 0x03u);
setupWebSocket = [&] {
ws->open.connect([&](std::string_view) {
ws->SendPing(uv::Buffer(data), [&](auto bufs, uv::Error) {
ws->SendPing({{data}}, [&](auto bufs, uv::Error) {
++gotCallback;
ws->Terminate();
ASSERT_FALSE(bufs.empty());
@@ -608,7 +603,7 @@ TEST_P(WebSocketServerDataTest, SendPong) {
std::vector<uint8_t> data(GetParam(), 0x03u);
setupWebSocket = [&] {
ws->open.connect([&](std::string_view) {
ws->SendPong(uv::Buffer(data), [&](auto bufs, uv::Error) {
ws->SendPong({{data}}, [&](auto bufs, uv::Error) {
++gotCallback;
ws->Terminate();
ASSERT_FALSE(bufs.empty());
@@ -639,7 +634,7 @@ TEST_P(WebSocketServerDataTest, ReceiveText) {
};
auto message = BuildMessage(0x01, true, true, data);
resp.headersComplete.connect([&](bool) {
clientPipe->Write(uv::Buffer(message), [&](auto bufs, uv::Error) {});
clientPipe->Write({{message}}, [&](auto bufs, uv::Error) {});
});
loop->Run();
@@ -651,7 +646,7 @@ TEST_P(WebSocketServerDataTest, ReceiveBinary) {
int gotCallback = 0;
std::vector<uint8_t> data(GetParam(), 0x03u);
setupWebSocket = [&] {
ws->binary.connect([&](ArrayRef<uint8_t> inData, bool fin) {
ws->binary.connect([&](auto inData, bool fin) {
++gotCallback;
ws->Terminate();
ASSERT_TRUE(fin);
@@ -661,7 +656,7 @@ TEST_P(WebSocketServerDataTest, ReceiveBinary) {
};
auto message = BuildMessage(0x02, true, true, data);
resp.headersComplete.connect([&](bool) {
clientPipe->Write(uv::Buffer(message), [&](auto bufs, uv::Error) {});
clientPipe->Write({{message}}, [&](auto bufs, uv::Error) {});
});
loop->Run();
@@ -673,7 +668,7 @@ TEST_P(WebSocketServerDataTest, ReceivePing) {
int gotCallback = 0;
std::vector<uint8_t> data(GetParam(), 0x03u);
setupWebSocket = [&] {
ws->ping.connect([&](ArrayRef<uint8_t> inData) {
ws->ping.connect([&](auto inData) {
++gotCallback;
ws->Terminate();
std::vector<uint8_t> recvData{inData.begin(), inData.end()};
@@ -682,7 +677,7 @@ TEST_P(WebSocketServerDataTest, ReceivePing) {
};
auto message = BuildMessage(0x09, true, true, data);
resp.headersComplete.connect([&](bool) {
clientPipe->Write(uv::Buffer(message), [&](auto bufs, uv::Error) {});
clientPipe->Write({{message}}, [&](auto bufs, uv::Error) {});
});
loop->Run();
@@ -694,7 +689,7 @@ TEST_P(WebSocketServerDataTest, ReceivePong) {
int gotCallback = 0;
std::vector<uint8_t> data(GetParam(), 0x03u);
setupWebSocket = [&] {
ws->pong.connect([&](ArrayRef<uint8_t> inData) {
ws->pong.connect([&](auto inData) {
++gotCallback;
ws->Terminate();
std::vector<uint8_t> recvData{inData.begin(), inData.end()};
@@ -703,7 +698,7 @@ TEST_P(WebSocketServerDataTest, ReceivePong) {
};
auto message = BuildMessage(0x0a, true, true, data);
resp.headersComplete.connect([&](bool) {
clientPipe->Write(uv::Buffer(message), [&](auto bufs, uv::Error) {});
clientPipe->Write({{message}}, [&](auto bufs, uv::Error) {});
});
loop->Run();
@@ -730,7 +725,7 @@ TEST_P(WebSocketServerDataTest, ReceiveUnmasked) {
};
auto message = BuildMessage(0x01, true, false, data);
resp.headersComplete.connect([&](bool) {
clientPipe->Write(uv::Buffer(message), [&](auto bufs, uv::Error) {});
clientPipe->Write({{message}}, [&](auto bufs, uv::Error) {});
});
loop->Run();

View File

@@ -48,7 +48,7 @@ std::vector<uint8_t> WebSocketTest::BuildHeader(uint8_t opcode, bool fin,
std::vector<uint8_t> WebSocketTest::BuildMessage(uint8_t opcode, bool fin,
bool masking,
ArrayRef<uint8_t> data) {
span<const uint8_t> data) {
auto finalData = BuildHeader(opcode, fin, masking, data.size());
size_t headerSize = finalData.size();
finalData.insert(finalData.end(), data.begin(), data.end());
@@ -68,7 +68,7 @@ std::vector<uint8_t> WebSocketTest::BuildMessage(uint8_t opcode, bool fin,
// If the message is masked, changes the mask to match the mask set by
// BuildHeader() by unmasking and remasking.
void WebSocketTest::AdjustMasking(MutableArrayRef<uint8_t> message) {
void WebSocketTest::AdjustMasking(span<uint8_t> message) {
if (message.size() < 2) {
return;
}
@@ -91,7 +91,7 @@ void WebSocketTest::AdjustMasking(MutableArrayRef<uint8_t> message) {
message[maskPos + 2] = testMask[2];
message[maskPos + 3] = testMask[3];
int n = 0;
for (auto& ch : message.slice(maskPos + 4)) {
for (auto& ch : message.subspan(maskPos + 4)) {
ch ^= mask[n] ^ testMask[n];
if (++n >= 4) {
n = 0;

View File

@@ -9,7 +9,7 @@
#include <vector>
#include "gtest/gtest.h"
#include "wpi/ArrayRef.h"
#include "wpi/span.h"
#include "wpi/uv/Loop.h"
#include "wpi/uv/Pipe.h"
#include "wpi/uv/Timer.h"
@@ -58,8 +58,8 @@ class WebSocketTest : public ::testing::Test {
bool masking, uint64_t len);
static std::vector<uint8_t> BuildMessage(uint8_t opcode, bool fin,
bool masking,
ArrayRef<uint8_t> data);
static void AdjustMasking(MutableArrayRef<uint8_t> message);
span<const uint8_t> data);
static void AdjustMasking(span<uint8_t> message);
static const uint8_t testMask[4];
std::shared_ptr<uv::Loop> loop;

View File

@@ -200,7 +200,7 @@ TEST(JsonReadmeTest, OtherContainer)
{
std::vector<int> c_vector {1, 2, 3, 4};
json j_vec(c_vector);
json j_vec2(wpi::makeArrayRef(c_vector));
json j_vec2(wpi::span<const int>(c_vector.data(), c_vector.size()));
// [1, 2, 3, 4]
std::deque<float> c_deque {1.2f, 2.3f, 3.4f, 5.6f};

View File

@@ -1,7 +1,7 @@
#if __has_include(<span>)
#include <span>
#endif
#include "wpi/ArrayRef.h"
#include "wpi/span.h"
#include "gtest/gtest.h"
@@ -9,17 +9,13 @@ void func1(wpi::span<const int> x) {}
#ifdef __cpp_lib_span
void func2(std::span<const int> x) {}
#endif
void func3(wpi::ArrayRef<int> x) {}
void func4(wpi::span<int> x) {}
#ifdef __cpp_lib_span
void func5(std::span<int> x) {}
#endif
void func6(wpi::MutableArrayRef<int> x) {}
TEST(Span, ConvertArrayRefStdSpan) {
func1(wpi::ArrayRef<int>{});
func1(wpi::MutableArrayRef<int>{});
TEST(Span, ConvertStdSpan) {
func1(wpi::span<const int>{});
func1(wpi::span<int>{});
#ifdef __cpp_lib_span
@@ -28,25 +24,12 @@ TEST(Span, ConvertArrayRefStdSpan) {
#endif
#ifdef __cpp_lib_span
func2(wpi::ArrayRef<int>{});
func2(wpi::MutableArrayRef<int>{});
func2(wpi::span<const int>{});
func2(wpi::span<int>{});
func2(std::span<const int>{});
func2(std::span<int>{});
#endif
func3(wpi::ArrayRef<int>{});
func3(wpi::MutableArrayRef<int>{});
func3(wpi::span<const int>{});
func3(wpi::span<int>{});
#ifdef __cpp_lib_span
func3(std::span<const int>{});
func3(std::span<int>{});
#endif
//func4(wpi::ArrayRef<int>{});
func4(wpi::MutableArrayRef<int>{});
//func4(wpi::span<const int>{});
func4(wpi::span<int>{});
#ifdef __cpp_lib_span
@@ -55,20 +38,9 @@ TEST(Span, ConvertArrayRefStdSpan) {
#endif
#ifdef __cpp_lib_span
//func5(wpi::ArrayRef<int>{});
func5(wpi::MutableArrayRef<int>{});
//func5(wpi::span<const int>{});
func5(wpi::span<int>{});
//func5(std::span<const int>{});
func5(std::span<int>{});
#endif
//func6(wpi::ArrayRef<int>{});
func6(wpi::MutableArrayRef<int>{});
//func6(wpi::span<const int>{});
func6(wpi::span<int>{});
#ifdef __cpp_lib_span
//func6(std::span<const int>{});
func6(std::span<int>{});
#endif
}

View File

@@ -26,7 +26,7 @@ TEST(UvSimpleBufferPool, ReleaseReuse) {
auto buf1copy = buf1;
auto origSize = buf1.len;
buf1.len = 8;
pool.Release(buf1);
pool.Release({&buf1, 1});
ASSERT_EQ(buf1.base, nullptr);
auto buf2 = pool.Allocate();
ASSERT_EQ(buf1copy.base, buf2.base);
@@ -36,7 +36,7 @@ TEST(UvSimpleBufferPool, ReleaseReuse) {
TEST(UvSimpleBufferPool, ClearRemaining) {
SimpleBufferPool<4> pool;
auto buf1 = pool.Allocate();
pool.Release(buf1);
pool.Release({&buf1, 1});
ASSERT_EQ(pool.Remaining(), 1u);
pool.Clear();
ASSERT_EQ(pool.Remaining(), 0u);