Skip to content

Commit 7c2adeb

Browse files
committed
[MISC] Also check member types of both configs
1 parent 3f190ab commit 7c2adeb

File tree

1 file changed

+33
-23
lines changed

1 file changed

+33
-23
lines changed

include/sharg/detail/poison_config.hpp

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -59,33 +59,43 @@ struct poison_config_size_comp_validator : public detail::default_validator
5959
* \tparam validator_t The validator to use. Defaults to sharg::detail::poison_config_size_comp_validator.
6060
* \details
6161
* * Sizes of sharg::config and sharg::detail::poison_config are the same.
62+
* * sharg::config and sharg::detail::poison_config have the same member types (except validator).
6263
* * sharg::detail::poison_config can be constructed with designated initializers from sharg::config's members.
6364
* * sharg::config can be constructed with designated initializers from sharg::detail::poison_config's members.
65+
* The latter two ensure that the order of the members is the same.
6466
*/
6567
template <typename validator_t = poison_config_size_comp_validator>
66-
concept poison_config_valid = (sizeof(poison_config) == sizeof(config<validator_t>))
67-
&& requires (config<validator_t> cfg, poison_config poison_cfg) {
68-
{
69-
poison_config{.short_id = cfg.short_id,
70-
.long_id = cfg.long_id,
71-
.description = cfg.description,
72-
.default_message = cfg.default_message,
73-
.advanced = cfg.advanced,
74-
.hidden = cfg.hidden,
75-
.required = cfg.required,
76-
.validator = cfg.validator}
77-
};
78-
{
79-
config<validator_t>{.short_id = poison_cfg.short_id,
80-
.long_id = poison_cfg.long_id,
81-
.description = poison_cfg.description,
82-
.default_message = poison_cfg.default_message,
83-
.advanced = poison_cfg.advanced,
84-
.hidden = poison_cfg.hidden,
85-
.required = poison_cfg.required,
86-
.validator = std::any_cast<validator_t>(poison_cfg.validator)}
87-
};
88-
};
68+
concept poison_config_valid =
69+
(sizeof(poison_config) == sizeof(config<validator_t>))
70+
&& std::same_as<decltype(poison_config{}.short_id), decltype(config<validator_t>{}.short_id)>
71+
&& std::same_as<decltype(poison_config{}.long_id), decltype(config<validator_t>{}.long_id)>
72+
&& std::same_as<decltype(poison_config{}.description), decltype(config<validator_t>{}.description)>
73+
&& std::same_as<decltype(poison_config{}.default_message), decltype(config<validator_t>{}.default_message)>
74+
&& std::same_as<decltype(poison_config{}.advanced), decltype(config<validator_t>{}.advanced)>
75+
&& std::same_as<decltype(poison_config{}.hidden), decltype(config<validator_t>{}.hidden)>
76+
&& std::same_as<decltype(poison_config{}.required), decltype(config<validator_t>{}.required)>
77+
&& requires (config<validator_t> cfg, poison_config poison_cfg) {
78+
{
79+
poison_config{.short_id = cfg.short_id,
80+
.long_id = cfg.long_id,
81+
.description = cfg.description,
82+
.default_message = cfg.default_message,
83+
.advanced = cfg.advanced,
84+
.hidden = cfg.hidden,
85+
.required = cfg.required,
86+
.validator = cfg.validator}
87+
};
88+
{
89+
config<validator_t>{.short_id = poison_cfg.short_id,
90+
.long_id = poison_cfg.long_id,
91+
.description = poison_cfg.description,
92+
.default_message = poison_cfg.default_message,
93+
.advanced = poison_cfg.advanced,
94+
.hidden = poison_cfg.hidden,
95+
.required = poison_cfg.required,
96+
.validator = std::any_cast<validator_t>(poison_cfg.validator)}
97+
};
98+
};
8999

90100
static_assert(poison_config_valid<>, "sharg::detail::poison_config must have the same members as sharg::config!");
91101

0 commit comments

Comments
 (0)