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

200 lines
6.1 KiB
C++

/*!\file
* \brief \todo Îïèñàíèå ôàéëà.
*/
/*
* AppCreate.h
*
* Created on: 24 èþí. 2019 ã.
* Author: titov
*/
#ifndef SOURCE_APPLICATION_SOFTWARE_APPCREATE_H_
#define SOURCE_APPLICATION_SOFTWARE_APPCREATE_H_
#include "AppId.hh"
#include "ApplicationConfigurator.hh"
#include "../../application/ISetupStep.hh"
#include <cstring>
#include <type_traits>
#include <memory_resource>
#include "../../memories/memories.hh"
namespace configuration { namespace software {
template<typename Inititializer, typename Setting = void, typename ProcessParameters = void>
struct AppCreate {
typedef Inititializer Type;
static application::ISetupStep * build(
std::pmr::memory_resource& mr,
std::pair<const char *, std::size_t> links,
std::pair<const char *, std::size_t> setting,
std::pair<const char *, std::size_t> process_parameters );
};
template<typename Inititializer>
struct AppCreate<Inititializer, void, void> {
typedef Inititializer Type;
static application::ISetupStep * build(
std::pmr::memory_resource& mr,
std::pair<const char *, std::size_t> links,
std::pair<const char *, std::size_t> setting,
std::pair<const char *, std::size_t> process_parameters );
};
template<typename Inititializer, typename Setting>
struct AppCreate<Inititializer, Setting, void> {
typedef Inititializer Type;
static application::ISetupStep * build(
std::pmr::memory_resource& mr,
std::pair<const char *, std::size_t> links,
std::pair<const char *, std::size_t> setting,
std::pair<const char *, std::size_t> process_parameters );
};
template<typename Inititializer, typename ProcessParameters>
struct AppCreate<Inititializer, void, ProcessParameters> {
typedef Inititializer Type;
static application::ISetupStep * build(
std::pmr::memory_resource& mr,
std::pair<const char *, std::size_t> links,
std::pair<const char *, std::size_t> setting,
std::pair<const char *, std::size_t> process_parameters );
};
}}
template<typename Inititializer, typename Setting, typename ProcessParameters>
inline application::ISetupStep * configuration::software::AppCreate<Inititializer, Setting, ProcessParameters>::build(
std::pmr::memory_resource& mr,
std::pair<const char *, std::size_t> links_buff,
std::pair<const char *, std::size_t> setting_buff,
std::pair<const char *, std::size_t> process_parameters) {
typedef typename Inititializer::Links Links;
typedef ProcessParameters ProcParams;
if( sizeof(Links) != links_buff.second )
return nullptr;
if( sizeof(Setting) != setting_buff.second )
return nullptr;
if( sizeof(ProcParams) != process_parameters.second )
return nullptr;
Links * links = memories::instance_object<Links>( mr );
std::memcpy( links, links_buff.first, links_buff.second );
Setting * setting = memories::instance_object<Setting>( mr );
std::memcpy( setting, setting_buff.first, setting_buff.second );
ProcParams * proc_params = memories::instance_object<ProcParams>( mr );
std::memcpy( proc_params, process_parameters.first, process_parameters.second );
return memories::instance_object<Inititializer>( mr, *links, *setting, *proc_params );
}
template<typename Inititializer, typename Setting>
inline application::ISetupStep * configuration::software::AppCreate<Inititializer, Setting, void>::build(
std::pmr::memory_resource& mr,
std::pair<const char *, std::size_t> links_buff,
std::pair<const char *, std::size_t> setting_buff,
std::pair<const char *, std::size_t> process_parameters) {
typedef typename Inititializer::Links Links;
if( sizeof(Links) != links_buff.second )
return nullptr;
if( sizeof(Setting) != setting_buff.second )
return nullptr;
if( process_parameters.second )
return nullptr;
Links * links = memories::instance_object<Links>( mr );
std::memcpy( links, links_buff.first, links_buff.second );
Setting * setting = memories::instance_object<Setting>( mr );
std::memcpy( setting, setting_buff.first, setting_buff.second );
return memories::instance_object<Inititializer>( mr, *links, *setting );
}
template<typename Inititializer, typename ProcessParameters>
inline application::ISetupStep * configuration::software::AppCreate<Inititializer, void, ProcessParameters>::build(
std::pmr::memory_resource& mr,
std::pair<const char *, std::size_t> links_buff,
std::pair<const char *, std::size_t> setting_buff,
std::pair<const char *, std::size_t> process_parameters) {
typedef typename Inititializer::Links Links;
typedef ProcessParameters ProcParams;
if( sizeof(Links) != links_buff.second )
return nullptr;
if( setting_buff.second )
return nullptr;
if( sizeof(ProcParams) != process_parameters.second )
return nullptr;
Links * links = memories::instance_object<Links>( mr );
std::memcpy( links, links_buff.first, links_buff.second );
ProcParams * proc_params = memories::instance_object<ProcParams>( mr );
std::memcpy( proc_params, process_parameters.first, process_parameters.second );
return memories::instance_object<Inititializer>( mr, *links, *proc_params );
}
template<typename Inititializer>
inline application::ISetupStep * configuration::software::AppCreate<Inititializer, void, void>::build(
std::pmr::memory_resource& mr,
std::pair<const char *, std::size_t> links_buff,
std::pair<const char *, std::size_t> setting_buff,
std::pair<const char *, std::size_t> process_parameters ) {
typedef typename Inititializer::Links Links;
if( sizeof(Links) != links_buff.second )
return nullptr;
if( setting_buff.second )
return nullptr;
if( process_parameters.second )
return nullptr;
Links * links = memories::instance_object<Links>( mr );
std::memcpy( links, links_buff.first, links_buff.second );
return memories::instance_object<Inititializer>( mr, *links );
}
#endif /* SOURCE_APPLICATION_SOFTWARE_APPCREATE_H_ */