#include #include #include #define BOOST_ENABLE_ASSERT_HANDLER #include #include #include #include #include jmp_buf env; void signal_handler(int signal) { longjmp(env,2); } namespace boost { inline void assertion_failed(char const * expr, char const * function, char const * file, long line) { std::cout << "BOOST_ASSERT: " << file << ":" << line << ": " << function << ": Assertion `" << expr << "' failed." << std::endl; throw std::runtime_error("BOOST_ASSERT failed."); } } template void test(const T k, const double p) { int status; char * realname = abi::__cxa_demangle(typeid(k).name(), 0, 0, &status); std::cout << "Called with type for parameter k: " << realname << std::endl; std::cout << "-----------------------------------------------------------" << std::endl; std::random_device rd; std::mt19937 gen(rd()); std::cout << std::endl << "STD RANDOM TEST" << std::endl; std::cout << "Trying: std::negative_binomial_distribution (k = " << k << ", p = " << p << ")" << std::endl; int val = setjmp (env); if (!val) { std::negative_binomial_distribution<> nb(k, p); std::cout << "**************************" << std::endl; std::cout << "*** Constructor passed ***" << std::endl; std::cout << "**************************" << std::endl; std::cout << "Sample: " << nb(gen) << std::endl; std::cout << "**************************" << std::endl; std::cout << "**** Sampling passed *****" << std::endl; std::cout << "**************************" << std::endl; } std::cout << "-----------------------------------------------------------" << std::endl; std::cout << std::endl << "BOOST TEST" << std::endl; boost::random::mt19937 rng; std::cout << "Trying: boost::random::negative_binomial_distribution (k = " << k << ", p = " << p << ")" << std::endl; try { boost::random::negative_binomial_distribution<> nb_boost(k, p); try { std::cout << "**************************" << std::endl; std::cout << "*** Constructor passed ***" << std::endl; std::cout << "**************************" << std::endl; std::cout << "Sample: " << nb_boost(rng) << std::endl; std::cout << "**************************" << std::endl; std::cout << "**** Sampling passed *****" << std::endl; std::cout << "**************************" << std::endl; } catch (const std::runtime_error& error) { std::cout << "Creating random samples: Assertion failed!" << std::endl; } } catch (const std::runtime_error& error) { std::cout << "Constructor: Assertion failed!" << std::endl; } std::cout << "===========================================================" << std::endl << std::endl; } int main() { std::signal(SIGABRT, &signal_handler); const int k = 1; const double stepsize = 0.5; double p = -0.5; for (int i=0; i <= 4; ++i) { test(k, p); p += stepsize; } test(0.99, 0.5); }