Skip to content

Commit

Permalink
feat: add streaming of little endian mac addresses (philips-software#336
Browse files Browse the repository at this point in the history
)

* Add streaming to and from LittleEndianMacAddress

* MacAddress.cpp: Include algorithm.
  • Loading branch information
EkelmansPh committed Jun 27, 2023
1 parent 8643db6 commit e3d7fd8
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 22 deletions.
61 changes: 45 additions & 16 deletions hal/interfaces/MacAddress.cpp
Original file line number Diff line number Diff line change
@@ -1,25 +1,12 @@
#include "MacAddress.hpp"
#include <algorithm>

namespace infra
{
AsMacAddressHelper::AsMacAddressHelper(hal::MacAddress macAddress)
: macAddress(macAddress)
{}

AsMacAddressHelper AsMacAddress(hal::MacAddress macAddress)
{
return AsMacAddressHelper{ macAddress };
}

AsMacAddressWriterHelper::AsMacAddressWriterHelper(hal::MacAddress& macAddress)
: macAddress(macAddress)
{}

AsMacAddressWriterHelper ToMacAddress(hal::MacAddress& macAddress)
{
return AsMacAddressWriterHelper{ macAddress };
}

TextOutputStream& operator<<(TextOutputStream& stream, const AsMacAddressHelper& asMacAddressHelper)
{
auto& mac = asMacAddressHelper.macAddress;
Expand All @@ -39,16 +26,58 @@ namespace infra
return stream << asMacAddressHelper;
}

TextInputStream& operator>>(TextInputStream& stream, AsMacAddressWriterHelper asMacAddressHelper)
ToMacAddressHelper::ToMacAddressHelper(hal::MacAddress& macAddress)
: macAddress(macAddress)
{}

TextInputStream& operator>>(TextInputStream& stream, ToMacAddressHelper asMacAddressHelper)
{
auto& mac = asMacAddressHelper.macAddress;
const auto w02 = Width(2, '0');
stream >> hex >> w02 >> mac[0] >> resetWidth >> ":" >> w02 >> mac[1] >> resetWidth >> ":" >> w02 >> mac[2] >> resetWidth >> ":" >> w02 >> mac[3] >> resetWidth >> ":" >> w02 >> mac[4] >> resetWidth >> ":" >> w02 >> mac[5];
return stream;
}

TextInputStream& operator>>(TextInputStream&& stream, AsMacAddressWriterHelper asMacAddressHelper)
TextInputStream& operator>>(TextInputStream&& stream, ToMacAddressHelper asMacAddressHelper)
{
return stream >> asMacAddressHelper;
}

ToLittleEndianMacAddressHelper::ToLittleEndianMacAddressHelper(hal::MacAddress& macAddress)
: macAddress(macAddress)
{}

TextInputStream& operator>>(TextInputStream& stream, ToLittleEndianMacAddressHelper asMacAddressHelper)
{
auto& mac = asMacAddressHelper.macAddress;
const auto w02 = Width(2, '0');
stream >> hex >> w02 >> mac[5] >> resetWidth >> ":" >> w02 >> mac[4] >> resetWidth >> ":" >> w02 >> mac[3] >> resetWidth >> ":" >> w02 >> mac[2] >> resetWidth >> ":" >> w02 >> mac[1] >> resetWidth >> ":" >> w02 >> mac[0];
return stream;
}

TextInputStream& operator>>(TextInputStream&& stream, ToLittleEndianMacAddressHelper asMacAddressHelper)
{
return stream >> asMacAddressHelper;
}

AsMacAddressHelper AsMacAddress(hal::MacAddress macAddress)
{
return AsMacAddressHelper{ macAddress };
}

ToMacAddressHelper ToMacAddress(hal::MacAddress& macAddress)
{
return ToMacAddressHelper{ macAddress };
}

AsMacAddressHelper AsLittleEndianMacAddress(hal::MacAddress macAddress)
{
std::reverse(std::begin(macAddress), std::end(macAddress));
return AsMacAddressHelper{ macAddress };
}

ToLittleEndianMacAddressHelper ToLittleEndianMacAddress(hal::MacAddress& macAddress)
{
return ToLittleEndianMacAddressHelper{ macAddress };
}
}
27 changes: 21 additions & 6 deletions hal/interfaces/MacAddress.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,34 @@ namespace infra
hal::MacAddress macAddress;
};

class AsMacAddressWriterHelper
class ToMacAddressHelper
{
public:
explicit AsMacAddressWriterHelper(hal::MacAddress& macAddress);
explicit ToMacAddressHelper(hal::MacAddress& macAddress);

friend TextInputStream& operator>>(TextInputStream& stream, AsMacAddressWriterHelper asMacAddressHelper);
friend TextInputStream& operator>>(TextInputStream&& stream, AsMacAddressWriterHelper asMacAddressHelper);
friend TextInputStream& operator>>(TextInputStream& stream, ToMacAddressHelper asMacAddressHelper);
friend TextInputStream& operator>>(TextInputStream&& stream, ToMacAddressHelper asMacAddressHelper);

private:
protected:
hal::MacAddress& macAddress;
};

class ToLittleEndianMacAddressHelper
{
public:
explicit ToLittleEndianMacAddressHelper(hal::MacAddress& macAddress);

friend TextInputStream& operator>>(TextInputStream& stream, ToLittleEndianMacAddressHelper asMacAddressHelper);
friend TextInputStream& operator>>(TextInputStream&& stream, ToLittleEndianMacAddressHelper asMacAddressHelper);

protected:
hal::MacAddress& macAddress;
};

AsMacAddressHelper AsMacAddress(hal::MacAddress macAddress);
AsMacAddressWriterHelper ToMacAddress(hal::MacAddress& macAddress);
ToMacAddressHelper ToMacAddress(hal::MacAddress& macAddress);

AsMacAddressHelper AsLittleEndianMacAddress(hal::MacAddress macAddress);
ToLittleEndianMacAddressHelper ToLittleEndianMacAddress(hal::MacAddress& macAddress);
}
#endif
19 changes: 19 additions & 0 deletions hal/interfaces/test/TestMacAddress.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,22 @@ TEST(MacAddressTest, fromStream)
hal::MacAddress expected{ 0x98, 0x87, 0x76, 0x65, 0x54, 0x43 };
EXPECT_EQ(mac, expected);
}

TEST(MacAddressTest, toStreamAsLittleEndianMacAddress)
{
infra::StringOutputStream::WithStorage<64> stream;
const hal::MacAddress mac = { 0x67, 0x56, 0x45, 0x34, 0x23, 0x12 };
stream << infra::AsLittleEndianMacAddress(mac);
EXPECT_EQ("12:23:34:45:56:67", stream.Storage());
}

TEST(MacAddressTest, fromStreamToLittleEndianMacAddress)
{
infra::StringInputStream stream{ "12:23:34:45:56:67" };

hal::MacAddress mac{};
stream >> infra::ToLittleEndianMacAddress(mac);

hal::MacAddress expected{ 0x67, 0x56, 0x45, 0x34, 0x23, 0x12 };
EXPECT_EQ(mac, expected);
}

0 comments on commit e3d7fd8

Please sign in to comment.