Program Listing for File util.hpp

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