3 template <std::
integral TLinkAddress>
8 template <std::
integral TLinkAddress>
12 template <std::
integral TLinkAddress>
20 static constexpr const Link&
Null = Details::NullLink<TLinkAddress>;
23 static constexpr LinksConstants<TLinkAddress> _constants{};
26 static constexpr std::size_t Length = 3;
47 auto& operator=(const
Link& other)
65 Link(std::convertible_to<TLinkAddress>
auto... valuesPack)
67 constexpr auto length =
sizeof...(valuesPack);
68 std::array<TLinkAddress, length> values{
static_cast<TLinkAddress>(valuesPack)...};
69 if constexpr (0 == length)
71 Index = _constants.Null;
75 else if constexpr (1 == length)
81 else if constexpr (2 == length)
87 else if constexpr (3 == length)
95 throw std::invalid_argument(
"Link: too many values");
100 Link(std::ranges::range
auto&& range)
102 for (std::size_t i = 0;
auto&& item : range | std::views::take(3))
109 operator std::vector<TLinkAddress>()
117 constexpr auto null = _constants.Null;
118 return *
this ==
Link{null, null, null};
124 using namespace Platform::Ranges;
125 if (index == _constants.IndexPart)
129 if (index == _constants.SourcePart)
133 if (index == _constants.TargetPart)
137 throw std::out_of_range(
"Link index out of range");
143 using namespace Platform::Ranges;
144 if (index == _constants.IndexPart)
148 if (index == _constants.SourcePart)
152 if (index == _constants.TargetPart)
156 throw std::out_of_range(
"Link index out of range");
160 std::size_t
size() const noexcept
185 explicit operator std::string()
const
193 return stream << static_cast<std::string>(self);
199 return std::string(
"(")
200 .append(Platform::Converters::To<std::string>(index))
202 .append(Platform::Converters::To<std::string>(source))
204 .append(Platform::Converters::To<std::string>(target))
211 return std::string(
"(")
212 .append(Platform::Converters::To<std::string>(source))
214 .append(Platform::Converters::To<std::string>(target))
219 template <
typename... Args>
220 Link(Args...) ->
Link<std::common_type_t<Args...>>;
222 template <std::ranges::range Range>
226template <std::
integral TLinkAddress>
227struct std::hash<
Platform::Data::Doublets::Link<TLinkAddress>>
232 return Platform::Hashing::Hash(self.Index, self.Source, self.Target);
std::uint32_t TLinkAddress
Definition UInt32Links.h:3