StormByte 2.0.0
C++26 foundation of the StormByte suite
 
Loading...
Searching...
No Matches
wrappers.hxx
Go to the documentation of this file.
1/*
2 * Copyright (C) 2024-2026 David C. Manuelda (StormBytePP)
3 *
4 * This file is part of StormByte.
5 *
6 * StormByte original source is dual-licensed:
7 *
8 * 1. GNU Lesser General Public License v3.0 (or later)
9 * You may redistribute and/or modify this file under the terms of the
10 * GNU Lesser General Public License as published by the Free Software
11 * Foundation, either version 3 of the License, or (at your option)
12 * any later version.
13 *
14 * 2. Commercial license
15 * Alternatively, this file may be used under the terms of a commercial
16 * license agreement with the copyright holder
17 * (David C. Manuelda <StormByte@gmail.com>).
18 *
19 * Both licenses apply only to original StormByte source in this repository.
20 * They do not cover other StormByte modules or any third-party material
21 * shipped with this repository (including everything under thirdparty/),
22 * which remains under its own license.
23 *
24 * Neither license grants any patent rights. Any patent licenses required
25 * to use this software or third-party components must be obtained separately
26 * from the patent holders.
27 *
28 * StormByte is distributed in the hope that it will be useful,
29 * but WITHOUT ANY WARRANTY; without even the implied warranty of
30 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
31 * GNU Lesser General Public License for more details.
32 *
33 * You should have received a copy of the GNU Lesser General Public License
34 * version 3 along with StormByte. If not, see
35 * <https://www.gnu.org/licenses/lgpl-3.0.html>.
36 *
37 * SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-StormByte-Commercial
38 */
39
40#pragma once
41
42#include <concepts>
43#include <cstddef>
44#include <optional>
45#include <type_traits>
46#include <utility>
47#include <variant>
48
53namespace StormByte {
58 namespace Type {
63 namespace Detail {
71 template<typename T>
72 constexpr bool is_variant_v = false;
73
78 template<typename... Ts>
79 constexpr bool is_variant_v<std::variant<Ts...>> = true;
80
89 template<typename VariantT, typename U, std::size_t... I>
90 constexpr bool variant_has_type_impl(std::index_sequence<I...> seq) noexcept {
91 (void)seq;
92 return ((std::is_same_v<
93 std::remove_cvref_t<U>,
94 std::remove_cvref_t<std::variant_alternative_t<I, VariantT>>
95 >) || ...);
96 }
97
103 template<typename VariantT, typename U>
104 constexpr bool variant_has_type_v =
105 variant_has_type_impl<VariantT, U>(
106 std::make_index_sequence<std::variant_size_v<VariantT>>()
107 );
108 }
109
132 template<typename T>
133 concept Optional =
134 requires { typename T::value_type; } &&
135 std::same_as<T, std::optional<typename T::value_type>>;
136
146 template<typename T>
147 concept Variant = Detail::is_variant_v<std::remove_cvref_t<T>>;
148
160 template<typename T, typename U>
162 Variant<T> &&
163 Detail::variant_has_type_v<std::remove_cvref_t<T>, U>;
164
184 template<typename T>
185 concept Pair = requires(T t) {
186 t.first;
187 t.second;
188 };
189
192 }
193}
Exactly std::optional<U> for some U.
Definition wrappers.hxx:133
Type with accessible first and second members.
Definition wrappers.hxx:185
StormByte::Type::Variant T that lists U among its alternatives.
Definition wrappers.hxx:161
Instantiation of std::variant, after stripping cv and references.
Definition wrappers.hxx:147
Private helpers.
constexpr bool variant_has_type_impl(std::index_sequence< I... > seq) noexcept
Fold: is stripped U one of VariantT's alternatives?
Definition wrappers.hxx:90
constexpr bool variant_has_type_v
Convenience wrapper around StormByte::Type::Detail::variant_has_type_impl.
Definition wrappers.hxx:104
constexpr bool is_variant_v
true when T is exactly std::variant after stripping cv and references.
Definition wrappers.hxx:72
Root namespace of the StormByte suite.
Octet count. Defined in byte_size.hxx. Forwarded so Type::Numeral can name it.