|
- #pragma once
-
- #include <memory>
-
- #include "type_helper.h"
-
- namespace cppcore
- {
-
- namespace __impl
- {
-
- template<typename T>
- std::string get_type_name()
- {
- using ptr_u = std::unique_ptr<char, decltype(&free)>;
-
- int status;
- ptr_u name(
- abi::__cxa_demangle(typeid(T).name(), 0, 0, &status),
- &free);
-
- return std::string(name
- ? name.get()
- : typeid(T).name());
- }
-
- }
-
- template<typename T>
- const std::string& type_helper<T>::name()
- {
- static auto value = __impl::get_type_name<T>();
- return value;
- }
-
- /**
- * @brief Implements a unique counter for the given template parameters.
- */
- template<typename... T_args>
- size_t& unique_counter<T_args...>::next()
- {
- static size_t value { };
- return ++value;
- }
-
- /**
- * @brief Get a unique ID for the passed template arguments.
- *
- * @tparam T_counter Counter to use to generate the unique ID.
- * @tparam X Type to generate the ID for.
- */
- template<typename T_counter, typename... X>
- size_t get_unique_id()
- {
- static const auto v = unique_counter<T_counter>::next();
- return v;
- }
-
- }
|