LIPH's C++ Codes
double_buffer.h
Go to the documentation of this file.
1#ifndef LIPH_DOUBLE_BUFFER_H_
2#define LIPH_DOUBLE_BUFFER_H_
3
4#include <atomic>
5#include <memory>
6
7namespace liph {
8
9template <class T>
11public:
12 template <class... Args>
13 double_buffer(Args&&...args) : v0_(std::forward<Args>(args)...), v1_(std::forward<Args>(args)...) {}
14
16 const T& get() const { return *pv_[idx_]; }
18 T& get_free() const { return *pv_[1 - idx_]; }
20 void swap() { idx_ = 1 - idx_; };
21
22private:
23 T v0_;
24 T v1_;
25 T *pv_[2]{&v0_, &v1_};
26 std::atomic<int> idx_{0};
27};
28
29/* #if __cplusplus < 202002L */
30
31template <class T>
33public:
34 std::shared_ptr<T> get() const { return std::atomic_load(&v0_); }
35
36 template <class... Args>
37 std::shared_ptr<T> get_free(Args&&...args) {
38 v1_ = std::make_shared<T>(std::forward<Args>(args)...);
39 return v1_;
40 }
41
42 void swap() { std::atomic_store(&v0_, v1_); }
43
44private:
45 std::shared_ptr<T> v0_;
46 std::shared_ptr<T> v1_;
47};
48
49/* #else // C++20 */
50
51/* template <class T> */
52/* class double_buffer_with_shared_ptr { */
53/* public: */
54/* std::shared_ptr<T> Get() const { return v0_; } */
55
56/* template <class... Args> */
57/* std::shared_ptr<T> GetFree(Args&&...args) { */
58/* v1_ = std::make_shared<T>(std::forward<Args>(args)...); */
59/* return v1_; */
60/* } */
61
62/* void Switch() { v0_ = v1_; } */
63
64/* private: */
65/* std::atomic<std::shared_ptr<T> > v0_; */
66/* std::atomic<std::shared_ptr<T> > v1_; */
67/* }; */
68
69/* #endif */
70
71} // namespace liph
72
73#endif // LIPH_DOUBLE_BUFFER_H_
Definition: double_buffer.h:32
std::shared_ptr< T > get() const
Definition: double_buffer.h:34
std::shared_ptr< T > get_free(Args &&...args)
Definition: double_buffer.h:37
void swap()
Definition: double_buffer.h:42
Definition: double_buffer.h:10
const T & get() const
Reader.
Definition: double_buffer.h:16
T & get_free() const
Writer.
Definition: double_buffer.h:18
void swap()
Writer.
Definition: double_buffer.h:20
double_buffer(Args &&...args)
Definition: double_buffer.h:13
Definition: algorithm.h:10