Add support for extracting std::vector<bool> from packets

This commit is contained in:
Fred Nicolson 2019-01-17 11:51:18 +00:00
parent 2c771fa46e
commit 7343529302
4 changed files with 60 additions and 45 deletions

View File

@ -42,7 +42,7 @@ add_definitions(-Dntodh)
set( INCLUDE_PATH "${PROJECT_SOURCE_DIR}/include" ) set( INCLUDE_PATH "${PROJECT_SOURCE_DIR}/include" )
set( SOURCE_PATH "${PROJECT_SOURCE_DIR}/src" ) set( SOURCE_PATH "${PROJECT_SOURCE_DIR}/src" )
set(SOURCE_FILES ${SOURCE_FILES} main.cpp src/TcpSocket.cpp include/frnetlib/TcpSocket.h src/TcpListener.cpp include/frnetlib/TcpListener.h src/Socket.cpp include/frnetlib/Socket.h src/Packet.cpp include/frnetlib/Packet.h include/frnetlib/NetworkEncoding.h src/SocketSelector.cpp include/frnetlib/SocketSelector.h src/HttpRequest.cpp include/frnetlib/HttpRequest.h src/HttpResponse.cpp include/frnetlib/HttpResponse.h src/Http.cpp include/frnetlib/Http.h include/frnetlib/Packetable.h include/frnetlib/Listener.h src/URL.cpp include/frnetlib/URL.h include/frnetlib/Sendable.h include/frnetlib/version.h include/frnetlib/SocketDescriptor.h) set(SOURCE_FILES ${SOURCE_FILES} main.cpp src/TcpSocket.cpp include/frnetlib/TcpSocket.h src/TcpListener.cpp include/frnetlib/TcpListener.h src/Socket.cpp include/frnetlib/Socket.h include/frnetlib/Packet.h include/frnetlib/NetworkEncoding.h src/SocketSelector.cpp include/frnetlib/SocketSelector.h src/HttpRequest.cpp include/frnetlib/HttpRequest.h src/HttpResponse.cpp include/frnetlib/HttpResponse.h src/Http.cpp include/frnetlib/Http.h include/frnetlib/Packetable.h include/frnetlib/Listener.h src/URL.cpp include/frnetlib/URL.h include/frnetlib/Sendable.h include/frnetlib/version.h include/frnetlib/SocketDescriptor.h)
include_directories(include) include_directories(include)
set(CORE_CXX_FLAGS "${CORE_CXX_FLAGS} -std=c++14 -Wall") set(CORE_CXX_FLAGS "${CORE_CXX_FLAGS} -std=c++14 -Wall")

View File

