/*!\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 struct AppBuilderBox { AppBuilder::BuildedItem items[size]; AppBuilder builder; AppBuilderBox( Environment & env ) : items(), builder( items, size, env ) {} }; }} #include 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_ */