#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(uint8_t *arrayOfBytes, uint16_t count)
{
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;
}
template <class T, class... Args>
typename std::enable_if<!std::is_pointer<T>::value, uint16_t>::type
add(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(&a[0], 3);
for (uint16_t i = 0; i < MM_index; ++i)
cout << int{ MM_data[i] } << " ";
cout << endl;
}
I2luY2x1ZGUgPGNzdGRpbnQ+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0ZXhwciB1aW50MTZfdCBNTV9sZW4gPSAxMjg7CnVpbnQ4X3QgTU1fZGF0YVtNTV9sZW5dID0ge307CnVpbnQxNl90IE1NX2luZGV4ID0gMDsKCi8vIGFkZCgpIHZhcmlhbnQgdG8gY29weSBhIGJ1ZmZlciBpbnRvIE1NX2RhdGEuIFJldHVybnMgdXBkYXRlZCBNTV9pbmRleCBvciAwCnVpbnQxNl90IGFkZCh1aW50OF90ICphcnJheU9mQnl0ZXMsIHVpbnQxNl90IGNvdW50KQp7CglpZiAoIU1NX2RhdGEgfHwgY291bnQgPiBNTV9sZW4gLSBNTV9pbmRleCkKCQlyZXR1cm4gMDsKCXN0ZDo6Y29weV9uKGFycmF5T2ZCeXRlcywgY291bnQsICZNTV9kYXRhW01NX2luZGV4XSk7CglNTV9pbmRleCArPSBjb3VudDsKCXJldHVybiBNTV9pbmRleDsKfQoKLy8gVGVybWluYXRlIGFyZ3MgcmVjdXJzaW9uCnVpbnQxNl90IGFkZCgpIHsgcmV0dXJuIDA7IH0KCi8vIGFkZCgpIC0gYWRkIGEgc2luZ2xlIGRhdGEgZWxlbWVudCBNU0IgZmlyc3QgdG8gTU1fZGF0YS4gUmV0dXJucyB1cGRhdGVkIE1NX2luZGV4IG9yIDAKdGVtcGxhdGUgPGNsYXNzIFQ+IHVpbnQxNl90IGFkZChUIHYpIHsKICAgIHVpbnQxNl90IHN6ID0gc2l6ZW9mKFQpOyAgICAvLyBTaXplIG9mIHZhbHVlIHRvIGJlIGFkZGVkCgogICAgLy8gV2lsbCBpdCBmaXQ/CiAgICBpZiAoTU1fZGF0YSAmJiBzeiA8PSAoTU1fbGVuIC0gTU1faW5kZXgpKSB7CiAgICAgIC8vIFllcy4gQ29weSBpdCBNU0IgZmlyc3QKICAgICAgd2hpbGUgKHN6KSB7CiAgICAgICAgc3otLTsKICAgICAgICBNTV9kYXRhW01NX2luZGV4KytdID0gKHYgPj4gKHN6IDw8IDMpKSAmIDB4RkY7CiAgICAgIH0KICAgICAgLy8gUmV0dXJuIHVwZGF0ZWQgTU1faW5kZXggKGxvZ2ljYWwgbGVuZ3RoIG9mIG1lc3NhZ2Ugc28gZmFyKQogICAgICByZXR1cm4gTU1faW5kZXg7CiAgICB9CiAgICAvLyBObywgd2lsbCBub3QgZml0IC0gcmV0dXJuIDAKICAgIHJldHVybiAwOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MuLi4gQXJncz4gCnR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX3BvaW50ZXI8VD46OnZhbHVlLCB1aW50MTZfdD46OnR5cGUKYWRkKFQgdiwgQXJncy4uLiBhcmdzKSB7CiAgICByZXR1cm4gYWRkKHYpICsgYWRkKGFyZ3MuLi4pOwp9CgphdXRvIG1haW4oKSAtPiBpbnQKewogICAgdWludDhfdCBhW10gPSB7IDQsIDUsIDYgfTsKICAgIGFkZCh1aW50MTZfdHsgMSB9LCB1aW50OF90eyAyIH0sIHVpbnQzMl90eyAzIH0pOwogICAgYWRkKCZhWzBdLCAzKTsKICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBNTV9pbmRleDsgKytpKQogICAgCWNvdXQgPDwgaW50eyBNTV9kYXRhW2ldIH0gPDwgIiAiOwogICAgY291dCA8PCBlbmRsOwp9Cg==