//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// UNSUPPORTED: c++03

// <deque>

// Test how deque manages the spare blocks it keeps. The exact values it tests
// for are not always important, but are sometimes needed to ensure the container
// resizes or shrinks at the correct time.

#include <deque>
#include <cstdio>
#include <memory>
#include <queue>
#include <stack>

#include "min_allocator.h"
#include "rapid-cxx-test.h"

template <class Adaptor>
struct ContainerAdaptor : public Adaptor {
  using Adaptor::Adaptor;
  typename Adaptor::container_type& GetContainer() { return Adaptor::c; }
};

template <class Deque>
static void print(const Deque& d) {
  std::printf("%zu : __front_spare() == %zu"
              " : __back_spare() == %zu"
              " : __capacity() == %zu"
              " : bytes allocated == %zu\n",
              d.size(), d.__front_spare(), d.__back_spare(), d.__capacity(),
              malloc_allocator_base::outstanding_bytes);
}

template <class T>
using Deque = std::deque<T, malloc_allocator<T> >;

template <class T>
using BlockSize = std::__deque_block_size<T, std::ptrdiff_t>;

struct LargeT {
  LargeT() = default;
  char buff[256] = {};
};
static_assert(BlockSize<LargeT>::value == 16, "");

const auto& AllocBytes = malloc_allocator_base::outstanding_bytes;

template <class Deque>
struct PrintOnFailure {
   explicit PrintOnFailure(Deque const& deque) : deque_(&deque) {}

  ~PrintOnFailure() {
    if (::rapid_cxx_test::get_reporter().current_failure().type
        != ::rapid_cxx_test::failure_type::none) {
      print(*deque_);
    }
  }
private:
  const Deque* deque_;

  PrintOnFailure(PrintOnFailure const&) = delete;
};

TEST_SUITE(deque_spare_tests)

TEST_CASE(push_back) {
  const auto BS = BlockSize<LargeT>::value;
  std::unique_ptr<Deque<LargeT>> dp(new Deque<LargeT>);
  auto& d = *dp;
  PrintOnFailure<Deque<LargeT>> on_fail(d);

  // Test nothing is allocated after default construction.
  {
    TEST_REQUIRE(d.size() == 0);
    TEST_REQUIRE(d.__capacity() == 0);
    TEST_REQUIRE(d.__block_count() == 0);
  }
  // First push back allocates one block.
  d.push_back({});
  {
    TEST_REQUIRE(d.size() == 1);
    TEST_REQUIRE(d.__front_spare() == 0);
    TEST_REQUIRE(d.__back_spare() == 14);
    TEST_REQUIRE(d.__back_spare_blocks() == 0);
    TEST_REQUIRE(d.__capacity() == BS - 1);
    TEST_REQUIRE(d.__block_count() == 1);
  }

  d.push_back({});
  {
    TEST_REQUIRE(d.size() == 2);
    TEST_REQUIRE(d.__front_spare() == 0);
    TEST_REQUIRE(d.__back_spare() == 13);
    TEST_REQUIRE(d.__back_spare_blocks() == 0);
  }
  // Push back until we need a new block.
  for (int RemainingCap = d.__capacity() - d.size(); RemainingCap >= 0; --RemainingCap)
    d.push_back({});
  {
    TEST_REQUIRE(d.__block_count() == 2);
    TEST_REQUIRE(d.__front_spare_blocks() == 0);
    TEST_REQUIRE(d.__back_spare_blocks() == 0);
    TEST_REQUIRE(d.__back_spare() == 15);
  }

  // Remove the only element in the new block. Test that we keep the empty
  // block as a spare.
  d.pop_back();
  {
    TEST_REQUIRE(d.__block_count() == 2);
    TEST_REQUIRE(d.__front_spare_blocks() == 0);
    TEST_REQUIRE(d.__back_spare_blocks() == 1);
    TEST_REQUIRE(d.__back_spare() == 16);
  }

  // Pop back again, keep the spare.
  d.pop_back();
  {
    TEST_REQUIRE(d.__block_count() == 2);
    TEST_REQUIRE(d.__front_spare() == 0);
    TEST_REQUIRE(d.__back_spare() == 17);
    TEST_REQUIRE(d.__back_spare_blocks() == 1);
  }

  dp.reset();
  TEST_REQUIRE(AllocBytes == 0);
}

