↰ Return to documentation for file (include/ndef-lite/util.hpp)
#ifndef UTIL_H
#define UTIL_H
#include <deque>
#include <memory>
#include <stdexcept>
#include <string>
#include <vector>
#include "exceptions.hpp"
namespace util {
// clang-format off
#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c"
#define BYTE_TO_BINARY(byte) \
(byte & 0x80 ? '1' : '0'), \
(byte & 0x40 ? '1' : '0'), \
(byte & 0x20 ? '1' : '0'), \
(byte & 0x10 ? '1' : '0'), \
(byte & 0x08 ? '1' : '0'), \
(byte & 0x04 ? '1' : '0'), \
(byte & 0x02 ? '1' : '0'), \
(byte & 0x01 ? '1' : '0')
// clang-format on
template <typename T>
inline T pop_front(std::deque<T>& queue)
{
// Get front byte value and then remove it from queue
auto byte = queue.front();
queue.pop_front();
return byte;
}
template <typename T>
inline std::vector<T> drain_deque(std::deque<T>& queue, size_t n)
{
// Store values that have been "popped"
std::vector<T> retVals{ queue.begin(), queue.begin() + n };
// Remove values from queue
queue.erase(queue.begin(), queue.begin() + n);
return retVals;
}
constexpr inline uint32_t uint32FromBEBytes(uint8_t bytes[4])
{
return static_cast<uint32_t>(bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3] << 0);
}
template <typename T>
void assertHasValues(std::deque<T> queue, size_t n, std::string item)
{
if (queue.size() < n) {
throw NDEFException("Too few elements in queue for " + item + " field: " + "require " + std::to_string(n) +
" have " + std::to_string(queue.size()));
}
// Number of elements >= n, no exception tossing today boys
return;
}
template <typename T>
void assertHasValue(std::deque<T> queue, std::string item)
{
// That's all we need to know
if (queue.size() > 0)
return;
// Oh brother, there are 0 elements in the queue...
throw NDEFException("Too few elements in queue for " + item + " field: require 1 have 0");
}
} // namespace util
#endif // UTIL_H