C++ Essence Library 0.1.0
A Utility Library for Modern C++ Programming
Loading...
Searching...
No Matches
enum.hpp
1/*
2 * Copyright (c) 2024 The RefValue Project
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 * THE SOFTWARE.
21 */
22
23#pragma once
24
25#include "../generator.hpp"
26#include "detail/language_tokens.hpp"
27#include "identifier.hpp"
28
29#include <cstddef>
30#include <cstdint>
31#include <string_view>
32#include <type_traits>
33#include <utility>
34
35namespace essence::meta {
42 template <typename T>
43 consteval auto get_enum_searching_range(T) noexcept {
44 return std::pair<std::int64_t, std::int64_t>{-64, 64};
45 };
46
53 template <typename T, bool Short = true>
54 requires std::is_enum_v<T>
55 generator<std::pair<std::string_view, T>> probe_enum_names() {
56 static constexpr auto range = get_enum_searching_range(T{});
57 static constexpr auto min = range.first;
58 static constexpr auto max = range.second;
59
60 const auto origin = []<std::size_t... Is>(
61 std::index_sequence<Is...>) -> generator<std::pair<std::string_view, T>> {
62 (co_yield std::pair{get_literal_string_v<T, static_cast<T>(min + Is),
63 identifier_param{
64 .shortened = Short,
65 .ensure_correctness = false,
66 }>(),
67 static_cast<T>(min + Is)},
68 ...);
69 }(std::make_index_sequence<max - min + 1>{});
70
71 for (auto&& item : origin) {
72 if (item.first.find(detail::language_tokens::right_parentheses.front()) == std::string_view::npos) {
73 co_yield item;
74 }
75 }
76 };
77} // namespace essence::meta