diff options
| author | Dan Goodliffe <dan.goodliffe@octal.co.uk> | 2026-05-19 12:12:28 +0100 |
|---|---|---|
| committer | Dan Goodliffe <dan.goodliffe@octal.co.uk> | 2026-05-19 12:12:28 +0100 |
| commit | a3d868ca57591a6d977da8a7e9ec5c14976e73ec (patch) | |
| tree | 803085077c0a4ad148359738b985e117dff75c42 /src/util.hpp | |
| parent | 29f458117184af5b1507cac01b48b41bfbad568a (diff) | |
| parent | cabd894779c2d2e453c8ed7771fdbd17c881bc2c (diff) | |
| download | webstat-a3d868ca57591a6d977da8a7e9ec5c14976e73ec.tar.bz2 webstat-a3d868ca57591a6d977da8a7e9ec5c14976e73ec.tar.xz webstat-a3d868ca57591a6d977da8a7e9ec5c14976e73ec.zip | |
Merge remote-tracking branch 'origin/retry-store'
Diffstat (limited to 'src/util.hpp')
| -rw-r--r-- | src/util.hpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/util.hpp b/src/util.hpp index f7254e8..5cac5a3 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -3,6 +3,7 @@ #include <chrono> #include <command.h> #include <scn/scan.h> +#include <shared_mutex> #include <tuple> namespace WebStat { @@ -95,4 +96,52 @@ namespace WebStat { } return false; } + + template<typename ValueType, typename MutexType = std::shared_mutex> class ThreadSafeT { + public: + template<typename... P> ThreadSafeT(P &&... params) : value {std::forward<P>(params)...} { } + + template<typename LockedValueType, typename LockType> class Locked { + public: + Locked(LockedValueType & valueRef, MutexType & mutex) : value {valueRef}, lock {mutex} { } + + LockedValueType * + operator->() + { + return &value; + } + + private: + LockedValueType & value; + LockType lock; + }; + + Locked<const ValueType, std::shared_lock<MutexType>> + shared() const + { + return {value, mutex}; + } + + Locked<ValueType, std::lock_guard<MutexType>> + unique() + { + return {value, mutex}; + } + + Locked<const ValueType, std::shared_lock<MutexType>> + operator->() const + { + return shared(); + } + + Locked<ValueType, std::lock_guard<MutexType>> + operator()() + { + return unique(); + } + + private: + ValueType value; + mutable MutexType mutex; + }; } |
