/*
 * Copyright 2022 Rive
 */

#include "bench.hpp"

#include "rive/math/raw_path.hpp"

using namespace rive;

static void map(
    const Mat2D& m,
    std::vector<Vec2D>& dst,
    const std::vector<Vec2D>& pts)
{
  size_t n = pts.size();
#if 0
    // Scalar implementation.
    for (size_t i = 0; i < n; ++i)
        dst[i] = m * pts[i];
#else
  // Vector implementation.
  m.mapPoints(dst.data(), pts.data(), n);
#endif
}

// Measure the speed of Mat2D::mapPoints().
class MapPoints : public Bench
{
public:
  MapPoints(const Mat2D& matrix) : m_matrix(matrix)
  {
    m_points.resize(32768 / sizeof(Vec2D)); // 32k so we fit in L1.
    srand(0);
    for (Vec2D& pt : m_points)
      pt = Vec2D(float(rand()), float(rand())) * 100 / (float)RAND_MAX;
    m_dst.resize(m_points.size());
  }

private:
  int run() const override
  {
    map(m_matrix, m_dst, m_points);
    for (int i = 1; i < 4096; ++i)
      map(m_matrix, m_dst, m_dst);
    return static_cast<int>(m_dst.back().x);
  }

  Mat2D m_matrix;
  std::vector<Vec2D> m_points;
  mutable std::vector<Vec2D> m_dst;
};

class MapPointsScaleTrans : public MapPoints
{
public:
  MapPointsScaleTrans() : MapPoints(Mat2D(-2, 0, 0, 3, -4, 5)) {}
};

class MapPointsAffine : public MapPoints
{
public:
  MapPointsAffine() : MapPoints(Mat2D(2, -3, -4, 5, 6, -7)) {}
};

REGISTER_BENCH(MapPointsScaleTrans);
REGISTER_BENCH(MapPointsAffine);
