/*
 * Copyright 2022 Rive
 */

#ifndef _RIVE_RENDERER_UTILS_HPP_
#define _RIVE_RENDERER_UTILS_HPP_

#include "rive/rive_types.hpp"
#include "rive/core/type_conversions.hpp"
#include <string>

template <size_t N, typename T> class AutoSTArray
{
  T m_storage[N];
  T* m_ptr;
  const size_t m_count;

public:
  AutoSTArray(size_t n) : m_count(n)
  {
    m_ptr = m_storage;
    if (n > N)
    {
      m_ptr = new T[n];
    }
  }
  ~AutoSTArray()
  {
    if (m_ptr != m_storage)
    {
      delete[] m_ptr;
    }
  }

  size_t size() const { return m_count; }
  int count() const { return rive::castTo<int>(m_count); }

  T* data() const { return m_ptr; }

  T& operator[](size_t index)
  {
    assert(index < m_count);
    return m_ptr[index];
  }
};

constexpr inline uint32_t make_tag(uint8_t a, uint8_t b, uint8_t c, uint8_t d)
{
  return (a << 24) | (b << 16) | (c << 8) | d;
}

static inline std::string tag2str(uint32_t tag)
{
  std::string str = "abcd";
  str[0] = (tag >> 24) & 0xFF;
  str[1] = (tag >> 16) & 0xFF;
  str[2] = (tag >> 8) & 0xFF;
  str[3] = (tag >> 0) & 0xFF;
  return str;
}

#endif
