// Copyright 2020 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT

#ifndef ZIRCON_KERNEL_INCLUDE_LIB_RELAXED_ATOMIC_H_
#define ZIRCON_KERNEL_INCLUDE_LIB_RELAXED_ATOMIC_H_

#include <ktl/atomic.h>

// Wrapper around ktl::atomic that assumes ktl::memory_order_relaxed for all
// operations to simplify pure relaxed use cases. Only a subset of operations
// are supported as needed.
//
// NOTE: ktl::atomic has specific defintions for implicit constructors,
// coversion operators, and compound assignment operators. This utility attempts
// to mirror the signatures and beahvior of the underlying atomic as closely as
// possible.
template <typename T>
class RelaxedAtomic {
 public:
  RelaxedAtomic() noexcept = default;
  constexpr RelaxedAtomic(T value) : wrapped_(value) {}

  T load() const noexcept { return wrapped_.load(ktl::memory_order_relaxed); }
  void store(T desired) noexcept { wrapped_.store(desired, ktl::memory_order_relaxed); }

  T fetch_add(T value) noexcept { return wrapped_.fetch_add(value, ktl::memory_order_relaxed); }
  T fetch_sub(T value) noexcept { return wrapped_.fetch_sub(value, ktl::memory_order_relaxed); }
  T fetch_and(T value) noexcept { return wrapped_.fetch_and(value, ktl::memory_order_relaxed); }
  T fetch_or(T value) noexcept { return wrapped_.fetch_or(value, ktl::memory_order_relaxed); }

  operator T() const noexcept { return load(); }

  T operator=(T value) noexcept { return store(value), value; }
  T operator+=(T value) noexcept { return fetch_add(value) + value; }
  T operator-=(T value) noexcept { return fetch_sub(value) - value; }
  T operator&=(T value) noexcept { return fetch_and(value) & value; }
  T operator|=(T value) noexcept { return fetch_or(value) | value; }

 private:
  ktl::atomic<T> wrapped_;
};

#endif  // ZIRCON_KERNEL_INCLUDE_LIB_RELAXED_ATOMIC_H_
