Add support for extracting std::vector<bool> from packets
This commit is contained in:
parent
2c771fa46e
commit
7343529302
@ -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")
|
||||||
|
|||||||
@ -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.
|
||||||
|
|||||||
@ -1,8 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by fred on 06/12/16.
|
|
||||||
//
|
|
||||||
|
|
||||||
namespace fr
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -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);
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user