1 /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
3 * Copyright 2015 Couchbase, Inc.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
24 * The RelaxedAtomic class wraps std::atomic<> and operates with
25 * relaxed memory ordering.
31 value.store(0, memory_order_relaxed);
34 RelaxedAtomic(const T& initial) {
35 value.store(initial, memory_order_relaxed);
38 explicit RelaxedAtomic(const RelaxedAtomic& other) {
39 value.store(other.value.load(memory_order_relaxed),
40 memory_order_relaxed);
44 return value.load(memory_order_relaxed);
48 return value.load(memory_order_relaxed);
51 RelaxedAtomic& operator=(const RelaxedAtomic& rhs) {
52 value.store(rhs.load(), memory_order_relaxed);
56 RelaxedAtomic& operator+=(const T rhs) {
57 value.fetch_add(rhs, memory_order_relaxed);
61 RelaxedAtomic& operator+=(const RelaxedAtomic& rhs) {
62 value.fetch_add(rhs.value.load(memory_order_relaxed),
63 memory_order_relaxed);
67 RelaxedAtomic& operator-=(const T rhs) {
68 value.fetch_sub(rhs, memory_order_relaxed);
72 RelaxedAtomic& operator-=(const RelaxedAtomic& rhs) {
73 value.fetch_sub(rhs.value.load(memory_order_relaxed),
74 memory_order_relaxed);
79 return value.fetch_add(1, memory_order_relaxed) + 1;
83 return value.fetch_add(1, memory_order_relaxed);
87 return value.fetch_sub(1, memory_order_relaxed) - 1;
91 return value.fetch_sub(1, memory_order_relaxed);
94 RelaxedAtomic& operator=(T val) {
95 value.store(val, memory_order_relaxed);
100 value.store(0, memory_order_relaxed);
103 void setIfGreater(const T& val) {
105 T currval = value.load(memory_order_relaxed);
107 if (value.compare_exchange_weak(currval, val,
108 memory_order_relaxed)) {
117 void setIfGreater(const RelaxedAtomic& val) {
118 setIfGreater(val.load());
122 AtomicValue<T> value;