/*
This file is part of Ingen.
Copyright 2007-2016 David Robillard
Ingen is free software: you can redistribute it and/or modify it under the
terms of the GNU Affero General Public License as published by the Free
Software Foundation, either version 3 of the License, or any later version.
Ingen is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU Affero General Public License for details.
You should have received a copy of the GNU Affero General Public License
along with Ingen. If not, see .
*/
#ifndef INGEN_ENGINE_PREPROCESSCONTEXT_HPP
#define INGEN_ENGINE_PREPROCESSCONTEXT_HPP
#include "CompiledGraph.hpp"
#include "GraphImpl.hpp"
#include "raul/Maid.hpp"
#include
namespace ingen::server {
/** Event pre-processing context.
*
* \ingroup engine
*/
class PreProcessContext
{
public:
using DirtyGraphs = std::unordered_set;
/** Return true iff an atomic bundle is currently being pre-processed. */
bool in_bundle() const { return _in_bundle; }
/** Set/unset atomic bundle flag. */
void set_in_bundle(bool b) { _in_bundle = b; }
/** Return true iff graph should be compiled now (after a change).
*
* This may return false when an atomic bundle is deferring compilation, in
* which case the graph is flagged as dirty for later compilation.
*/
bool must_compile(GraphImpl& graph) {
if (!graph.enabled()) {
return false;
}
if (_in_bundle) {
_dirty_graphs.insert(&graph);
return false;
}
return true;
}
/** Compile graph and return the result if necessary.
*
* This may return null when an atomic bundle is deferring compilation, in
* which case the graph is flagged as dirty for later compilation.
*/
raul::Maid::managed_ptr
maybe_compile(raul::Maid& maid, GraphImpl& graph)
{
if (must_compile(graph)) {
return compile(maid, graph);
}
return nullptr;
}
/** Return all graphs that require compilation after an atomic bundle. */
const DirtyGraphs& dirty_graphs() const { return _dirty_graphs; }
DirtyGraphs& dirty_graphs() { return _dirty_graphs; }
private:
DirtyGraphs _dirty_graphs;
bool _in_bundle = false;
};
} // namespace ingen::server
#endif // INGEN_ENGINE_PREPROCESSCONTEXT_HPP