// -*- C++ -*-

// Copyright (C) 2005-2013 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library.  This library is free
// software; you can redistribute it and/or modify it under the terms
// of the GNU General Public License as published by the Free Software
// Foundation; either version 3, or (at your option) any later
// version.

// This 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
// General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this library; see the file COPYING3.  If not see
// <http://www.gnu.org/licenses/>.


// Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL.

// Permission to use, copy, modify, sell, and distribute this software
// is hereby granted without fee, provided that the above copyright
// notice appears in all copies, and that both that copyright notice
// and this permission notice appear in supporting documentation. None
// of the above authors, nor IBM Haifa Research Laboratories, make any
// representation about the suitability of this software for any
// purpose. It is provided "as is" without express or implied
// warranty.

/**
 * @file container_rand_regression_test.h
 * Contains a random regression test for a specific container type.
 */

#ifndef PB_DS_CONTAINER_RAND_REGRESSION_TEST_H
#define PB_DS_CONTAINER_RAND_REGRESSION_TEST_H

#include <algorithm>
#include <string>
#include <sstream>
#include <utility>
#include <ext/pb_ds/assoc_container.hpp>
#include <io/prog_bar.hpp>
#include <testsuite_rng.h>
#include <regression/trait/assoc/trait.hpp>
#include <common_type/assoc/string_form.hpp>
#include <regression/rand/xml_formatter.hpp>

namespace __gnu_pbds
{
namespace test
{
namespace detail
{
  // Rand test specialized for a specific container.
  template<typename Cntnr>
  class container_rand_regression_test
  {
  public:

    container_rand_regression_test(unsigned long, size_t, size_t, double, 
				   double, double, double, double, bool);

    virtual
    ~container_rand_regression_test();

    void
    operator()();

  private:
    typedef Cntnr 					cntnr;
    typedef typename cntnr::allocator_type 		allocator_type;
    typedef typename cntnr::size_type 			size_type;
    typedef regression_test_traits<Cntnr> 		test_traits;
    typedef typename test_traits::key_type 		key_type;
    typedef typename test_traits::key_const_reference	key_const_reference;
    typedef typename test_traits::value_type 		value_type;
    typedef typename test_traits::native_type 		native_type;
    typedef twister_rand_gen 				gen;
    typedef __gnu_pbds::container_traits<Cntnr> 	container_traits;
    typedef __gnu_cxx::throw_allocator_random<char>    	alloc_t;

    enum op
      {
	insert_op,
	erase_op,
	clear_op,
	other_op
      };

    op
    get_next_op();

    size_t
    get_next_sub_op(size_t);

    static void
    defs();

    static void
    key_defs();

    static void
    mapped_defs();

    static void
    value_defs();

    static void
    ds_defs();

    static void
    iterator_defs();

    static void
    node_iterator_defs(__gnu_pbds::detail::false_type);

    static void
    node_iterator_defs(__gnu_pbds::detail::true_type);

    static void
    policy_defs();

    static void
    policy_defs(__gnu_pbds::basic_hash_tag);

    static void
    policy_defs(__gnu_pbds::cc_hash_tag);

    static void
    policy_defs(__gnu_pbds::gp_hash_tag);

    static void
    policy_defs(__gnu_pbds::tree_tag);

    static void
    policy_defs(__gnu_pbds::list_update_tag);

    static void
    policy_defs(__gnu_pbds::pat_trie_tag);

    void
    policy_access();

    void
    policy_access(__gnu_pbds::basic_hash_tag);

    void
    policy_access(__gnu_pbds::cc_hash_tag);

    void
    policy_access(__gnu_pbds::gp_hash_tag);

    void
    policy_access(__gnu_pbds::tree_tag);

    void
    policy_access(__gnu_pbds::list_update_tag);

    void
    policy_access(__gnu_pbds::pat_trie_tag);

    void
    it_copy();

    void
    it_assign();

    void
    rev_it_copy();

    void
    rev_it_assign();

