diff options
-rw-r--r-- | include/ipmid/message/pack.hpp | 16 | ||||
-rw-r--r-- | test/message/pack.cpp | 26 |
2 files changed, 42 insertions, 0 deletions
diff --git a/include/ipmid/message/pack.hpp b/include/ipmid/message/pack.hpp index 104354d..b458af4 100644 --- a/include/ipmid/message/pack.hpp +++ b/include/ipmid/message/pack.hpp @@ -18,6 +18,7 @@ #include <array> #include <ipmid/message/types.hpp> #include <memory> +#include <optional> #include <phosphor-logging/log.hpp> #include <tuple> #include <utility> @@ -165,6 +166,21 @@ struct PackSingle<std::bitset<N>> } }; +/** @brief Specialization of PackSingle for std::optional<T> */ +template <typename T> +struct PackSingle<std::optional<T>> +{ + static int op(Payload& p, const std::optional<T>& t) + { + int ret = 0; + if (t) + { + ret = PackSingle<T>::op(p, *t); + } + return ret; + } +}; + /** @brief Specialization of PackSingle for std::array<T, N> */ template <typename T, size_t N> struct PackSingle<std::array<T, N>> diff --git a/test/message/pack.cpp b/test/message/pack.cpp index b3957cc..03846c5 100644 --- a/test/message/pack.cpp +++ b/test/message/pack.cpp @@ -222,6 +222,32 @@ TEST(PackBasics, VectorUint8) ASSERT_EQ(p.raw, k); } +TEST(PackBasics, OptionalEmpty) +{ + // an optional will only pack if the value is present + ipmi::message::Payload p; + std::optional<uint32_t> v; + p.pack(v); + // check that the number of bytes matches + ASSERT_EQ(p.size(), 0); + // check that the bytes were correctly packed (in byte order) + std::vector<uint8_t> k = {}; + ASSERT_EQ(p.raw, k); +} + +TEST(PackBasics, OptionalContainsValue) +{ + // an optional will only pack if the value is present + ipmi::message::Payload p; + std::optional<uint32_t> v(0x04860002); + p.pack(v); + // check that the number of bytes matches + ASSERT_EQ(p.size(), sizeof(uint32_t)); + // check that the bytes were correctly packed (in byte order) + std::vector<uint8_t> k = {0x02, 0x00, 0x86, 0x04}; + ASSERT_EQ(p.raw, k); +} + TEST(PackAdvanced, Uints) { // all elements will be processed in order, with each multi-byte |