58 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
 | |
| #pragma once
 | |
| 
 | |
| #if !defined(MIJIN_INTERNAL_HELPERS_HPP_INCLUDED)
 | |
| #define MIJIN_INTERNAL_HELPERS_HPP_INCLUDED 1
 | |
| 
 | |
| #include <type_traits>
 | |
| #include "../util/traits.hpp"
 | |
| 
 | |
| #define MIJIN_IDENTITY(what) what
 | |
| #define MIJIN_NULLIFY(what)
 | |
| 
 | |
| #define MIJIN_SMART_QUOTE(chr_type, text)                                      \
 | |
| []<typename TChar__>(TChar__) consteval                                        \
 | |
| {                                                                              \
 | |
|     if constexpr (std::is_same_v<TChar__, char>)                               \
 | |
|     {                                                                          \
 | |
|         return text;                                                           \
 | |
|     }                                                                          \
 | |
|     else if constexpr (std::is_same_v<TChar__, wchar_t>)                       \
 | |
|     {                                                                          \
 | |
|         return L ## text;                                                      \
 | |
|     }                                                                          \
 | |
|     else if constexpr (std::is_same_v<TChar__, char8_t>)                       \
 | |
|     {                                                                          \
 | |
|         return u8 ## text;                                                     \
 | |
|     }                                                                          \
 | |
|     else                                                                       \
 | |
|     {                                                                          \
 | |
|         static_assert(::mijin::always_false_v<TChar__>, "Invalid char type."); \
 | |
|     }                                                                          \
 | |
| }(chr_type())
 | |
| 
 | |
| #define MIJIN_SMART_STRINGIFY(chr_type, text) MIJIN_SMART_QUOTE(chr_type, #text)
 | |
| 
 | |
| #define MIJIN_DEFINE_CHAR_VERSIONS_IMPL(type_name, prefix_a, prefix_b, prefix_c, set_args) \
 | |
| prefix_a prefix_b(char) prefix_c                                                           \
 | |
| using C ## type_name = Base ## type_name <set_args(char)>;                                 \
 | |
|                                                                                            \
 | |
| prefix_a prefix_b(wchar_t) prefix_c                                                        \
 | |
| using W ## type_name = Base ## type_name <set_args(wchar_t)>;                              \
 | |
|                                                                                            \
 | |
| prefix_a prefix_b(char8_t) prefix_c                                                        \
 | |
| using U ## type_name = Base ## type_name <set_args(char8_t)>;                              \
 | |
|                                                                                            \
 | |
| using type_name = Base ## type_name<>;
 | |
| 
 | |
| #define MIJIN_DEFINE_CHAR_VERSIONS_TMPL(type_name, remaining_args, set_args) \
 | |
| MIJIN_DEFINE_CHAR_VERSIONS_IMPL(type_name, template<, remaining_args, >, set_args)
 | |
| 
 | |
| #define MIJIN_DEFINE_CHAR_VERSIONS_CUSTOM(type_name, set_args)   \
 | |
| MIJIN_DEFINE_CHAR_VERSIONS_IMPL(type_name, , MIJIN_NULLIFY, , set_args)
 | |
| 
 | |
| #define MIJIN_DEFINE_CHAR_VERSIONS(type_name) \
 | |
| MIJIN_DEFINE_CHAR_VERSIONS_CUSTOM(type_name, MIJIN_IDENTITY)
 | |
| 
 | |
| #endif // !defined(MIJIN_INTERNAL_HELPERS_HPP_INCLUDED)
 |