127 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
 | 
						|
#pragma once
 | 
						|
 | 
						|
#if !defined(MIJIN_UTIL_TEMPLATE_STRING_HPP_INCLUDED)
 | 
						|
#define MIJIN_UTIL_TEMPLATE_STRING_HPP_INCLUDED 1
 | 
						|
 | 
						|
#include <utility>
 | 
						|
#include "../detect.hpp"
 | 
						|
 | 
						|
namespace mijin
 | 
						|
{
 | 
						|
 | 
						|
//
 | 
						|
// public defines
 | 
						|
//
 | 
						|
 | 
						|
// #define MIJIN_MAKE_TEMPLATE_STRING(str) decltype(str ## _mijin_template_string)
 | 
						|
#define MIJIN_MAKE_TEMPLATE_STRING(str) \
 | 
						|
    mijin::impl::template_string_builder< \
 | 
						|
        mijin::impl::charAt<0>(str), \
 | 
						|
        mijin::impl::charAt<1>(str), \
 | 
						|
        mijin::impl::charAt<2>(str), \
 | 
						|
        mijin::impl::charAt<3>(str), \
 | 
						|
        mijin::impl::charAt<4>(str), \
 | 
						|
        mijin::impl::charAt<5>(str), \
 | 
						|
        mijin::impl::charAt<6>(str), \
 | 
						|
        mijin::impl::charAt<7>(str), \
 | 
						|
        mijin::impl::charAt<8>(str), \
 | 
						|
        mijin::impl::charAt<9>(str), \
 | 
						|
        mijin::impl::charAt<10>(str), \
 | 
						|
        mijin::impl::charAt<11>(str), \
 | 
						|
        mijin::impl::charAt<12>(str), \
 | 
						|
        mijin::impl::charAt<13>(str), \
 | 
						|
        mijin::impl::charAt<14>(str), \
 | 
						|
        mijin::impl::charAt<15>(str), \
 | 
						|
        mijin::impl::charAt<16>(str), \
 | 
						|
        mijin::impl::charAt<17>(str), \
 | 
						|
        mijin::impl::charAt<18>(str), \
 | 
						|
        mijin::impl::charAt<19>(str), \
 | 
						|
        mijin::impl::charAt<20>(str), \
 | 
						|
        mijin::impl::charAt<21>(str), \
 | 
						|
        mijin::impl::charAt<22>(str), \
 | 
						|
        mijin::impl::charAt<23>(str), \
 | 
						|
        mijin::impl::charAt<24>(str), \
 | 
						|
        mijin::impl::charAt<25>(str), \
 | 
						|
        mijin::impl::charAt<26>(str), \
 | 
						|
        mijin::impl::charAt<27>(str), \
 | 
						|
        mijin::impl::charAt<28>(str), \
 | 
						|
        mijin::impl::charAt<29>(str) \
 | 
						|
    >
 | 
						|
 | 
						|
//
 | 
						|
// public constants
 | 
						|
//
 | 
						|
 | 
						|
template<char... chars>
 | 
						|
using template_string = std::integer_sequence<char, chars...>;
 | 
						|
 | 
						|
namespace impl
 | 
						|
{
 | 
						|
template<typename T>
 | 
						|
struct TemplateStringHelper;
 | 
						|
 | 
						|
template<char... chars>
 | 
						|
struct TemplateStringHelper<template_string<chars...>>
 | 
						|
{
 | 
						|
    static constexpr const char value[sizeof...(chars) + 1] = {chars..., '\0'}; // NOLINT
 | 
						|
};
 | 
						|
 | 
						|
template<char chr, char... chars>
 | 
						|
constexpr template_string<chr, chars...> prependToString(template_string<chars...>)
 | 
						|
{
 | 
						|
    return {};
 | 
						|
}
 | 
						|
 | 
						|
template<char... chars>
 | 
						|
struct TemplateStringBuilder {};
 | 
						|
 | 
						|
template<char firstChar, char... chars>
 | 
						|
struct TemplateStringBuilder<firstChar, chars...>
 | 
						|
{
 | 
						|
    using previous_seq_t = typename TemplateStringBuilder<chars...>::seq_t;
 | 
						|
    using seq_t = decltype(prependToString<firstChar>(previous_seq_t()));
 | 
						|
};
 | 
						|
 | 
						|
template<char... chars>
 | 
						|
struct TemplateStringBuilder<'\0', chars...>
 | 
						|
{
 | 
						|
    using seq_t = template_string<>;
 | 
						|
};
 | 
						|
 | 
						|
template<std::size_t pos, std::size_t len>
 | 
						|
constexpr char charAt(const char (&text)[len])
 | 
						|
{
 | 
						|
    if constexpr (pos < len) {
 | 
						|
        return text[pos];
 | 
						|
    }
 | 
						|
    else {
 | 
						|
        return '\0';
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
template<char... chars>
 | 
						|
typename TemplateStringBuilder<chars...>::seq_t buildTemplateString()
 | 
						|
{
 | 
						|
    return {};
 | 
						|
}
 | 
						|
 | 
						|
template<char... chars>
 | 
						|
using template_string_builder = typename TemplateStringBuilder<chars...>::seq_t;
 | 
						|
}
 | 
						|
 | 
						|
template<typename T>
 | 
						|
inline constexpr auto template_string_v = impl::TemplateStringHelper<T>::value;
 | 
						|
 | 
						|
//
 | 
						|
// public types
 | 
						|
//
 | 
						|
 | 
						|
//
 | 
						|
// public functions
 | 
						|
//
 | 
						|
 | 
						|
} // namespace mijin
 | 
						|
 | 
						|
#endif // !defined(MIJIN_UTIL_TEMPLATE_STRING_HPP_INCLUDED)
 |