    void
    rev_it_copy_imp(__gnu_pbds::detail::false_type);

    void
    rev_it_copy_imp(__gnu_pbds::detail::true_type);

    void
    rev_it_assign_imp(__gnu_pbds::detail::false_type);

    void
    rev_it_assign_imp(__gnu_pbds::detail::true_type);

    bool
    default_constructor();

    void
    swap();

    bool
    copy_constructor();

    bool
    assignment_operator();

    bool
    it_constructor();

    bool
    it_constructor_imp(__gnu_pbds::cc_hash_tag);

    bool
    it_constructor_imp(__gnu_pbds::gp_hash_tag);

    bool
    it_constructor_imp(__gnu_pbds::tree_tag);

    bool
    it_constructor_imp(__gnu_pbds::list_update_tag);

    bool
    it_constructor_imp(__gnu_pbds::pat_trie_tag);

    bool
    insert();

    bool
    erase();

    bool
    erase_it();

    bool
    erase_it_imp(__gnu_pbds::detail::false_type);

    bool
    erase_it_imp(__gnu_pbds::detail::true_type);

    bool
    erase_rev_it();

    bool
    erase_rev_it_imp(__gnu_pbds::detail::false_type);

    bool
    erase_rev_it_imp(__gnu_pbds::detail::true_type);

    bool
    erase_if();

    bool
    clear();

    bool
    resize();

    bool
    resize_imp(__gnu_pbds::detail::true_type);

    bool
    resize_imp(__gnu_pbds::detail::false_type);

    bool
    get_set_loads();

    bool
    get_set_loads_imp(__gnu_pbds::detail::true_type);

    bool
    get_set_loads_imp(__gnu_pbds::detail::false_type);

    void
    get_set_load();

    void
    get_set_load_imp(__gnu_pbds::detail::true_type);

    void
    get_set_load_imp(__gnu_pbds::detail::false_type);

    bool
    subscript();

    bool
    subscript_imp(__gnu_pbds::detail::false_type);

    bool
    subscript_imp(__gnu_pbds::detail::true_type);

    bool
    split_join();

    bool
    split_join_imp(__gnu_pbds::detail::false_type);

    bool
    split_join_imp(__gnu_pbds::detail::true_type);

    void
    cmp(const Cntnr&, const native_type&, const std::string&);

    void
    basic_cmp_(const Cntnr&, const native_type&);

    void
    cmp_(const Cntnr&, const native_type&);

    void
    order_preserving_cmp_imp(const Cntnr&, const native_type&, 
			     __gnu_pbds::detail::false_type);

    void
    order_preserving_cmp_imp(const Cntnr&, const native_type&, 
			     __gnu_pbds::detail::true_type);

    void
    back_order_preserving_cmp_imp(const Cntnr&, const native_type&, 
				  __gnu_pbds::detail::false_type);

    void
    back_order_preserving_cmp_imp(const Cntnr&, const native_type&, 
				  __gnu_pbds::detail::true_type);

    void
    reverse_iteration_cmp_imp(const Cntnr&, const native_type&, 
			      __gnu_pbds::detail::false_type);

    void
    reverse_iteration_cmp_imp(const Cntnr&, const native_type&, 
			      __gnu_pbds::detail::true_type);

    void
    order_statistics_cmp_imp(const Cntnr&, const native_type&, 
			     __gnu_pbds::detail::false_type);

    void
    order_statistics_cmp_imp(const Cntnr&, const native_type&, 
			     __gnu_pbds::detail::true_type);

    void
    prefix_search_cmp_imp(const Cntnr&, const native_type&, 
			  __gnu_pbds::detail::false_type);

    void
    prefix_search_cmp_imp(const Cntnr&, const native_type&, 
			  __gnu_pbds::detail::true_type);

    template<typename Const_It, class Const_Native_It>
    void
    it_cmp_imp(Const_It, Const_It, Const_Native_It, Const_Native_It);

    template<typename Const_It, class Const_Native_It>
    void
    back_it_cmp_imp(Const_It, Const_It, Const_Native_It, Const_Native_It);

