typeidx: add name registration
This commit is contained in:
parent
957c4d169f
commit
393ecede5a
@ -7,3 +7,5 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "typeidx.hpp"
|
#include "typeidx.hpp"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
31
typeidx.hpp
31
typeidx.hpp
@ -8,8 +8,13 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "introspection/name.hpp"
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <variant>
|
#include <variant>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
|
||||||
namespace cruft {
|
namespace cruft {
|
||||||
@ -20,6 +25,14 @@ namespace cruft {
|
|||||||
static std::atomic<int> counter;
|
static std::atomic<int> counter;
|
||||||
return ++counter;
|
return ++counter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename TagT>
|
||||||
|
std::vector<std::string>&
|
||||||
|
name (void)
|
||||||
|
{
|
||||||
|
static std::vector<std::string> s_names (1, "");
|
||||||
|
return s_names;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return a globally unique runtime ID for a given type (namespaced by a
|
/// Return a globally unique runtime ID for a given type (namespaced by a
|
||||||
@ -48,10 +61,28 @@ namespace cruft {
|
|||||||
typeidx (void)
|
typeidx (void)
|
||||||
{
|
{
|
||||||
static auto id = detail::typeidx_next<TagT> ();
|
static auto id = detail::typeidx_next<TagT> ();
|
||||||
|
|
||||||
|
static bool s_done = false;
|
||||||
|
if (!s_done) {
|
||||||
|
auto &name = detail::name<TagT> ();
|
||||||
|
assert (name.size () == std::size_t (id));
|
||||||
|
name.resize (name.size () + 1);
|
||||||
|
name[id] = cruft::introspection::name::full<T> ();
|
||||||
|
s_done = true;
|
||||||
|
}
|
||||||
|
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template <typename TagT = void>
|
||||||
|
std::string const&
|
||||||
|
typeidx_name (int idx)
|
||||||
|
{
|
||||||
|
return detail::name<TagT> ()[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Returns the typeidx of the contained value within a variant.
|
/// Returns the typeidx of the contained value within a variant.
|
||||||
///
|
///
|
||||||
/// May throw std::bad_variant_access if the variant is
|
/// May throw std::bad_variant_access if the variant is
|
||||||
|
Loading…
Reference in New Issue
Block a user