@ -136,11 +136,10 @@ namespace fr
vec.resize(length); vec.resize(length);
//Now take each of the elements out of the packet //Now take each of the elements out of the packet
for(uint32_t a = 0; a < length; a++) for(auto &&iter : vec)
{ {
*this >> vec[a]; *this >> iter;
} }
return *this; return *this;
} }
@ -437,6 +436,7 @@ namespace fr
template<typename T, typename std::enable_if<std::is_enum<T>::value>::type* = nullptr> template<typename T, typename std::enable_if<std::is_enum<T>::value>::type* = nullptr>
inline Packet &operator<<(T var) inline Packet &operator<<(T var)
{ {
static_assert(sizeof(typename std::underlying_type<T>::type) <= 4, "Enum types must not be larger than 32bits");
*this << (uint32_t)static_cast<typename std::underlying_type<T>::type>(var); *this << (uint32_t)static_cast<typename std::underlying_type<T>::type>(var);
return *this; return *this;
} }
@ -452,6 +452,7 @@ namespace fr
template<typename T, typename std::enable_if<std::is_enum<T>::value>::type* = nullptr> template<typename T, typename std::enable_if<std::is_enum<T>::value>::type* = nullptr>
inline Packet &operator>>(T &var) inline Packet &operator>>(T &var)
{ {
static_assert(sizeof(typename std::underlying_type<T>::type) <= 4, "Enum types must not be larger than 32bits");
uint32_t val; uint32_t val;
*this >> val; *this >> val;
var = static_cast<T>(val); var = static_cast<T>(val);
@ -516,17 +517,6 @@ namespace fr
return *this; return *this;
} }
/*
* Adds a char array
*/
inline Packet &operator<<(const char *var)
{
auto len = (uint32_t)strlen(var);
*this << len;
buffer.append(var, len);
return *this;
}
/* /*
* Removes a string variable from the packet * Removes a string variable from the packet
*/ */
@ -541,6 +531,29 @@ namespace fr
return *this; return *this;
} }
/*
* Removes a boolean from the packet into a reference
*/
inline Packet&operator>>(std::vector<bool>::reference &ref)
{
bool b;
*this >> b;
ref = b;
return *this;
}
/*
* Adds a char array
*/
inline Packet &operator<<(const char *var)
{
auto len = (uint32_t)strlen(var);
*this << len;
buffer.append(var, len);
return *this;
}
/*! /*!
* Should be called to pack an object that inherits * Should be called to pack an object that inherits
* fr::Packetable to the packet. * fr::Packetable to the packet.

View File

@ -1,8 +0,0 @@
//
// Created by fred on 06/12/16.
//
namespace fr
{
}

View File

@ -29,6 +29,16 @@ TEST(PacketTest, double_range_add)
ASSERT_EQ(var2, out2); ASSERT_EQ(var2, out2);
} }
TEST(PacketTest, pack_vector_bool)
{
std::vector<bool> my_vec{true, false, true};
std::vector<bool> my_vec2;
fr::Packet packet;
packet << my_vec;
packet >> my_vec2;
ASSERT_EQ(my_vec, my_vec2);
}
TEST(PacketTest, pack_and_unpack_ints) TEST(PacketTest, pack_and_unpack_ints)
{ {
fr::Packet packet; fr::Packet packet;
@ -168,7 +178,7 @@ TEST(PacketTest, clear)
a = 20; a = 20;
packet << a; packet << a;
packet >> b; packet >> b;
ASSERT_EQ(b, 20); ASSERT_TRUE(b == 20);
} }
TEST(PacketTest, test_assert_bytes_remaining) TEST(PacketTest, test_assert_bytes_remaining)
@ -186,44 +196,44 @@ TEST(PacketTest, test_size)
{ {
uint32_t val = 30; uint32_t val = 30;
fr::Packet packet; fr::Packet packet;
ASSERT_EQ(packet.size(), 0); ASSERT_EQ(packet.size(), 0u);
packet << val; packet << val;
ASSERT_EQ(packet.size(), 4); ASSERT_EQ(packet.size(), 4u);
packet >> val; packet >> val;
ASSERT_EQ(packet.size(), 4); ASSERT_EQ(packet.size(), 4u);
} }
TEST(PacketTest, test_get_bytes_remaining) TEST(PacketTest, test_get_bytes_remaining)
{ {
uint32_t val = 30; uint32_t val = 30;
fr::Packet packet; fr::Packet packet;
ASSERT_EQ(packet.get_bytes_remaining(), 0); ASSERT_EQ(packet.get_bytes_remaining(), 0u);
packet << val; packet << val;
ASSERT_EQ(packet.get_bytes_remaining(), 4); ASSERT_EQ(packet.get_bytes_remaining(), 4u);
uint16_t out; uint16_t out;
packet >> out; packet >> out;
ASSERT_EQ(packet.get_bytes_remaining(), 2); ASSERT_EQ(packet.get_bytes_remaining(), 2u);
packet.clear(); packet.clear();
ASSERT_EQ(packet.get_bytes_remaining(), 0); ASSERT_EQ(packet.get_bytes_remaining(), 0u);
} }
TEST(PacketTest, test_get_cursor) TEST(PacketTest, test_get_cursor)
{ {
uint32_t val = 0; uint32_t val = 0;
fr::Packet packet; fr::Packet packet;
ASSERT_EQ(packet.get_cursor(), 0); ASSERT_EQ(packet.get_cursor(), 0u);
packet << val << val; packet << val << val;
ASSERT_EQ(packet.get_cursor(), 0); ASSERT_EQ(packet.get_cursor(), 0u);
packet >> val; packet >> val;
ASSERT_EQ(packet.get_cursor(), 4); ASSERT_EQ(packet.get_cursor(), 4u);
packet >> val; packet >> val;
ASSERT_EQ(packet.get_cursor(), 8); ASSERT_EQ(packet.get_cursor(), 8u);
packet.set_cursor(4); packet.set_cursor(4);
ASSERT_EQ(packet.get_cursor(), 4); ASSERT_EQ(packet.get_cursor(), 4u);
packet.clear(); packet.clear();
ASSERT_EQ(packet.get_cursor(), 0); ASSERT_EQ(packet.get_cursor(), 0u);
} }
TEST(PacketTest, test_set_cursor) TEST(PacketTest, test_set_cursor)
@ -231,10 +241,10 @@ TEST(PacketTest, test_set_cursor)
uint32_t val = 0; uint32_t val = 0;
fr::Packet packet; fr::Packet packet;
packet.set_cursor(5); packet.set_cursor(5);
ASSERT_EQ(packet.get_cursor(), 0); ASSERT_EQ(packet.get_cursor(), 0u);
packet << val; packet << val;
packet.set_cursor(3); packet.set_cursor(3);
ASSERT_EQ(packet.get_cursor(), 3); ASSERT_EQ(packet.get_cursor(), 3u);
} }
TEST(PacketTest, test_seek_cursor) TEST(PacketTest, test_seek_cursor)
@ -242,16 +252,16 @@ TEST(PacketTest, test_seek_cursor)
uint32_t val = 0; uint32_t val = 0;
fr::Packet packet; fr::Packet packet;
packet.seek_cursor(-20); packet.seek_cursor(-20);
ASSERT_EQ(packet.get_cursor(), 0); ASSERT_EQ(packet.get_cursor(), 0u);
packet.seek_cursor(20); packet.seek_cursor(20);
ASSERT_EQ(packet.get_cursor(), 0); ASSERT_EQ(packet.get_cursor(), 0u);
packet << val; packet << val;
packet.seek_cursor(3); packet.seek_cursor(3);
ASSERT_EQ(packet.get_cursor(), 3); ASSERT_EQ(packet.get_cursor(), 3u);
packet.seek_cursor(-1); packet.seek_cursor(-1);
ASSERT_EQ(packet.get_cursor(), 2); ASSERT_EQ(packet.get_cursor(), 2u);
packet.seek_cursor(-10); packet.seek_cursor(-10);
ASSERT_EQ(packet.get_cursor(), 0); ASSERT_EQ(packet.get_cursor(), 0u);
packet.seek_cursor(10); packet.seek_cursor(10);
ASSERT_EQ(packet.get_cursor(), 4); ASSERT_EQ(packet.get_cursor(), 4u);
} }