    void
    lower_bound_cmp_imp(const Cntnr&, const native_type&, 
			__gnu_pbds::detail::false_type);

    void
    lower_bound_cmp_imp(const Cntnr&, const native_type&, 
			__gnu_pbds::detail::true_type);

    void
    upper_bound_cmp_imp(const Cntnr&, const native_type&, 
			__gnu_pbds::detail::false_type);

    void
    upper_bound_cmp_imp(const Cntnr&, const native_type&, 
			__gnu_pbds::detail::true_type);

    void
    print_container(const native_type&, std::ostream& r_os = std::cerr) const;

    void
    print_container(const cntnr&, std::ostream& r_os = std::cerr) const;

    struct destructor_printer
    {
      destructor_printer(const std::string& r_msg) 
      : m_msg(r_msg), m_print(true) { }

      void
      cancel_print()
      { m_print = false; }

      ~destructor_printer()
      {
	if (!m_print)
	  return;

	std::cerr << std::endl << "Uncaught exception: " << std::endl 
		  << m_msg << std::endl;
      }

    private:
      const std::string m_msg;
      bool m_print;
    };

    const unsigned long 	m_seed;
    const size_t 		m_n;
    const size_t 		m_m;
    const double 		m_tp;
    const double 		m_ip;
    const double 		m_ep;
    const double 		m_cp;
    const double 		m_mp;
    const bool 			m_disp;
    twister_rand_gen 		m_g;
    Cntnr* 			m_p_c;
    native_type 		m_native_c;
    alloc_t 			m_alloc;
    size_t 			m_i;
  };

#ifdef PB_DS_REGRESSION_TRACE
#define PB_DS_TRACE(X) std::cerr << X << std::endl
#else 
#define PB_DS_TRACE(X)
#endif

#define PB_DS_CLASS_T_DEC \
  template<typename Cntnr>

#define PB_DS_CLASS_C_DEC \
  container_rand_regression_test<Cntnr>

#define PB_DS_COND_COMPARE(L, R) \
  if (m_g.get_prob() < m_mp)			\
    cmp(L, R, __FUNCTION__);

#define PB_DS_RUN_MTHD(MTHD) \
  {						\
    bool done = false;				\
						\
    while (!done)				\
      done = MTHD();				\
  }

#define PB_DS_THROW_IF_FAILED_(PRED, MORE, P_C, P_NC, F, L) \
  if (!(PRED))								\
    {									\
      std::cerr << "Failure at " << F << ": " << L << std::endl;	\
      std::cerr << MORE << std::endl;					\
      std::cerr << "container:" << std::endl;				\
      print_container(*(P_C));						\
      std::cerr << std::endl;						\
      std::cerr << "native container:" << std::endl;			\
      print_container(*(P_NC));						\
      std::cerr << std::endl;						\
      throw std::logic_error("fucked!");				\
    }

#define PB_DS_THROW_IF_FAILED(PRED, MORE, P_C, P_NC)			\
  PB_DS_THROW_IF_FAILED_(PRED, MORE, P_C, P_NC, __FILE__, __LINE__)

#define PB_DS_SET_DESTRUCT_PRINT \
  destructor_printer dest_print___(__FUNCTION__);

#define PB_DS_CANCEL_DESTRUCT_PRINT \
  dest_print___.cancel_print();

#include <regression/rand/assoc/container_rand_regression_test.tcc>

#undef PB_DS_COND_COMPARE
#undef PB_DS_RUN_MTHD
#undef PB_DS_CLASS_T_DEC
#undef PB_DS_CLASS_C_DEC
#undef PB_DS_THROW_IF_FAILED_
#undef PB_DS_THROW_IF_FAILED
#undef PB_DS_SET_DESTRUCT_PRINT
#undef PB_DS_CANCEL_DESTRUCT_PRINT
#undef PB_DS_TRACE

} // namespace detail
} // namespace test
} // namespace __gnu_pbds

#endif
