| // 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) |
| // (C) Copyright 2013 Vicente J. Botet Escriba |
| |
| #ifndef BOOST_THREAD_COUNTER_HPP |
| #define BOOST_THREAD_COUNTER_HPP |
| |
| #include <boost/thread/detail/config.hpp> |
| #include <boost/thread/detail/delete.hpp> |
| |
| //#include <boost/thread/mutex.hpp> |
| //#include <boost/thread/lock_types.hpp> |
| #include <boost/thread/condition_variable.hpp> |
| #include <boost/chrono/duration.hpp> |
| #include <boost/chrono/time_point.hpp> |
| #include <boost/assert.hpp> |
| |
| #include <boost/config/abi_prefix.hpp> |
| |
| namespace boost |
| { |
| namespace detail { |
| struct counter |
| { |
| condition_variable cond_; |
| std::size_t value_; |
| |
| counter(std::size_t value) |
| : value_(value) |
| { |
| |
| } |
| counter& operator=(counter const& rhs) |
| { |
| value_ = rhs.value_; |
| return *this; |
| } |
| counter& operator=(std::size_t value) |
| { |
| value_ = value; |
| return *this; |
| } |
| |
| operator std::size_t() const |
| { |
| return value_; |
| } |
| operator std::size_t&() |
| { |
| return value_; |
| } |
| |
| void inc_and_notify_all() |
| { |
| ++value_; |
| cond_.notify_all(); |
| } |
| |
| void dec_and_notify_all() |
| { |
| --value_; |
| cond_.notify_all(); |
| } |
| void assign_and_notify_all(counter const& rhs) |
| { |
| value_ = rhs.value_; |
| cond_.notify_all(); |
| } |
| void assign_and_notify_all(std::size_t value) |
| { |
| value_ = value; |
| cond_.notify_all(); |
| } |
| }; |
| struct counter_is_not_zero |
| { |
| counter_is_not_zero(counter const& count) : count_(count) {} |
| bool operator()() const { return count_ != 0; } |
| counter const& count_; |
| }; |
| struct counter_is_zero |
| { |
| counter_is_zero(counter const& count) : count_(count) {} |
| bool operator()() const { return count_ == 0; } |
| counter const& count_; |
| }; |
| struct is_zero |
| { |
| is_zero(std::size_t& count) : count_(count) {} |
| bool operator()() const { return count_ == 0; } |
| std::size_t& count_; |
| }; |
| struct not_equal |
| { |
| not_equal(std::size_t& x, std::size_t& y) : x_(x), y_(y) {} |
| bool operator()() const { return x_ != y_; } |
| std::size_t& x_; |
| std::size_t& y_; |
| }; |
| } |
| } // namespace boost |
| |
| #include <boost/config/abi_suffix.hpp> |
| |
| #endif |