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