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

200 lines
6.2 KiB
C++
Raw Permalink 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 Описание файла.
*/
/*
* 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_ */