8#ifndef DESIGNLAB_ASYNCABLE_DATA_H_
9#define DESIGNLAB_ASYNCABLE_DATA_H_
13#include <boost/thread.hpp>
23template <
typename T>
concept CopyAssignable = std::is_copy_assignable<T>::value;
53template <CopyAssignable T>
58 explicit AsyncableData(
const T& data) : data_(data), update_count_(0) {}
72 boost::shared_lock<boost::shared_mutex> read_lock(mtx_);
84 boost::upgrade_lock<boost::shared_mutex> upgrade_lock(mtx_);
87 boost::upgrade_to_unique_lock<boost::shared_mutex> write_lock(upgrade_lock);
103 boost::shared_lock<boost::shared_mutex> read_lock(mtx_);
104 return update_count_;
108 mutable boost::shared_mutex mtx_;
149 boost::shared_lock<boost::shared_mutex> read_lock(mtx_);
161 boost::upgrade_lock<boost::shared_mutex> upgrade_lock(mtx_);
164 boost::upgrade_to_unique_lock<boost::shared_mutex> write_lock(upgrade_lock);
179 boost::upgrade_lock<boost::shared_mutex> upgrade_lock(mtx_);
182 boost::upgrade_to_unique_lock<boost::shared_mutex> write_lock(upgrade_lock);
184 data_.push_back(data);
196 boost::upgrade_lock<boost::shared_mutex> upgrade_lock(mtx_);
199 boost::upgrade_to_unique_lock<boost::shared_mutex> write_lock(upgrade_lock);
213 boost::shared_lock<boost::shared_mutex> read_lock(mtx_);
226 boost::shared_lock<boost::shared_mutex> read_lock(mtx_);
227 return update_count_;
231 mutable boost::shared_mutex mtx_;
233 std::vector<T> data_;
AsyncableData & operator=(const AsyncableData &)=delete
コピー代入は禁止.
void SetData(const std::vector< T > &data)
値を変更する. この時,write lockをかける. データの更新回数をインクリメントする.
AsyncableData(const AsyncableData &)=delete
コピーは禁止.
size_t GetSize() const
sizeを返す.要素の数を size_tで返す. この時,read lockをかける.
int GetUpdateCount() const
データの更新回数を返す. この時,read lockをかける. この値を調べて,データの更新回数が変わっているかを確認することで, データの更新が必要かを確認する.
void Clean()
値をすべて削除する. この時,write lockをかける. データの更新回数をインクリメントする.
std::vector< T > GetData() const
値をコピーして返す. この時,read lockをかける. 当然,データの更新回数はインクリメントされない.
AsyncableData(const std::vector< T > &data)
void PushBack(const T &data)
最後尾に値を追加する. この時,write lockをかける. データの更新回数をインクリメントする.
AsyncableData(AsyncableData &&)=delete
ムーブは禁止.
非同期処理を行う際に,データの更新回数とデータをまとめて扱うためのクラス.
AsyncableData(const T &data)
int GetUpdateCount() const
データの更新回数を返す. この時,read lockをかける. この値を調べて,データの更新回数が変わっているかを確認することで, データの更新が必要かを確認する.
void SetData(const T &data)
値を変更する. この時,write lockをかける. データの更新回数をインクリメントする.
T GetData() const
値をコピーして返す. この時,read lockをかける. 当然,データの更新回数はインクリメントされない.
AsyncableData(AsyncableData &&)=delete
ムーブは禁止
AsyncableData(const AsyncableData &)=delete
コピーは禁止
AsyncableData & operator=(const AsyncableData &)=delete
コピー代入は禁止