MotorControlModuleSDFM_TMS3.../Projects/EFC_Communication/UMLibrary/configuration/software/AppBuilder.hh
2024-06-07 11:12:56 +03:00

132 lines
3.0 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*!\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_ */