1#ifndef __BOXES_UTIL_HPP__
2#define __BOXES_UTIL_HPP__
4#include <boxes/compiler.hpp>
8template <
typename LockableT,
typename FuncT>
9void withoutLock(LockableT &lockable, FuncT f) {
15template <
typename LockableT,
typename T>
class UniqueAccess {
19 template <
typename... Args>
20 UniqueAccess(Args &&...args) : data{std::forward<Args>(args)...} {}
22 Guard operator*() {
return Guard(*
this); }
24 Guard operator*()
const {
return Guard(*
this); }
32 Guard(UniqueAccess &uniqueAccess)
33 : uniqueAccess(uniqueAccess), lock(uniqueAccess.lockable) {}
35 operator T &() {
return uniqueAccess.data; }
37 operator const T &()
const {
return uniqueAccess.data; }
39 Guard &operator=(
const T &data) {
40 uniqueAccess.data = data;
44 bool operator==(
const T &data)
const BOXES_NOTHROW {
45 return uniqueAccess.data == data;
49 UniqueAccess &uniqueAccess;
50 std::unique_lock<LockableT> lock;
54template <
typename LockableT,
typename T>
auto withUniqueAccess(T &&data) {
55 return UniqueAccess<LockableT, T>(std::forward<T>(data));