Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: // (C) Copyright 2013 Vicente J. Botet Escriba Chris@16: Chris@16: #ifndef BOOST_THREAD_COUNTER_HPP Chris@16: #define BOOST_THREAD_COUNTER_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: //#include Chris@16: //#include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: namespace detail { Chris@16: struct counter Chris@16: { Chris@16: condition_variable cond_; Chris@16: std::size_t value_; Chris@16: Chris@16: counter(std::size_t value) Chris@16: : value_(value) Chris@16: { Chris@16: Chris@16: } Chris@16: counter& operator=(counter const& rhs) Chris@16: { Chris@16: value_ = rhs.value_; Chris@16: return *this; Chris@16: } Chris@16: counter& operator=(std::size_t value) Chris@16: { Chris@16: value_ = value; Chris@16: return *this; Chris@16: } Chris@16: Chris@16: operator std::size_t() const Chris@16: { Chris@16: return value_; Chris@16: } Chris@16: operator std::size_t&() Chris@16: { Chris@16: return value_; Chris@16: } Chris@16: Chris@16: void inc_and_notify_all() Chris@16: { Chris@16: ++value_; Chris@16: cond_.notify_all(); Chris@16: } Chris@16: Chris@16: void dec_and_notify_all() Chris@16: { Chris@16: --value_; Chris@16: cond_.notify_all(); Chris@16: } Chris@16: void assign_and_notify_all(counter const& rhs) Chris@16: { Chris@16: value_ = rhs.value_; Chris@16: cond_.notify_all(); Chris@16: } Chris@16: void assign_and_notify_all(std::size_t value) Chris@16: { Chris@16: value_ = value; Chris@16: cond_.notify_all(); Chris@16: } Chris@16: }; Chris@16: struct counter_is_not_zero Chris@16: { Chris@16: counter_is_not_zero(counter const& count) : count_(count) {} Chris@16: bool operator()() const { return count_ != 0; } Chris@16: counter const& count_; Chris@16: }; Chris@16: struct counter_is_zero Chris@16: { Chris@16: counter_is_zero(counter const& count) : count_(count) {} Chris@16: bool operator()() const { return count_ == 0; } Chris@16: counter const& count_; Chris@16: }; Chris@16: struct is_zero Chris@16: { Chris@16: is_zero(std::size_t& count) : count_(count) {} Chris@16: bool operator()() const { return count_ == 0; } Chris@16: std::size_t& count_; Chris@16: }; Chris@16: struct not_equal Chris@16: { Chris@16: not_equal(std::size_t& x, std::size_t& y) : x_(x), y_(y) {} Chris@16: bool operator()() const { return x_ != y_; } Chris@16: std::size_t& x_; Chris@16: std::size_t& y_; Chris@16: }; Chris@16: } Chris@16: } // namespace boost Chris@16: Chris@16: #include Chris@16: Chris@16: #endif