/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
 * Copyright (c) 2013-2023 Regents of the University of California.
 *
 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
 *
 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 *
 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
 *
 * You should have received copies of the GNU General Public License and GNU Lesser
 * General Public License along with ndn-cxx, e.g., in COPYING.md file.  If not, see
 * <http://www.gnu.org/licenses/>.
 *
 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
 */

#define BOOST_TEST_MODULE ndn-cxx Encoding Benchmark
#include "tests/boost-test.hpp"

#include "ndn-cxx/encoding/tlv.hpp"
#include "tests/benchmarks/timed-execute.hpp"

#include <boost/mpl/vector.hpp>
#include <boost/mpl/vector_c.hpp>

#include <iostream>

namespace ndn::tests {

template<size_t WIRE_SIZE>
struct ReadVarNumberTest;

template<>
struct ReadVarNumberTest<1>
{
  static constexpr uint8_t WIRE[] = {0xfc};
  static constexpr uint64_t VALUE = 252;
};

template<>
struct ReadVarNumberTest<3>
{
  static constexpr uint8_t WIRE[] = {0xfd, 0x00, 0xfd};
  static constexpr uint64_t VALUE = 253;
};

template<>
struct ReadVarNumberTest<5>
{
  static constexpr uint8_t WIRE[] = {0xfe, 0x00, 0x01, 0x00, 0x00};
  static constexpr uint64_t VALUE = 65536;
};

template<>
struct ReadVarNumberTest<9>
{
  static constexpr uint8_t WIRE[] = {0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00};
  static constexpr uint64_t VALUE = 4294967296;
};

template<size_t WIRE_SIZE, size_t ALIGNMENT_OFFSET>
struct ReadVarNumberAlignTest : public ReadVarNumberTest<WIRE_SIZE>
{
  using AlignmentOffset = std::integral_constant<size_t, ALIGNMENT_OFFSET>;

  static_assert(sizeof(ReadVarNumberTest<WIRE_SIZE>::WIRE) == WIRE_SIZE);
};

using ReadVarNumberTests = boost::mpl::vector<
  ReadVarNumberAlignTest<1, 0>,
  ReadVarNumberAlignTest<3, 0>,
  ReadVarNumberAlignTest<3, 1>,
  ReadVarNumberAlignTest<5, 0>,
  ReadVarNumberAlignTest<5, 1>,
  ReadVarNumberAlignTest<5, 2>,
  ReadVarNumberAlignTest<5, 3>,
  ReadVarNumberAlignTest<9, 0>,
  ReadVarNumberAlignTest<9, 1>,
  ReadVarNumberAlignTest<9, 2>,
  ReadVarNumberAlignTest<9, 3>,
  ReadVarNumberAlignTest<9, 4>,
  ReadVarNumberAlignTest<9, 5>,
  ReadVarNumberAlignTest<9, 6>,
  ReadVarNumberAlignTest<9, 7>
>;

// Benchmark of ndn::tlv::readVarNumber with different number lengths and alignments.
// For accurate results, it is required to compile ndn-cxx in release mode.
// It is recommended to run the benchmark multiple times and take the average.
BOOST_AUTO_TEST_CASE_TEMPLATE(ReadVarNumber, Test, ReadVarNumberTests)
{
  constexpr int N_ITERATIONS = 100000000;

  alignas(8) uint8_t buffer[16];
  static_assert(Test::AlignmentOffset::value + sizeof(Test::WIRE) <= sizeof(buffer));
  uint8_t* const begin = buffer + Test::AlignmentOffset::value;
  std::memcpy(begin, Test::WIRE, sizeof(Test::WIRE));
  const uint8_t* const end = begin + sizeof(Test::WIRE);

  int nOks = 0;
  int nCorrects = 0;
  auto d = timedExecute([&] {
    uint64_t number = 0;
    for (int i = 0; i < N_ITERATIONS; ++i) {
      const uint8_t* begin2 = begin; // make a copy because readVarNumber increments the pointer
      nOks += tlv::readVarNumber(begin2, end, number);
      nCorrects += number == Test::VALUE;
      // use the number and the return value, so compiler won't optimize out their computation
    }
  });
  BOOST_CHECK_EQUAL(nOks, N_ITERATIONS);
  BOOST_CHECK_EQUAL(nCorrects, N_ITERATIONS);
  std::cout << "size=" << sizeof(Test::WIRE)
            << " offset=" << Test::AlignmentOffset::value
            << " " << d << std::endl;
}

} // namespace ndn::tests
