VLink  2.0.0
A high-performance communication middleware
name_detector.h 文件参考

Header-only compile-time introspection of type names and enumerator labels. 更多...

#include <array>
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <limits>
#include <string_view>
#include <type_traits>
#include <utility>
name_detector.h 的引用(Include)关系图:
此图展示该文件直接或间接的被哪些文件引用了:

浏览源代码.

struct  vlink::NameDetector::customize::EnumRange< EnumT >
 Inclusive integer range scanned for EnumT enumerator labels. 更多...
 
struct  vlink::NameDetector::detail::TypeNameSupported< TypeT >
 
struct  vlink::NameDetector::detail::EnumNameSupported< TypeT >
 
class  vlink::NameDetector::detail::CString< SizeT >
 
struct  vlink::NameDetector::detail::ValidCountResult< SizeT >
 

命名空间

 
 
 
 

宏定义

#define VLINK_NAME_DETECTOR_ENUM_RANGE_MIN   -128
 
#define VLINK_NAME_DETECTOR_ENUM_RANGE_MAX   128
 
#define VLINK_NAME_DETECTOR_FOR_EACH_256(X)
 
#define VLINK_NAME_DETECTOR_ENUM_V(O)
 

类型定义

template<typename TypeT >
using vlink::NameDetector::detail::RemoveCvrefT = std::remove_cv_t< std::remove_reference_t< TypeT > >
 

函数

template<typename TypeT >
constexpr bool vlink::NameDetector::is_support () noexcept
 Reports whether the current toolchain can extract a textual name for TypeT. 更多...
 
template<typename TypeT >
constexpr std::string_view vlink::NameDetector::get () noexcept
 Returns the trimmed compile-time identifier for TypeT. 更多...
 
template<typename EnumT >
constexpr std::string_view vlink::NameDetector::get_enum (EnumT value) noexcept
 Resolves the source identifier of an enumerator literal at compile time. 更多...
 
constexpr std::string_view vlink::NameDetector::detail::pretty_name (std::string_view name, bool remove_suffix=true) noexcept
 
template<typename TypeT , size_t SizeT, size_t... IndexT>
constexpr std::array< std::remove_cv_t< TypeT >, SizeT > vlink::NameDetector::detail::to_array (TypeT(&a)[SizeT], std::index_sequence< IndexT... >) noexcept
 
template<typename LeftT , typename RightT >
constexpr bool vlink::NameDetector::detail::cmp_less (LeftT lhs, RightT rhs) noexcept
 
template<typename EnumT , EnumT ValueV>
constexpr auto vlink::NameDetector::detail::raw_enum_name () noexcept
 
template<typename EnumT , EnumT ValueV>
constexpr auto vlink::NameDetector::detail::enum_name () noexcept
 
template<typename EnumT , auto ValueV>
constexpr bool vlink::NameDetector::detail::is_valid () noexcept
 
template<typename EnumT , int OffsetT, typename UnderlyingT = std::underlying_type_t<EnumT>>
constexpr UnderlyingT vlink::NameDetector::detail::ualue (size_t i) noexcept
 
template<typename EnumT , int OffsetT, typename UnderlyingT = std::underlying_type_t<EnumT>>
constexpr EnumT vlink::NameDetector::detail::enum_value_at (size_t i) noexcept
 
template<typename EnumT , typename UnderlyingT = std::underlying_type_t<EnumT>>
constexpr int vlink::NameDetector::detail::reflected_min () noexcept
 
template<typename EnumT , typename UnderlyingT = std::underlying_type_t<EnumT>>
constexpr int vlink::NameDetector::detail::reflected_max () noexcept
 
template<typename EnumT , size_t SizeT, int MinT, size_t IndexT>
constexpr void vlink::NameDetector::detail::valid_count_step (bool *valid, size_t &count) noexcept
 
template<typename EnumT , size_t SizeT, int MinT>
constexpr auto vlink::NameDetector::detail::valid_count () noexcept
 
template<typename EnumT , size_t SizeT, int MinT>
constexpr auto vlink::NameDetector::detail::values_in_range () noexcept
 
template<typename EnumT , typename UnderlyingT = std::underlying_type_t<EnumT>>
constexpr auto vlink::NameDetector::detail::values () noexcept
 
template<typename EnumT , size_t... IndexT>
constexpr auto vlink::NameDetector::detail::names_impl (std::index_sequence< IndexT... >) noexcept
 
template<typename EnumT , typename UnderlyingT = std::underlying_type_t<EnumT>>
constexpr bool vlink::NameDetector::detail::is_sparse () noexcept
 
template<typename EnumT , typename UnderlyingT = std::underlying_type_t<EnumT>>
constexpr EnumT vlink::NameDetector::detail::enum_value (size_t i) noexcept
 
template<typename TypeT >
constexpr auto vlink::NameDetector::detail::raw_type_name () noexcept
 

变量

template<typename TypeT >
constexpr bool vlink::NameDetector::detail::kIsEnum = std::is_enum_v<TypeT> && std::is_same_v<TypeT, std::decay_t<TypeT>>
 
template<typename EnumT , EnumT ValueV>
constexpr auto vlink::NameDetector::detail::kEnumName = enum_name<EnumT, ValueV>()
 
template<typename EnumT >
constexpr auto vlink::NameDetector::detail::kValues = values<EnumT>()
 
template<typename EnumT >
constexpr auto vlink::NameDetector::detail::kCount = kValues<EnumT>.size()
 
