-
Notifications
You must be signed in to change notification settings - Fork 25
/
meta_data_gen.hpp
64 lines (50 loc) · 1.96 KB
/
meta_data_gen.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// SPDX-FileCopyrightText: 2022 Contributors to the Power Grid Model project <dynamic.grid.calculation@alliander.com>
//
// SPDX-License-Identifier: MPL-2.0
#pragma once
#ifndef POWER_GRID_MODEL_META_DATA_GEN_HPP
#define POWER_GRID_MODEL_META_DATA_GEN_HPP
#include <map>
#include <string>
#include "../all_components.hpp"
#include "../power_grid_model.hpp"
#include "input.hpp"
#include "meta_data.hpp"
#include "output.hpp"
// generate of meta data
namespace power_grid_model {
namespace meta_data {
// template function to add meta data
template <class CT>
void add_meta_data(AllPowerGridMetaData& meta) {
// TODO, remove this separate definition for UpdateType after migrating to gcc-11
// this is due to a wired bug in gcc-10
using UpdateType = typename CT::UpdateType;
meta["input"][CT::name] = get_meta<typename CT::InputType>{}();
meta["update"][CT::name] = get_meta<UpdateType>{}();
meta["sym_output"][CT::name] = get_meta<typename CT::template OutputType<true>>{}();
meta["asym_output"][CT::name] = get_meta<typename CT::template OutputType<false>>{}();
meta["sc_output"][CT::name] = get_meta<typename CT::ShortCircuitOutputType>{}();
}
template <class T>
struct MetaDataGeneratorImpl;
template <class... ComponentType>
struct MetaDataGeneratorImpl<ComponentList<ComponentType...>> {
using FuncPtr = std::add_pointer_t<void(AllPowerGridMetaData& meta)>;
static constexpr std::array<FuncPtr, sizeof...(ComponentType)> func_arr{&add_meta_data<ComponentType>...};
static AllPowerGridMetaData create_meta() {
AllPowerGridMetaData meta{};
for (auto const func : func_arr) {
func(meta);
}
return meta;
}
};
using MetaDataGenerator = MetaDataGeneratorImpl<AllComponents>;
inline AllPowerGridMetaData const& meta_data() {
static AllPowerGridMetaData const meta_data = MetaDataGenerator::create_meta();
return meta_data;
}
} // namespace meta_data
} // namespace power_grid_model
#endif