TEST_CASE(push_front) {
  std::unique_ptr<Deque<LargeT>> dp(new Deque<LargeT>);
  auto& d = *dp;
  PrintOnFailure<Deque<LargeT>> on_fail(d);

  // Test nothing is allocated after default construction.
  {
    TEST_REQUIRE(d.size() == 0);
    TEST_REQUIRE(d.__capacity() == 0);
    TEST_REQUIRE(d.__block_count() == 0);
  }
  // First push front allocates one block, and we start the sequence in the
  // middle.
  d.push_front({});
  {
    TEST_REQUIRE(d.size() == 1);
    TEST_REQUIRE(d.__front_spare() == 7);
    TEST_REQUIRE(d.__back_spare() == 7);
    TEST_REQUIRE(d.__front_spare_blocks() == 0);
    TEST_REQUIRE(d.__back_spare_blocks() == 0);
    TEST_REQUIRE(d.__block_count() == 1);
  }

  d.push_front({});
  {
    TEST_REQUIRE(d.size() == 2);
    TEST_REQUIRE(d.__front_spare() == 6);
    TEST_REQUIRE(d.__back_spare() == 7);
    TEST_REQUIRE(d.__front_spare_blocks() == 0);
    TEST_REQUIRE(d.__back_spare_blocks() == 0);
  }
  // Push front until we need a new block.
  for (int RemainingCap = d.__front_spare(); RemainingCap >= 0; --RemainingCap)
    d.push_front({});
  {
    TEST_REQUIRE(d.__block_count() == 2);
    TEST_REQUIRE(d.__front_spare() == 15);
    TEST_REQUIRE(d.__back_spare() == 7);
    TEST_REQUIRE(d.__front_spare_blocks() == 0);
    TEST_REQUIRE(d.__back_spare_blocks() == 0);
  }

  // Remove the only element in the new block. Test that we keep the empty
  // block as a spare.
  d.pop_front();
  {
    TEST_REQUIRE(d.__block_count() == 2);
    TEST_REQUIRE(d.__front_spare_blocks() == 1);
    TEST_REQUIRE(d.__back_spare_blocks() == 0);
    TEST_REQUIRE(d.__back_spare() == 7);
  }

  // Pop back again, keep the spare.
  d.pop_front();
  {
    TEST_REQUIRE(d.__block_count() == 2);
    TEST_REQUIRE(d.__front_spare_blocks() == 1);
    TEST_REQUIRE(d.__back_spare() == 7);
  }

  dp.reset();
  TEST_REQUIRE(AllocBytes == 0);
}

TEST_CASE(std_queue) {
  using D = Deque<LargeT>;
  using Queue = std::queue<LargeT, D>;
  ContainerAdaptor<Queue> CA;
  const D& d = CA.GetContainer();
  Queue &q = CA;
  PrintOnFailure<Deque<LargeT>> on_fail(d);

  while (d.__block_count() < 4)
    q.push({});
  {
    TEST_REQUIRE(d.__block_count() == 4);
    TEST_REQUIRE(d.__front_spare() == 0);
    TEST_REQUIRE(d.__back_spare() == 15);
    TEST_REQUIRE(d.__back_spare_blocks() == 0);
  }
  while (d.__back_spare()) {
    q.push({});
  }
  {
    TEST_REQUIRE(d.__block_count() == 4);
    TEST_REQUIRE(d.__front_spare() == 0);
    TEST_REQUIRE(d.__back_spare() == 0);
  }
  q.pop();
  {
    TEST_REQUIRE(d.__block_count() == 4);
    TEST_REQUIRE(d.__front_spare() == 1);
    TEST_REQUIRE(d.__back_spare() == 0);
  }

  // Pop until we create a spare block at the front.
  while (d.__front_spare() <= 15)
    q.pop();

  {
    TEST_REQUIRE(d.__block_count() == 4);
    TEST_REQUIRE(d.__front_spare_blocks() == 1);
    TEST_REQUIRE(d.__front_spare() == 16);
    TEST_REQUIRE(d.__back_spare() == 0);
  }

  // Push at the end -- should re-use new spare block at front
  q.push({});

  {
    TEST_REQUIRE(d.__block_count() == 4);
    TEST_REQUIRE(d.__front_spare_blocks() == 0);
    TEST_REQUIRE(d.__front_spare() == 0);
    TEST_REQUIRE(d.__back_spare() == 15);
  }
  while (!q.empty()) {
    q.pop();
    TEST_REQUIRE(d.__front_spare_blocks() + d.__back_spare_blocks() <= 2);
  }

  // The empty state has two blocks
  {
    TEST_REQUIRE(d.__front_spare() == 16);
    TEST_REQUIRE(d.__back_spare() == 15);
    TEST_REQUIRE(d.__capacity() == 31);
  }
}

TEST_CASE(pop_front_push_back) {
  Deque<char> d(32 * 1024, 'a');
  bool take_from_front = true;
  while (d.size() > 0) {
    if (take_from_front) {
      d.pop_front();
      take_from_front = false;
    } else {
      d.pop_back();
      take_from_front = true;
    }
    if (d.size() % 1000 == 0 || d.size() < 50) {
      print(d);
    }
  }
}

TEST_SUITE_END()
