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