Page MenuHomec4science

released_object.hh
No OneTemporary

File Metadata

Created
Sun, Aug 4, 20:00

released_object.hh

#ifndef __LIBMULTISCALE_RELEASED_OBJECT_HH__
#define __LIBMULTISCALE_RELEASED_OBJECT_HH__
/* -------------------------------------------------------------------------- */
#include "auto_arguments.hh"
#include "lm_common.hh"
/* -------------------------------------------------------------------------- */
__BEGIN_LIBMULTISCALE__
/* -------------------------------------------------------------------------- */
class CommGroup;
/* -------------------------------------------------------------------------- */
class ReleasedObject : public AutoDispatch::Argument {
public:
ReleasedObject() { release = 0; }
//! return actual release
UInt getRelease() const { return release; };
//! return actual release
void setRelease(UInt r) { release = r; };
//! increment the release
void incRelease() { ++release; };
template <typename Dependencies>
void acquireRelease(const Dependencies &deps) {
for (auto &pair : deps) {
auto &ptr = pair.second;
if (not ptr.has_value())
LM_FATAL(pair.first << ": input was not created/computed/connected");
release = std::max(release, ptr->getRelease());
}
}
template <typename Dependencies>
bool checkDependency(const Dependencies &deps) {
for (auto &pair : deps) {
if (not pair.second.has_value())
return true;
try {
if (!pair.second.has_value())
return true;
auto &dep = pair.second.get();
if (release < dep.getRelease())
return true;
} catch (...) {
return true;
}
}
return false;
}
private:
UInt release;
};
class ReleasedObjectAny : public ReleasedObject, public std::any {
using std::any::any;
};
/* -------------------------------------------------------------------------- */
__END_LIBMULTISCALE__
/* -------------------------------------------------------------------------- */
#endif //__LIBMULTISCALE_RELEASED_OBJECT_HH__

Event Timeline