Allocator Builder
Policy Based C++ Template Allocator Library
 All Classes Functions Variables Enumerations Enumerator Groups Pages
atomic_shared_ptr.h
1 //
3 // Copyright 2014 Felix Petriconi
4 //
5 // License: http://boost.org/LICENSE_1_0.txt, Boost License 1.0
6 //
7 // Authors: http://petriconi.net, Felix Petriconi
8 //
10 
11 #pragma once
12 #include <memory>
13 #include <atomic>
14 
15 namespace alb {
16  namespace internal {
17 
18  template <typename T> class atomic_shared_ptr {
19  std::shared_ptr<T> data_;
20 
21  public:
22  constexpr atomic_shared_ptr() noexcept = default;
23 
24  explicit atomic_shared_ptr(std::shared_ptr<T> p) noexcept
25  {
26  auto current = std::atomic_load(&data_);
27  while (!std::atomic_compare_exchange_weak(&data_, &current, p))
28  ;
29  }
30 
31  atomic_shared_ptr &operator=(std::shared_ptr<T> p) noexcept
32  {
33  auto current = std::atomic_load(&data_);
34  while (!std::atomic_compare_exchange_weak(&data_, &current, p))
35  ;
36  return *this;
37  }
38 
39  bool is_lock_free() const noexcept
40  {
41  return std::atomic_is_lock_free();
42  }
43 
44  void store(std::shared_ptr<T> p, std::memory_order order = memory_order_seq_cst) noexcept
45  {
46  std::atomic_store_explicit(&data_, p, order);
47  }
48 
49  std::shared_ptr<T> load(std::memory_order order = std::memory_order_seq_cst) const noexcept
50  {
51  return std::atomic_load_explicit(&data_, order);
52  }
53 
54  std::shared_ptr<T> exchange(std::shared_ptr<T> p,
55  std::memory_order order = std::memory_order_seq_cst) noexcept
56  {
57  return std::atomic_exchange_explicit(&data_, p, order);
58  }
59 
60  bool compare_exchange_strong(std::shared_ptr<T> &old_value, std::shared_ptr<T> new_value,
61  std::memory_order order = std::memory_order_seq_cst) noexcept;
62 
63  bool compare_exchange_strong(std::shared_ptr<T> &old_value, std::shared_ptr<T> new_value,
64  std::memory_order success_order,
65  std::memory_order failure_order) noexcept;
66 
67  bool compare_exchange_weak(std::shared_ptr<T> &old_value, std::shared_ptr<T> new_value,
68  std::memory_order order = std::memory_order_seq_cst) noexcept;
69 
70  bool compare_exchange_weak(std::shared_ptr<T> &old_value, std::shared_ptr<T> new_value,
71  std::memory_order success_order,
72  std::memory_order failure_order) noexcept;
73 
74  operator std::shared_ptr<T>() const noexcept
75  {
76  return load();
77  }
78  };
79  }
80 }