123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- // (C) Copyright 2013 Ruslan Baratov
- // (C) Copyright 2013 Ruslan Baratov
- //
- // Distributed under the Boost Software License, Version 1.0. (See accompanying
- // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- // See www.boost.org/libs/thread for documentation.
- #define BOOST_THREAD_VERSION 4
- #include <boost/detail/lightweight_test.hpp> // BOOST_TEST
- #include <boost/thread/mutex.hpp>
- #include <boost/thread/with_lock_guard.hpp>
- #include <boost/ref.hpp>
- void func_with_0_arg() {
- }
- void func_with_1_arg(int arg_1) {
- BOOST_TEST(arg_1 == 3);
- }
- bool func_with_2_arg(int arg_1, bool arg_2) {
- BOOST_TEST(arg_1 == 3);
- BOOST_TEST(arg_2 == true);
- return !arg_2;
- }
- int func_with_3_arg(int arg_1, bool arg_2, const char* arg_3) {
- BOOST_TEST(arg_1 == 13);
- BOOST_TEST(arg_2 == false);
- BOOST_TEST(std::string(arg_3) == "message for func with 3 arg");
- return 12;
- }
- const char* func_with_4_arg(int arg_1, bool arg_2, int* arg_3, int& arg_4) {
- BOOST_TEST(arg_1 == 23);
- BOOST_TEST(arg_2 == false);
- *arg_3 = 128;
- arg_4 = 456;
- return "hello";
- }
- void test_simple() {
- boost::mutex m;
- // #0
- boost::with_lock_guard(m, func_with_0_arg);
- // #1
- boost::with_lock_guard(m, func_with_1_arg, 3);
- // #2
- bool res2 = boost::with_lock_guard(m, func_with_2_arg, 3, true);
- BOOST_TEST(res2 == false);
- // #3
- int arg1 = 13;
- const char* mes = "message for func with 3 arg";
- int res3 = boost::with_lock_guard(m, func_with_3_arg, arg1, false, mes);
- BOOST_TEST(res3 == 12);
- // #4
- int arg3 = 0;
- int arg4 = 0;
- const char* res4 = boost::with_lock_guard(
- m,
- func_with_4_arg,
- 23,
- false,
- &arg3,
- boost::ref(arg4)
- );
- BOOST_TEST(arg3 == 128);
- BOOST_TEST(arg4 == 456);
- BOOST_TEST(std::string(res4) == "hello");
- }
- #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
- void test_variadic_templates() {
- std::cout << "C++11 variadic templates disabled" << std::endl;
- }
- #else
- int func_with_5_args(int a1, char a2, int& a3, bool* a4, bool a5) {
- BOOST_TEST(a1 == 12);
- BOOST_TEST(a2 == 'x');
- BOOST_TEST(a5 == false);
- a3 = 135;
- *a4 = false;
- return 45;
- }
- int func_with_6_args(int a1, char a2, int& a3, bool* a4, int&& a5, bool a6) {
- BOOST_TEST(a1 == 12);
- BOOST_TEST(a2 == 'N');
- BOOST_TEST(a5 == 2 || a5 == 13);
- BOOST_TEST(a6 == false);
- a3 = 200;
- *a4 = true;
- return 888;
- }
- void test_variadic_templates() {
- boost::mutex m;
- int a3 = 0;
- bool a4 = true;
- int res5 = boost::with_lock_guard(
- m, func_with_5_args, 12, 'x', a3, &a4, false
- );
- BOOST_TEST(a3 == 135);
- BOOST_TEST(a4 == false);
- BOOST_TEST(res5 == 45);
- int res6 = boost::with_lock_guard(
- m, func_with_6_args, 12, 'N', a3, &a4, 2, false
- );
- BOOST_TEST(a3 == 200);
- BOOST_TEST(a4 == true);
- BOOST_TEST(res6 == 888);
- a3 = 0;
- a4 = false;
- int a5 = 13;
- int res6_move = boost::with_lock_guard(
- m, func_with_6_args, 12, 'N', a3, &a4, boost::move(a5), false
- );
- BOOST_TEST(a3 == 200);
- BOOST_TEST(a4 == true);
- BOOST_TEST_EQ(res6_move, 888);
- }
- #endif
- int main() {
- test_simple();
- test_variadic_templates();
- return boost::report_errors();
- }
|