MotorControlModuleSDFM_TMS3.../Projects/EFC_Application/UMLibrary/configuration/software/AppBuilder.hh

132 lines
3.0 KiB
C++

/*!\file
* \brief \todo Îïèñàíèå ôàéëà.
*/
/*
* AppBuilder.h
*
* Created on: 24 èþí. 2019 ã.
* Author: titov
*/
#ifndef SOURCE_APPLICATION_SOFTWARE_APPBUILDER_H_
#define SOURCE_APPLICATION_SOFTWARE_APPBUILDER_H_
#include "../../application/ISetupStep.hh"
#include "../Environment.hh"
#include "AppId.hh"
#include "../../units/LogicalEntities.hpp"
namespace configuration { namespace software {
class AppBuilder {
public:
typedef std::size_t Idx;
class BuildedItem {
friend class AppBuilder;
enum State {
INPUT,
PREPARE,
BUILD,
DONE,
ERROR,
};
application::ISetupStep * step;
State state;
InitializerStepId id;
public:
BuildedItem()
: step(nullptr),
state(INPUT),
id(-1) {}
};
AppBuilder( BuildedItem * items, std::size_t items_size,
Environment & env );
bool addState( application::ISetupStep * state, InitializerStepId id );
void process();
bool isBuilded() const;
std::size_t getSize() const { return size; }
void cancel();
virtual ~AppBuilder() = default;
protected:
virtual bool do_input( Environment & env, application::ISetupStep * & );
virtual bool do_prepare( application::ISetupStep * & );
virtual bool do_build( Environment & env, application::ISetupStep * & );
const std::size_t size;
BuildedItem * const setup_list;
Idx build_index = 0;
Idx step_quantity = 0;
Idx finish_quantity = 0;
Environment & global_env;
bool application_builded = false;
void end();
virtual bool do_end( Environment & env, application::ISetupStep * & );
};
template<std::size_t size>
struct AppBuilderBox {
AppBuilder::BuildedItem items[size];
AppBuilder builder;
AppBuilderBox( Environment & env ) :
items(), builder( items, size, env ) {}
};
}}
#include <exception>
namespace configuration { namespace software {
struct BadAppBuilderSize : public std::exception {
std::size_t item_quantity;
BadAppBuilderSize( std::size_t item_quantity ) : item_quantity(item_quantity) {}
const char* what() const noexcept { return "Bad AppBuilder size!"; }
};
inline void add( AppBuilder & builder, application::ISetupStep * step, InitializerStepId id ) {
if( not builder.addState(step, id) and step )
throw BadAppBuilderSize( builder.getSize() );
}
class AppBuilderSafety : public AppBuilder {
public:
AppBuilderSafety( BuildedItem * items, std::size_t items_size,
Environment & env ) : AppBuilder( items, items_size, env ) {}
protected:
virtual bool do_input( Environment & env, application::ISetupStep * & ) override;
virtual bool do_prepare( application::ISetupStep * & ) override;
virtual bool do_build( Environment & env, application::ISetupStep * & ) override;
virtual bool do_end( Environment & env, application::ISetupStep * & ) override;
};
}}
#endif /* SOURCE_APPLICATION_SOFTWARE_APPBUILDER_H_ */