aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/testsuite/util/regression/rand/priority_queue/container_rand_regression_test.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'libstdc++-v3/testsuite/util/regression/rand/priority_queue/container_rand_regression_test.hpp')
-rw-r--r--libstdc++-v3/testsuite/util/regression/rand/priority_queue/container_rand_regression_test.hpp334
1 files changed, 334 insertions, 0 deletions
diff --git a/libstdc++-v3/testsuite/util/regression/rand/priority_queue/container_rand_regression_test.hpp b/libstdc++-v3/testsuite/util/regression/rand/priority_queue/container_rand_regression_test.hpp
new file mode 100644
index 00000000000..310d59b0154
--- /dev/null
+++ b/libstdc++-v3/testsuite/util/regression/rand/priority_queue/container_rand_regression_test.hpp
@@ -0,0 +1,334 @@
+// -*- C++ -*-
+
+// Copyright (C) 2005, 2006 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 2, 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 COPYING. If not, write to
+// the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
+// MA 02111-1307, USA.
+
+// As a special exception, you may use this file as part of a free
+// software library without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to
+// produce an executable, this file does not by itself cause the
+// resulting executable to be covered by the GNU General Public
+// License. This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+// 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.hpp
+ * Contains a random regression test for a specific container type.
+ */
+
+#ifndef PB_DS_CONTAINER_RAND_REGRESSION_TEST_HPP
+#define PB_DS_CONTAINER_RAND_REGRESSION_TEST_HPP
+
+#include <algorithm>
+#include <string>
+#include <sstream>
+#include <utility>
+#include <cassert>
+#include <regression/basic_type.hpp>
+#include <ext/pb_ds/priority_queue.hpp>
+#include <io/prog_bar.hpp>
+#include <rng/twister_rand_gen.hpp>
+#include <common_type/priority_queue/string_form.hpp>
+#include <regression/rand/io/priority_queue/xml_formatter.hpp>
+#include <regression/trait/priority_queue/trait.hpp>
+
+namespace pb_ds
+{
+
+ namespace test
+ {
+
+ namespace detail
+ {
+
+#ifdef PB_DS_REGRESSION_TRACE
+#define PB_DS_TRACE(X) std::cerr << X << std::endl
+#else // #ifdef PB_DS_REGRESSION_TRACE
+#define PB_DS_TRACE(X)
+#endif // #ifdef PB_DS_REGRESSION_TRACE
+
+#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();
+
+ // Rand test specialized for a specific container.
+ template<typename Cntnr>
+ class container_rand_regression_test
+ {
+
+ public:
+
+ container_rand_regression_test(unsigned long seed, size_t n, size_t m, double tp, double ip, double dp, double ep, double cp, double mp, bool disp);
+
+ virtual
+ ~container_rand_regression_test();
+
+ void
+ operator()();
+
+ private:
+ typedef Cntnr cntnr;
+
+ typedef typename cntnr::allocator allocator;
+
+ typedef typename cntnr::size_type size_type;
+
+ typedef twister_rand_gen gen;
+
+ typedef basic_type value_type;
+
+ typedef native_priority_queue< std::string, true> native_type;
+
+ enum op
+ {
+ insert_op,
+ modify_op,
+ erase_op,
+ clear_op,
+ other_op
+ };
+
+ typedef dbg_ex_allocator< char> alloc_t;
+
+ typedef regression_test_traits< Cntnr> test_traits;
+
+ private:
+
+ op
+ get_next_op();
+
+ size_t
+ get_next_sub_op(size_t max);
+
+ static void
+ defs();
+
+ static void
+ value_defs();
+
+ static void
+ ds_defs();
+
+ static void
+ iterator_defs();
+
+ static void
+ policy_defs();
+
+ void
+ policy_access();
+
+ void
+ it_copy();
+
+ void
+ it_assign();
+
+ bool
+ default_constructor();
+
+ void
+ swap();
+
+ bool
+ copy_constructor();
+
+ bool
+ assignment_operator();
+
+ bool
+ it_constructor();
+
+ bool
+ push();
+
+ bool
+ modify();
+
+ bool
+ pop();
+
+ bool
+ erase_if();
+
+ bool
+ erase_it();
+
+ bool
+ clear();
+
+ bool
+ split_join();
+
+ void
+ cmp(const Cntnr& r_container, const native_type& r_native_c, const std::string& r_call_fn);
+
+ void
+ print_container(const native_type& r_cnt, std::ostream& r_os = std::cerr) const;
+
+ void
+ print_container(const cntnr& r_cnt, std::ostream& r_os = std::cerr) const;
+
+ private:
+ 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;
+ };
+
+ private:
+ 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_dp;
+ 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;
+ };
+
+#include <regression/rand/priority_queue/detail/constructor_destructor_fn_imps.hpp>
+#include <regression/rand/priority_queue/detail/cmp_fn_imps.hpp>
+#include <regression/rand/priority_queue/detail/operator_fn_imps.hpp>
+#include <regression/rand/priority_queue/detail/insert_fn_imps.hpp>
+#include <regression/rand/priority_queue/detail/modify_fn_imps.hpp>
+#include <regression/rand/priority_queue/detail/clear_fn_imps.hpp>
+#include <regression/rand/priority_queue/detail/erase_fn_imps.hpp>
+#include <regression/rand/priority_queue/detail/defs_fn_imps.hpp>
+#include <regression/rand/priority_queue/detail/policy_access_fn_imps.hpp>
+#include <regression/rand/priority_queue/detail/split_join_fn_imps.hpp>
+#include <regression/rand/priority_queue/detail/it_conversion_fn_imps.hpp>
+#include <regression/rand/priority_queue/detail/diagnostic_fn_imps.hpp>
+
+#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 pb_ds
+
+#endif // #ifndef PB_DS_CONTAINER_RAND_REGRESSION_TEST_HPP