cli20 0.1.2
A C++20 typed-schema command-line parser
Loading...
Searching...
No Matches
relation.hh
Go to the documentation of this file.
1#pragma once
2
3#include <array>
4#include <initializer_list>
5#include <string_view>
6#include <tuple>
7#include <type_traits>
8
9namespace cli {
10
11template <std::size_t Max = 8>
12struct NameList {
13 std::array<std::string_view, Max> values{};
14 std::size_t size{};
15
16 constexpr NameList() = default;
17 constexpr NameList(std::initializer_list<std::string_view> names) {
18 if (names.size() > Max) {
19 throw "cli::NameList capacity exceeded";
20 }
21 size = names.size();
22 auto it = names.begin();
23 for (std::size_t i = 0; i < size; ++i, ++it) {
24 values[i] = *it;
25 }
26 }
27
28 [[nodiscard]] constexpr auto begin() const { return values.begin(); }
29 [[nodiscard]] constexpr auto end() const { return values.begin() + size; }
30 [[nodiscard]] constexpr auto empty() const -> bool { return size == 0; }
31};
32
34 std::string_view name;
36};
37
39 std::string_view name;
41};
42
44 std::string_view left;
45 std::string_view right;
46};
47
49 std::string_view source;
50 std::string_view target;
51};
52
53template <class... Relations>
55 std::tuple<Relations...> items;
56};
57
58template <class T>
59struct IsRelationSet : std::false_type {};
60
61template <class... Relations>
62struct IsRelationSet<RelationSet<Relations...>> : std::true_type {};
63
64template <class T>
66
67[[nodiscard]] constexpr auto group(GroupParams params) -> GroupRelation {
68 return {.name = params.name, .members = params.members};
69}
70
71[[nodiscard]] constexpr auto conflicts(std::string_view left,
72 std::string_view right)
74 return {.left = left, .right = right};
75}
76
77[[nodiscard]] constexpr auto depends_on(std::string_view source,
78 std::string_view target)
80 return {.source = source, .target = target};
81}
82
83template <class... Relations>
84[[nodiscard]] constexpr auto relations(Relations... rels)
85 -> RelationSet<Relations...> {
86 return {.items = std::tuple<Relations...>{rels...}};
87}
88
89} // namespace cli
Definition action.hh:29
constexpr auto group(GroupParams params) -> GroupRelation
Definition relation.hh:67
constexpr auto conflicts(std::string_view left, std::string_view right) -> ConflictsRelation
Definition relation.hh:71
constexpr auto relations(Relations... rels) -> RelationSet< Relations... >
Definition relation.hh:84
constexpr auto depends_on(std::string_view source, std::string_view target) -> DependsOnRelation
Definition relation.hh:77
std::string_view right
Definition relation.hh:45
std::string_view left
Definition relation.hh:44
std::string_view source
Definition relation.hh:49
std::string_view target
Definition relation.hh:50
NameList members
Definition relation.hh:35
std::string_view name
Definition relation.hh:34
std::string_view name
Definition relation.hh:39
constexpr NameList(std::initializer_list< std::string_view > names)
Definition relation.hh:17
constexpr auto begin() const
Definition relation.hh:28
constexpr auto end() const
Definition relation.hh:29
std::array< std::string_view, Max > values
Definition relation.hh:13
constexpr NameList()=default
std::size_t size
Definition relation.hh:14
constexpr auto empty() const -> bool
Definition relation.hh:30
std::tuple< Relations... > items
Definition relation.hh:55