200 lines
6.2 KiB
C++
200 lines
6.2 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_ */
|