#include <cstdint>
#include <iostream>
#include <algorithm>
#include <type_traits>
using namespace std;
constexpr uint16_t MM_len = 128;
uint8_t MM_data[MM_len] = {};
uint16_t MM_index = 0;
// add() variant to copy a buffer into MM_data. Returns updated MM_index or 0
uint16_t add(uint16_t count, uint8_t *arrayOfBytes)
{
if (!MM_data || count > MM_len - MM_index)
return 0;
std::copy_n(arrayOfBytes, count, &MM_data[MM_index]);
MM_index += count;
return MM_index;
}
// Terminate args recursion
uint16_t add() { return 0; }
// add() - add a single data element MSB first to MM_data. Returns updated MM_index or 0
template <class T> uint16_t add(T v) {
uint16_t sz = sizeof(T); // Size of value to be added
// Will it fit?
if (MM_data && sz <= (MM_len - MM_index)) {
// Yes. Copy it MSB first
while (sz) {
sz--;
MM_data[MM_index++] = (v >> (sz << 3)) & 0xFF;
}
// Return updated MM_index (logical length of message so far)
return MM_index;
}
// No, will not fit - return 0
return 0;
}
// First arg is uint8_t
template <class... Args>
typename std::enable_if<(sizeof...(Args) > 0), uint16_t>::type
add(uint8_t v, Args... args) {
return add(v) + add(args...);
}
// First arg is uint16_t
template <class... Args>
typename std::enable_if<(sizeof...(Args) > 0), uint16_t>::type
add(uint16_t v, Args... args) {
return add(v) + add(args...);
}
// First arg is uint32_t
template <class... Args>
typename std::enable_if<(sizeof...(Args) > 0), uint16_t>::type
add(uint32_t v, Args... args) {
return add(v) + add(args...);
}
auto main() -> int
{
uint8_t a[] = { 4, 5, 6 };
add(uint16_t{ 1 }, uint8_t{ 2 }, uint32_t{ 3 });
add(3, &a[0]);
for (uint16_t i = 0; i < MM_index; ++i)
cout << int{ MM_data[i] } << " ";
cout << endl;
}
I2luY2x1ZGUgPGNzdGRpbnQ+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0ZXhwciB1aW50MTZfdCBNTV9sZW4gPSAxMjg7CnVpbnQ4X3QgTU1fZGF0YVtNTV9sZW5dID0ge307CnVpbnQxNl90IE1NX2luZGV4ID0gMDsKCi8vIGFkZCgpIHZhcmlhbnQgdG8gY29weSBhIGJ1ZmZlciBpbnRvIE1NX2RhdGEuIFJldHVybnMgdXBkYXRlZCBNTV9pbmRleCBvciAwCnVpbnQxNl90IGFkZCh1aW50MTZfdCBjb3VudCwgdWludDhfdCAqYXJyYXlPZkJ5dGVzKQp7CglpZiAoIU1NX2RhdGEgfHwgY291bnQgPiBNTV9sZW4gLSBNTV9pbmRleCkKCQlyZXR1cm4gMDsKCXN0ZDo6Y29weV9uKGFycmF5T2ZCeXRlcywgY291bnQsICZNTV9kYXRhW01NX2luZGV4XSk7CglNTV9pbmRleCArPSBjb3VudDsKCXJldHVybiBNTV9pbmRleDsKfQoKLy8gVGVybWluYXRlIGFyZ3MgcmVjdXJzaW9uCnVpbnQxNl90IGFkZCgpIHsgcmV0dXJuIDA7IH0KCi8vIGFkZCgpIC0gYWRkIGEgc2luZ2xlIGRhdGEgZWxlbWVudCBNU0IgZmlyc3QgdG8gTU1fZGF0YS4gUmV0dXJucyB1cGRhdGVkIE1NX2luZGV4IG9yIDAKdGVtcGxhdGUgPGNsYXNzIFQ+IHVpbnQxNl90IGFkZChUIHYpIHsKICAgIHVpbnQxNl90IHN6ID0gc2l6ZW9mKFQpOyAgICAvLyBTaXplIG9mIHZhbHVlIHRvIGJlIGFkZGVkCgogICAgLy8gV2lsbCBpdCBmaXQ/CiAgICBpZiAoTU1fZGF0YSAmJiBzeiA8PSAoTU1fbGVuIC0gTU1faW5kZXgpKSB7CiAgICAgIC8vIFllcy4gQ29weSBpdCBNU0IgZmlyc3QKICAgICAgd2hpbGUgKHN6KSB7CiAgICAgICAgc3otLTsKICAgICAgICBNTV9kYXRhW01NX2luZGV4KytdID0gKHYgPj4gKHN6IDw8IDMpKSAmIDB4RkY7CiAgICAgIH0KICAgICAgLy8gUmV0dXJuIHVwZGF0ZWQgTU1faW5kZXggKGxvZ2ljYWwgbGVuZ3RoIG9mIG1lc3NhZ2Ugc28gZmFyKQogICAgICByZXR1cm4gTU1faW5kZXg7CiAgICB9CiAgICAvLyBObywgd2lsbCBub3QgZml0IC0gcmV0dXJuIDAKICAgIHJldHVybiAwOwp9CgovLyBGaXJzdCBhcmcgaXMgdWludDhfdAp0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJncz4gCnR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPChzaXplb2YuLi4oQXJncykgPiAwKSwgdWludDE2X3Q+Ojp0eXBlCmFkZCh1aW50OF90IHYsIEFyZ3MuLi4gYXJncykgewogICAgcmV0dXJuIGFkZCh2KSArIGFkZChhcmdzLi4uKTsKfQoKLy8gRmlyc3QgYXJnIGlzIHVpbnQxNl90CnRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPiAKdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8KHNpemVvZi4uLihBcmdzKSA+IDApLCB1aW50MTZfdD46OnR5cGUKYWRkKHVpbnQxNl90IHYsIEFyZ3MuLi4gYXJncykgewogICAgcmV0dXJuIGFkZCh2KSArIGFkZChhcmdzLi4uKTsKfQoKLy8gRmlyc3QgYXJnIGlzIHVpbnQzMl90CnRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgp0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwoc2l6ZW9mLi4uKEFyZ3MpID4gMCksIHVpbnQxNl90Pjo6dHlwZQphZGQodWludDMyX3QgdiwgQXJncy4uLiBhcmdzKSB7CiAgICByZXR1cm4gYWRkKHYpICsgYWRkKGFyZ3MuLi4pOwp9CgphdXRvIG1haW4oKSAtPiBpbnQKewogICAgdWludDhfdCBhW10gPSB7IDQsIDUsIDYgfTsKICAgIGFkZCh1aW50MTZfdHsgMSB9LCB1aW50OF90eyAyIH0sIHVpbnQzMl90eyAzIH0pOwogICAgYWRkKDMsICZhWzBdKTsKICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBNTV9pbmRleDsgKytpKQogICAgCWNvdXQgPDwgaW50eyBNTV9kYXRhW2ldIH0gPDwgIiAiOwogICAgY291dCA8PCBlbmRsOwp9Cg==