| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | // 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
 |