37 #ifndef LIB_META_UTIL_H 38 #define LIB_META_UTIL_H 50 template <
typename T,
typename D>
65 template <
bool B,
class T =
void>
90 template <
class Cond,
class T =
void>
91 using enable_if =
typename enable_if_c<Cond::value, T>::type;
93 template <
class Cond,
class T =
void>
94 using disable_if =
typename enable_if_c<not Cond::value, T>::type;
104 struct No_t {
char more_than_one[4]; };
117 template<
typename TY>
121 static Yes_t check(
typename ZZ::type *);
123 static Yes_t check(
typename X::Type *);
125 static No_t check(...);
128 static const bool value = (
sizeof(Yes_t)==
sizeof(check<TY>(0)));
134 struct has_TypeResult : std::bool_constant<_DetectNested_TypeResult<X>::value> { };
149 static Yes_t check_implicit(std::string);
150 static No_t check_implicit(...);
153 template<
class XX,
int i = sizeof(&XX::operator std::
string)>
158 static Yes_t check_explicit(
Probe<XX> * );
160 static No_t check_explicit(...);
163 static const bool value = (
sizeof(Yes_t)==
sizeof(check_implicit (std::declval<X>())))
164 or (
sizeof(Yes_t)==
sizeof(check_explicit<X>(0)));
179 template<
typename TY>
183 static Yes_t check(
typename X::List *);
185 static No_t check(...);
188 static const bool value = (
sizeof(Yes_t)==
sizeof(check<TY>(0)));
195 template<
typename FUN>
198 template<
typename FF,
199 typename SEL = decltype(&FF::operator())>
206 static No_t check(...);
209 static const bool value = (
sizeof(Yes_t)==
sizeof(check<FUN>(0)));
219 template<
class BAS,
size_t m=0>
267 extern const std::string FUNCTION_INDICATOR;
268 extern const std::string FAILURE_INDICATOR;
269 extern const std::string BOTTOM_INDICATOR;
270 extern const std::string VOID_INDICATOR;
272 extern const std::string BOOL_FALSE_STR;
273 extern const std::string BOOL_TRUE_STR;
295 template<
typename TY>
299 auto mangledType = obj?
typeid(*obj).name()
301 return humanReadableTypeID (mangledType);
304 {
return FAILURE_INDICATOR; }
306 template<
typename TY>
307 inline disable_if<std::is_pointer<TY>,
309 typeStr (TY
const& ref) noexcept
317 return VOID_INDICATOR;
327 template<
typename TY>
329 typeSymbol (TY
const* obj =
nullptr)
331 auto mangledType = obj?
typeid(*obj).name()
333 return primaryTypeComponent (mangledType);
336 template<
typename TY>
337 inline disable_if<std::is_pointer<TY>,
339 typeSymbol (TY
const& ref)
341 return typeSymbol (&ref);
351 using lib::meta::typeStr;
352 using lib::meta::FAILURE_INDICATOR;
353 using lib::meta::BOTTOM_INDICATOR;
370 template<
typename X,
typename COND =
void>
374 invoke (X
const& x) noexcept
375 try {
return "«"+typeStr(x)+
"»"; }
376 catch(...) {
return FAILURE_INDICATOR; }
383 invoke (X
const& val) noexcept
384 try {
return std::string(val); }
385 catch(...) {
return FAILURE_INDICATOR; }
394 struct StringConv<X*, lib::meta::disable_if<std::__or_<std::is_same<std::remove_cv_t<X>,
char>
395 ,std::is_same<std::remove_cv_t<X>,
void>
399 invoke (X
const* ptr) noexcept
401 : BOTTOM_INDICATOR +
"«"+typeStr(ptr)+
"»";
403 catch(...) {
return FAILURE_INDICATOR; }
418 return yes? lib::meta::BOOL_TRUE_STR
419 : lib::meta::BOOL_FALSE_STR;
424 std::string showFloat (
float) noexcept;
430 std::string
showAddr (
void const* addr) noexcept;
446 : BOTTOM_INDICATOR +
" «" + typeStr(ptr) +
"»";
449 template<
typename SP>
451 showSmartPtr (SP
const& smPtr, std::string label =
"smP")
453 using TargetType =
typename SP::element_type;
456 : BOTTOM_INDICATOR +
" «" + typeStr(smPtr) +
"»";
inline string literal This is a marker type to indicate that
Implementation namespace for support and library code.
failsafe invocation of custom string conversion.