// Copyright Sebastian Jeckel 2014.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef REACT_DETAIL_IREACTIVEENGINE_H_INCLUDED
#define REACT_DETAIL_IREACTIVEENGINE_H_INCLUDED
#pragma once
#include
#include
#include "react/detail/Defs.h"
#include "react/common/Types.h"
#include "react/logging/EventRecords.h"
/***************************************/ REACT_IMPL_BEGIN /**************************************/
///////////////////////////////////////////////////////////////////////////////////////////////////
/// IReactiveEngine
///////////////////////////////////////////////////////////////////////////////////////////////////
template
<
typename TNode,
typename TTurn
>
struct IReactiveEngine
{
using NodeT = TNode;
using TurnT = TTurn;
void OnTurnAdmissionStart(TurnT& turn) {}
void OnTurnAdmissionEnd(TurnT& turn) {}
void OnInputChange(NodeT& node, TurnT& turn) {}
void Propagate(TurnT& turn) {}
void OnNodeCreate(NodeT& node) {}
void OnNodeDestroy(NodeT& node) {}
void OnNodeAttach(NodeT& node, NodeT& parent) {}
void OnNodeDetach(NodeT& node, NodeT& parent) {}
void OnNodePulse(NodeT& node, TurnT& turn) {}
void OnNodeIdlePulse(NodeT& node, TurnT& turn) {}
void OnDynamicNodeAttach(NodeT& node, NodeT& parent, TurnT& turn) {}
void OnDynamicNodeDetach(NodeT& node, NodeT& parent, TurnT& turn) {}
};
///////////////////////////////////////////////////////////////////////////////////////////////////
/// EngineInterface - Static wrapper for IReactiveEngine
///////////////////////////////////////////////////////////////////////////////////////////////////
template
<
typename D,
typename TEngine
>
struct EngineInterface
{
using NodeT = typename TEngine::NodeT;
using TurnT = typename TEngine::TurnT;
static TEngine& Instance()
{
static TEngine engine;
return engine;
}
static void OnTurnAdmissionStart(TurnT& turn)
{
Instance().OnTurnAdmissionEnd(turn);
}
static void OnTurnAdmissionEnd(TurnT& turn)
{
Instance().OnTurnAdmissionEnd(turn);
}
static void OnInputChange(NodeT& node, TurnT& turn)
{
REACT_LOG(D::Log().template Append(
GetObjectId(node), turn.Id()));
Instance().OnInputChange(node, turn);
}
static void Propagate(TurnT& turn)
{
Instance().Propagate(turn);
}
static void OnNodeCreate(NodeT& node)
{
REACT_LOG(D::Log().template Append(
GetObjectId(node), node.GetNodeType()));
Instance().OnNodeCreate(node);
}
static void OnNodeDestroy(NodeT& node)
{
REACT_LOG(D::Log().template Append(
GetObjectId(node)));
Instance().OnNodeDestroy(node);
}
static void OnNodeAttach(NodeT& node, NodeT& parent)
{
REACT_LOG(D::Log().template Append(
GetObjectId(node), GetObjectId(parent)));
Instance().OnNodeAttach(node, parent);
}
static void OnNodeDetach(NodeT& node, NodeT& parent)
{
REACT_LOG(D::Log().template Append(
GetObjectId(node), GetObjectId(parent)));
Instance().OnNodeDetach(node, parent);
}
static void OnNodePulse(NodeT& node, TurnT& turn)
{
REACT_LOG(D::Log().template Append(
GetObjectId(node), turn.Id()));
Instance().OnNodePulse(node, turn);
}
static void OnNodeIdlePulse(NodeT& node, TurnT& turn)
{
REACT_LOG(D::Log().template Append(
GetObjectId(node), turn.Id()));
Instance().OnNodeIdlePulse(node, turn);
}
static void OnDynamicNodeAttach(NodeT& node, NodeT& parent, TurnT& turn)
{
REACT_LOG(D::Log().template Append(
GetObjectId(node), GetObjectId(parent), turn.Id()));
Instance().OnDynamicNodeAttach(node, parent, turn);
}
static void OnDynamicNodeDetach(NodeT& node, NodeT& parent, TurnT& turn)
{
REACT_LOG(D::Log().template Append(
GetObjectId(node), GetObjectId(parent), turn.Id()));
Instance().OnDynamicNodeDetach(node, parent, turn);
}
};
///////////////////////////////////////////////////////////////////////////////////////////////////
/// Engine traits
///////////////////////////////////////////////////////////////////////////////////////////////////
template struct NodeUpdateTimerEnabled : std::false_type {};
///////////////////////////////////////////////////////////////////////////////////////////////////
/// EPropagationMode
///////////////////////////////////////////////////////////////////////////////////////////////////
enum EPropagationMode
{
sequential_propagation,
parallel_propagation
};
/****************************************/ REACT_IMPL_END /***************************************/
#endif // REACT_DETAIL_IREACTIVEENGINE_H_INCLUDED