Rune Caster 1.0.0
Modern C++ Text Processing Framework
Loading...
Searching...
No Matches
concepts.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <concepts>
4#include <ranges>
5#include <type_traits>
6
7namespace rune_caster {
8
9// Forward declarations
10namespace unicode {
11 enum class Category;
12 enum class Script;
13}
14
15namespace language {
16 enum class Code;
17}
18
19namespace runes {
20
21// 기본 Rune 타입 Concepts
22template<typename T>
23concept RuneLike = requires(T t) {
24 { t.code_point() } -> std::convertible_to<char32_t>;
25 { t.category() } -> std::convertible_to<unicode::Category>;
26 { t.script() } -> std::convertible_to<unicode::Script>;
27 { t.language_hint() } -> std::convertible_to<language::Code>;
28};
29
30template<typename T>
31concept RuneContainer = requires(T t) {
32 typename T::value_type;
33 typename T::iterator;
34 typename T::const_iterator;
36 { t.begin() } -> std::input_iterator;
37 { t.end() } -> std::input_iterator;
38 { t.size() } -> std::convertible_to<std::size_t>;
39 { t.empty() } -> std::convertible_to<bool>;
40};
41
42template<typename T>
43concept RuneRange = std::ranges::range<T> &&
45
46template<typename T>
48 std::ranges::output_range<T, typename std::ranges::range_value_t<T>>;
49
50// 텍스트 처리 Concepts
51template<typename T>
52concept TextProcessor = requires(T processor) {
53 typename T::input_type;
54 typename T::output_type;
57} && requires(T processor, typename T::input_type input) {
58 { processor.process(input) } -> std::convertible_to<typename T::output_type>;
59};
60
61template<typename T>
62concept Spell = TextProcessor<T> && requires(T spell) {
63 // Spell은 함수 호출 연산자도 지원해야 함
64 { spell(std::declval<typename T::input_type>()) }
65 -> std::convertible_to<typename T::output_type>;
66};
67
68template<typename T>
69concept InPlaceSpell = Spell<T> && requires {
70 requires std::same_as<typename T::input_type, typename T::output_type>;
71};
72
73// Caster Concepts
74template<typename T>
75concept Caster = requires(T caster) {
76 typename T::input_type;
77 typename T::output_type;
78 { caster.cast(std::declval<typename T::input_type>()) }
79 -> std::convertible_to<typename T::output_type>;
80};
81
82// 성능 제약 Concepts
83template<typename T>
84concept LowLatency = requires {
85 requires sizeof(T) <= 64; // 캐시 라인 크기 제한
86};
87
88template<typename T>
89concept ThreadSafe = requires {
90 typename T::is_thread_safe;
91 requires T::is_thread_safe::value;
92};
93
94} // namespace runes
95} // namespace rune_caster
A powerful chaining pipeline for applying spells to data.
Definition caster.hpp:22
constexpr auto cast(Spell &&spell) const &-> caster< typename Spell::output_type >
Apply a spell and return a new caster with the result (C++20 concepts)
Definition caster.hpp:48
Language detection and identification functionality.
Definition concepts.hpp:15
Code
Enumeration of supported language codes.
Definition language.hpp:43