Tools: Add InstanceLimiter utility

This commit is contained in:
Dennis Klein
2019-07-19 19:48:47 +02:00
committed by Dennis Klein
parent 44da054e78
commit b5da31498d
3 changed files with 55 additions and 0 deletions

View File

@@ -0,0 +1,53 @@
/********************************************************************************
* Copyright (C) 2019 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
* *
* This software is distributed under the terms of the *
* GNU Lesser General Public Licence (LGPL) version 3, *
* copied verbatim in the file "LICENSE" *
********************************************************************************/
#ifndef FAIR_MQ_TOOLS_INSTANCELIMIT_H
#define FAIR_MQ_TOOLS_INSTANCELIMIT_H
#include "Strings.h"
namespace fair {
namespace mq {
namespace tools {
template<typename Tag, int Max>
struct InstanceLimiter
{
InstanceLimiter() { Increment(); }
~InstanceLimiter() { Decrement(); }
auto GetCount() -> int { return fCount; }
private:
auto Increment() -> void
{
if (fCount < Max) {
++fCount;
} else {
throw std::runtime_error(
ToString("More than ", Max, " instances of ", Tag(), " in parallel not supported"));
}
}
auto Decrement() -> void
{
if (fCount > 0) {
--fCount;
}
}
static int fCount;
};
template<typename Tag, int Max>
int InstanceLimiter<Tag, Max>::fCount(0);
} /* namespace tools */
} /* namespace mq */
} /* namespace fair */
#endif /* FAIR_MQ_TOOLS_INSTANCELIMIT_H */