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)
 |