template<typename EnumT , typename UnderlyingT = std::underlying_type_t<EnumT>>
constexpr UnderlyingT vlink::NameDetector::detail::kMinTalue
 
template<typename EnumT , typename UnderlyingT = std::underlying_type_t<EnumT>>
constexpr UnderlyingT vlink::NameDetector::detail::kMaxValue
 
template<typename EnumT >
constexpr auto vlink::NameDetector::detail::kNames = names_impl<EnumT>(std::make_index_sequence<kCount<EnumT>>{})
 
template<typename EnumT >
constexpr bool vlink::NameDetector::detail::kIsSparse = is_sparse<EnumT>()
 
template<typename TypeT >
constexpr auto vlink::NameDetector::detail::kTypeName = raw_type_name<TypeT>()
 

详细描述

Header-only compile-time introspection of type names and enumerator labels.

vlink::NameDetector exposes two primitives that resolve human-readable identifiers at compile time without RTTI or any third-party dependency. The implementation walks the textual content of PRETTY_FUNCTION on Clang/GCC and FUNCSIG on MSVC, then trims compiler-specific noise so the result is identical across toolchains.

Validation rules applied by the internal pretty_name() pass:

Rule Result
Begins with a character literal quote Returns an empty view (not a valid name)
Begins with a digit Returns an empty view (numeric literal)
Contains a trailing parenthesised arg Strips the argument list before the name
Contains a trailing template list Strips the "<...>" suffix from the name
Final character is not alnum/under Trims back to the last identifier character
First character is not letter/under Returns an empty view (rejects the result)
Example
static_assert(vlink::NameDetector::is_support<MyPlugin>());
constexpr std::string_view kName = vlink::NameDetector::get<MyPlugin>();
enum class Color { Red, Green, Blue };
std::string_view label = vlink::NameDetector::get_enum(Color::Green);

宏定义说明

◆ VLINK_NAME_DETECTOR_ENUM_RANGE_MAX

#define VLINK_NAME_DETECTOR_ENUM_RANGE_MAX   128

◆ VLINK_NAME_DETECTOR_ENUM_RANGE_MIN

#define VLINK_NAME_DETECTOR_ENUM_RANGE_MIN   -128

◆ VLINK_NAME_DETECTOR_ENUM_V

#define VLINK_NAME_DETECTOR_ENUM_V (   O)
值:
if constexpr ((IndexT + (O)) < SizeT) { \
if constexpr (is_valid<EnumT, ualue<EnumT, MinT>(IndexT + (O))>()) { \
valid[IndexT + (O)] = true; \
++count; \
} \
}

◆ VLINK_NAME_DETECTOR_FOR_EACH_256

#define VLINK_NAME_DETECTOR_FOR_EACH_256 (   X)
值:
X(0) \
X(1) X(2) X(3) X(4) X(5) X(6) X(7) X(8) X(9) X(10) X(11) X(12) X(13) X(14) X(15) X(16) X(17) X(18) X(19) X(20) X(21) \
X(22) X(23) X(24) X(25) X(26) X(27) X(28) X(29) X(30) X(31) X(32) X(33) X(34) X(35) X(36) X(37) X(38) X(39) X(40) \
X(41) X(42) X(43) X(44) X(45) X(46) X(47) X(48) X(49) X(50) X(51) X(52) X(53) X(54) X(55) X(56) X(57) X(58) X(59) \
X(60) X(61) X(62) X(63) X(64) X(65) X(66) X(67) X(68) X(69) X(70) X(71) X(72) X(73) X(74) X(75) X(76) X(77) X(78) \
X(79) X(80) X(81) X(82) X(83) X(84) X(85) X(86) X(87) X(88) X(89) X(90) X(91) X(92) X(93) X(94) X(95) X(96) X(97) \
X(98) X(99) X(100) X(101) X(102) X(103) X(104) X(105) X(106) X(107) X(108) X(109) X(110) X(111) X(112) X(113) \
X(114) X(115) X(116) X(117) X(118) X(119) X(120) X(121) X(122) X(123) X(124) X(125) X(126) X(127) X(128) X(129) \
X(130) X(131) X(132) X(133) X(134) X(135) X(136) X(137) X(138) X(139) X(140) X(141) X(142) X(143) X(144) X(145) \
X(146) X(147) X(148) X(149) X(150) X(151) X(152) X(153) X(154) X(155) X(156) X(157) X(158) X(159) X(160) X(161) \
X(162) X(163) X(164) X(165) X(166) X(167) X(168) X(169) X(170) X(171) X(172) X(173) X(174) X(175) X(176) X(177) \
X(178) X(179) X(180) X(181) X(182) X(183) X(184) X(185) X(186) X(187) X(188) X(189) X(190) X(191) X(192) X(193) \
X(194) X(195) X(196) X(197) X(198) X(199) X(200) X(201) X(202) X(203) X(204) X(205) X(206) X(207) X(208) X(209) \
X(210) X(211) X(212) X(213) X(214) X(215) X(216) X(217) X(218) X(219) X(220) X(221) X(222) X(223) X(224) X(225) \
X(226) X(227) X(228) X(229) X(230) X(231) X(232) X(233) X(234) X(235) X(236) X(237) X(238) X(239) X(240) X(241) \
X(242) X(243) X(244) X(245) X(246) X(247) X(248) X(249) X(250) X(251) X(252) X(253) X(254) X(255)