Coder Social home page Coder Social logo

ctti's Introduction

CTTI badge Build Status Join the chat at https://gitter.im/Manu343726/ctti

Compile Time Type Information for the C++ programming language.

Background

We know C++ is a statically typed compiled language, but it's disappointing that we cannot even get the name of a C++ type at compile time, having to use RTTI (Run Time Type Information) which introduces a lot of overhead. In fact, that's one of the most feared features of C++, usually disabled in performance dependent scenarios such as videogames programming.

This library aims to provide features similar to RTTI std::type_info at compile-time, currently constexpr type name and a constexpr replacement of std::type_index for indexing maps with types.

#include "ctti/type_id.hpp"

int main()
{
    static_assert(ctti::type_id<int>() != ctti::type_id("hello"), "compile-time type-id comparison");

    std::unordered_map<ctti::type_id_t, std::size_t> sizeof_map;

    sizeof_map[ctti::type_id<int>()] = sizeof(int);
}

Support and current status

This was tested on Visual Studio 2015, GCC 5.2.0, MinGW GCC 5.1, Clang >3.6.2, and cygwin Clang 3.5.2. ctti does no use of generalized constexpr and must work on C++11 mode, but it needs support of constexpr __func__-like variables in the compiler. All major compilers except GCC before 5.1 support this.

Features

  • ctti::nameof<T>(): constexpr demangled full qualified type names.
  • ctti::nameof<T, T Value>(): constexpr demangled value strings.
  • ctti::static_calue<T, Value>: std::integral_constant on steroids, to pass values as template parameters.
  • CTTI_STATIC_VALUE(Value): Handy macro to instance a ctti::static_value from the given value.
  • ctti::detailed_nameof<>(): Alternatives to nameof with detailed name info, supporting non-qualified names, getting qualifiers, etc. See ctti::name_t for details.
  • ctti::nameof_v<> and ctti::detailed_nameof_v<>: C++14 variable template alternatives to the nameof family of functions. Thanks C++ Bruja for this suggestion.
  • ctti::type_id<T>(): constexpr std::type_info-like type identifier. See ctti::type_id_t bellow for details.
  • ctti::id_from_name(name): Get the type id corresponding to the given typename.
  • ctti::unnamed_type_id<T>(): constexpr std::type_info-like hash-only type identifier. See ctti::unnamed_type_id_t bellow for details.
  • Symbol based introspection: Automatic serialization (wip), object conversion, etc. See symbolic introspection bellow.

Name customization

The names ctti return for a given static value or typename can be overrided with the ctti_nameof() function. This can be achieved in two ways:

  • Intrusive override: The user defined class defines a ctti_nameof() function as part of its static public API:
    struct Foo
    {
        static constexpr const char* ctti_nameof()
        {
            return "foo";
        }
    };
  • Non-intrusive override: A ctti_nameof(type/value tag) customization point is defined in the type/value namespace:
    #include <string>
    
    namespace std
    {
        constexpr const char* ctti_nameof(ctti::type_tag<std::string>)
        {
             return "std::string"; // instead of "std::__foobar::basic_string<char>"
        }
    }

ctti::detail::cstring

cstring is a constexpr implementation of an string view and the core of ctti. All strings returned by the ctti API are represented by this type. It supports slicing via operator()(begin index, end index), subscript, hashing, string padding, comparison operators, print to std::ostream, etc.

constexpr ctti::detail::cstring str{"hello world"};
constexpr ctti::detail::cstring str2{"   hello world   "};

static_assert(str(0, 5) == "hello");
static_assert(str2.pad(2, 2) == str);

constexpr std::uint64_t hash = str.hash(); // fnv1a hash or "hello world"

ctti::name_t

name_t contains methods to extract information of a name. Given a full qualified name (like those returned by ctti::nameof()) a name_t can be constructed and queried:

struct Foo
{
    int i;
};

constexpr ctti::name_t FooName = ctti::detailed_nameof<CTTI_STATIC_VALUE(&Foo::i)>();

int main()
{
    std::cout << FooName.name();                  // prints "i"
    std::cout << FooName.full_name();             // prints "&Foo::i"
    std::cout << FooName.full_homogeneous_name(); // prints "Foo::i"
    std::cout << FooName.qualifier(0);            // prints "Foo"
}

All methods in name_t are constexpr and return cstrings.

ctti::type_id_t

A constexpr class representing an object identifier. It has the minimal constexpr comparable interface to be used as a key type. The id is based on a fnv1a hash of the type name, which can be obtained by calling type_id_t::hash(). std::hash is specialized for this type.

std::unordered_map<ctti::type_id_t, void*(*)()> factories;

factories[ctti::type_id<int>()] =         []() -> void* { return new int{}; };
factories[ctti::type_id<std::string>()] = []() -> void* { return new std::string{}; };

void* int_var = factories[ctti::id_from_name("int")]();

ctti::unnamed_type_id_t

A lightweight version of type_id_t which only stores the type hash (ctti::type_id_t stores the name string, which takes one pointer and a size_t, and computes hash on demand. unnamed_type_id_t stores the std::uint64_t hash only).

struct object
{
    ctti::unnamed_type_id_t type_id;
    void* data;
};

Symbolic introspection

ctti implements object introspection by working with abstract "symbols" defined by the user:

#include <ctti/symbol.hpp>

CTTI_DEFINE_SYMBOL(foo);

the CTTI_DEFINE_SYMBOL macro defines an abstract identifier, a symbol, in the current namespace. After its definition, classes can be asked for members through that symbo:

CTTI_DEFINE_SYMBOL(i);

struct my_struct
{
    int i;
};

static_assert(i::is_member_of<my_struct>(), "Has my_struct a member named 'i'?");

with symbols as non-intrusive generic member identifiers, objects can be manipulated in a generic way:

#include <ctti/symbol.hpp>
#include <ctti/tie.hpp>

CTTI_DEFINE_SYMBOL(a);
CTTI_DEFINE_SYMBOL(b);
CTTI_DEFINE_SYMBOL(c);

struct foo
{
    int a, b, c;
};


int var_a, var_b;
foo my_foo{1, 2, 3};

ctti::tie<a, b>(var_a, var_b) = my_foo;

assert(var_a == 1);
assert(var_a == 2);
struct bar
{
    int a, b;
};

bar my_bar;

// Copy my_foo.a to my_bar.a and my_foo.b to my_bar.b:
ctti::map(my_foo, my_bar, ctti::mapping<a, a>(), ctti::mapping<b, b>());

Conditional features

ctti has a set of conditional features that depend on non-C++11 language features. This ctti features can be controlled by different macros:

  • ctti::nameof_v/detailed_nameof_v are declared only if CTTI_HAS_VARIABLE_TEMPLATES is defined. Enabled by default if the compiler supports variable templates.
  • ctti::nameof/detailed_nameof could work with enum values if the compiler prints those values as part of their PRETTY_FUNCTION variables. ctti controls this by defining the CTTI_HAS_ENUM_AWARE_PRETTY_FUNCTION. If this macro is not defined ctti gives no guarantee you will get the right string from an enum value.

Acknowledgments

Thanks a lot to Jonathan "foonathan" Müller, both for the constexpr hash and the idea for the __PRETTY_FUNCTION__ trick.

License

This project is licensed under the MIT license. See LICENSE.md for more details.

ctti's People

Contributors

foonathan avatar gitter-badger avatar manu343726 avatar manusharded avatar njlr avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ctti's Issues

Full std::type_index interface support

ctti::type_index should have the full interface as std::type_index. Currently only missing the comparison operators.
Also, name() should really return a const char* but this has the null-termination issue discussed in my PR.

Building example_main in VS2015 causes ctti\examples\main.cpp(24): warning C4307: '*': integral constant overflow

The warning appears for every line of code in VS2015 (but not clang) that results in a call to fnv1a_hash from hash.hpp.

It appears to be a problem specific to VS2015 with the way the 64 bit fnv1a hash is calculated, but implementing the function mulu64 in the solution by "Cheers and hth. - Alf" in https://stackoverflow.com/questions/37658794/integer-constant-overflow-warning-in-constexpr appears to stop the warning without resorting to setting pragma warnings. Have checked a couple of examples and the hash value generated appears to be the same.

error: body of constexpr function ‘ctti::pretty_function::type()' not a return-statement

Hi,

using gcc-4.8.5 I get the following error:

g++ -std=c++11 -I../include main.cpp -omain
In file included from ../include/ctti/nameof.hpp:4:0,
                 from main.cpp:1:
../include/ctti/detail/pretty_function.hpp: In instantiation of ‘constexpr ctti::detail::cstring ctti::pretty_function::type() [with T = int]’:
../include/ctti/nameof.hpp:30:47:   required from ‘static constexpr ctti::detail::cstring ctti::detail::nameof_impl<T>::apply() [with T = int]’
../include/ctti/nameof.hpp:51:48:   required from ‘constexpr ctti::detail::cstring ctti::nameof() [with T = int]’
../include/ctti/type_id.hpp:120:38:   required from ‘constexpr ctti::type_id_t ctti::detail::type_id() [with T = int]’
../include/ctti/type_id.hpp:147:35:   required from ‘constexpr ctti::type_id_t ctti::type_id() [with T = int]’
main.cpp:24:38:   required from here
../include/ctti/detail/pretty_function.hpp:30:1: error: body of constexpr function ‘constexpr ctti::detail::cstring ctti::pretty_function::type() [with T = int]’ not a return-statement
 }
 ^
../include/ctti/detail/pretty_function.hpp: In instantiation of ‘constexpr ctti::detail::cstring ctti::pretty_function::type() [with T = char]’:
../include/ctti/nameof.hpp:30:47:   required from ‘static constexpr ctti::detail::cstring ctti::detail::nameof_impl<T>::apply() [with T = char]’
../include/ctti/nameof.hpp:51:48:   required from ‘constexpr ctti::detail::cstring ctti::nameof() [with T = char]’
../include/ctti/type_id.hpp:120:38:   required from ‘constexpr ctti::type_id_t ctti::detail::type_id() [with T = char]’
../include/ctti/type_id.hpp:147:35:   required from ‘constexpr ctti::type_id_t ctti::type_id() [with T = char]’
main.cpp:24:63:   required from here
../include/ctti/detail/pretty_function.hpp:30:1: error: body of constexpr function ‘constexpr ctti::detail::cstring ctti::pretty_function::type() [with T = char]’ not a return-statement
main.cpp: In function ‘int main()’:
main.cpp:24:5: error: non-constant condition for static assertion
     static_assert(ctti::type_id<int>() != ctti::type_id<char>(), "what?");
     ^
In file included from main.cpp:1:0:
main.cpp:24:38:   in constexpr expansion of ‘ctti::type_id<int>()’
../include/ctti/type_id.hpp:147:35:   in constexpr expansion of ‘ctti::detail::type_id<int>()’
../include/ctti/type_id.hpp:120:38:   in constexpr expansion of ‘ctti::nameof<int>()’
../include/ctti/nameof.hpp:51:48:   in constexpr expansion of ‘ctti::detail::nameof_impl<T>::apply<int>()’
../include/ctti/nameof.hpp:30:47: error: ‘constexpr ctti::detail::cstring ctti::pretty_function::type() [with T = int]’ called in a constant expression
         return ctti::pretty_function::type<T>().pad(
                                               ^
In file included from ../include/ctti/nameof.hpp:4:0,
                 from main.cpp:1:
../include/ctti/detail/pretty_function.hpp:27:33: note: ‘constexpr ctti::detail::cstring ctti::pretty_function::type() [with T = int]’ is not usable as a constexpr function because:
 constexpr ctti::detail::cstring type()
                                 ^
../include/ctti/detail/pretty_function.hpp: In instantiation of ‘constexpr ctti::detail::cstring ctti::pretty_function::value() [with T = int foo::*; T Value = &foo::i]’:
../include/ctti/nameof.hpp:16:51:   required from ‘constexpr ctti::detail::cstring ctti::nameof() [with T = int foo::*; T Value = &foo::i]’
../include/ctti/nameof.hpp:42:39:   required from ‘static constexpr ctti::detail::cstring ctti::detail::nameof_impl<ctti::detail::static_value<T, Value> >::apply() [with T = int foo::*; T Value = &foo::i]’
../include/ctti/nameof.hpp:51:48:   required from ‘constexpr ctti::detail::cstring ctti::nameof() [with T = ctti::detail::static_value<int foo::*, &foo::i>]’
main.cpp:27:59:   required from here
../include/ctti/detail/pretty_function.hpp:36:1: error: body of constexpr function ‘constexpr ctti::detail::cstring ctti::pretty_function::value() [with T = int foo::*; T Value = &foo::i]’ not a return-statement
 }
 ^
../include/ctti/detail/pretty_function.hpp: In instantiation of ‘constexpr ctti::detail::cstring ctti::pretty_function::type() [with T = int foo::*]’:
../include/ctti/nameof.hpp:30:47:   required from ‘static constexpr ctti::detail::cstring ctti::detail::nameof_impl<T>::apply() [with T = int foo::*]’
../include/ctti/nameof.hpp:51:48:   required from ‘constexpr ctti::detail::cstring ctti::nameof() [with T = int foo::*]’
../include/ctti/nameof.hpp:17:53:   required from ‘constexpr ctti::detail::cstring ctti::nameof() [with T = int foo::*; T Value = &foo::i]’
../include/ctti/nameof.hpp:42:39:   required from ‘static constexpr ctti::detail::cstring ctti::detail::nameof_impl<ctti::detail::static_value<T, Value> >::apply() [with T = int foo::*; T Value = &foo::i]’
../include/ctti/nameof.hpp:51:48:   required from ‘constexpr ctti::detail::cstring ctti::nameof() [with T = ctti::detail::static_value<int foo::*, &foo::i>]’
main.cpp:27:59:   required from here
../include/ctti/detail/pretty_function.hpp:30:1: error: body of constexpr function ‘constexpr ctti::detail::cstring ctti::pretty_function::type() [with T = int foo::*]’ not a return-statement
 }
 ^
../include/ctti/detail/pretty_function.hpp: In instantiation of ‘constexpr ctti::detail::cstring ctti::pretty_function::value() [with T = int (*)(const std::basic_string<char>&, int); T Value = f]’:
../include/ctti/nameof.hpp:16:51:   required from ‘constexpr ctti::detail::cstring ctti::nameof() [with T = int (*)(const std::basic_string<char>&, int); T Value = f]’
../include/ctti/nameof.hpp:42:39:   required from ‘static constexpr ctti::detail::cstring ctti::detail::nameof_impl<ctti::detail::static_value<T, Value> >::apply() [with T = int (*)(const std::basic_string<char>&, int); T Value = f]’
../include/ctti/nameof.hpp:51:48:   required from ‘constexpr ctti::detail::cstring ctti::nameof() [with T = ctti::detail::static_value<int (*)(const std::basic_string<char>&, int), f>]’
main.cpp:28:54:   required from here
../include/ctti/detail/pretty_function.hpp:36:1: error: body of constexpr function ‘constexpr ctti::detail::cstring ctti::pretty_function::value() [with T = int (*)(const std::basic_string<char>&, int); T Value = f]’ not a return-statement
 }
 ^
../include/ctti/detail/pretty_function.hpp: In instantiation of ‘constexpr ctti::detail::cstring ctti::pretty_function::type() [with T = int (*)(const std::basic_string<char>&, int)]’:
../include/ctti/nameof.hpp:30:47:   required from ‘static constexpr ctti::detail::cstring ctti::detail::nameof_impl<T>::apply() [with T = int (*)(const std::basic_string<char>&, int)]’
../include/ctti/nameof.hpp:51:48:   required from ‘constexpr ctti::detail::cstring ctti::nameof() [with T = int (*)(const std::basic_string<char>&, int)]’
../include/ctti/nameof.hpp:17:53:   required from ‘constexpr ctti::detail::cstring ctti::nameof() [with T = int (*)(const std::basic_string<char>&, int); T Value = f]’
../include/ctti/nameof.hpp:42:39:   required from ‘static constexpr ctti::detail::cstring ctti::detail::nameof_impl<ctti::detail::static_value<T, Value> >::apply() [with T = int (*)(const std::basic_string<char>&, int); T Value = f]’
../include/ctti/nameof.hpp:51:48:   required from ‘constexpr ctti::detail::cstring ctti::nameof() [with T = ctti::detail::static_value<int (*)(const std::basic_string<char>&, int), f>]’
main.cpp:28:54:   required from here
../include/ctti/detail/pretty_function.hpp:30:1: error: body of constexpr function ‘constexpr ctti::detail::cstring ctti::pretty_function::type() [with T = int (*)(const std::basic_string<char>&, int)]’ not a return-statement
 }
 ^
../include/ctti/detail/pretty_function.hpp: In instantiation of ‘constexpr ctti::detail::cstring ctti::pretty_function::value() [with T = bar_enum; T Value = (bar_enum)0]’:
../include/ctti/nameof.hpp:16:51:   required from ‘constexpr ctti::detail::cstring ctti::nameof() [with T = bar_enum; T Value = (bar_enum)0]’
../include/ctti/nameof.hpp:42:39:   required from ‘static constexpr ctti::detail::cstring ctti::detail::nameof_impl<ctti::detail::static_value<T, Value> >::apply() [with T = bar_enum; T Value = (bar_enum)0]’
../include/ctti/nameof.hpp:51:48:   required from ‘constexpr ctti::detail::cstring ctti::nameof() [with T = ctti::detail::static_value<bar_enum, (bar_enum)0>]’
main.cpp:29:65:   required from here
../include/ctti/detail/pretty_function.hpp:36:1: error: body of constexpr function ‘constexpr ctti::detail::cstring ctti::pretty_function::value() [with T = bar_enum; T Value = (bar_enum)0]’ not a return-statement
 }
 ^
../include/ctti/detail/pretty_function.hpp: In instantiation of ‘constexpr ctti::detail::cstring ctti::pretty_function::type() [with T = bar_enum]’:
../include/ctti/nameof.hpp:30:47:   required from ‘static constexpr ctti::detail::cstring ctti::detail::nameof_impl<T>::apply() [with T = bar_enum]’
../include/ctti/nameof.hpp:51:48:   required from ‘constexpr ctti::detail::cstring ctti::nameof() [with T = bar_enum]’
../include/ctti/nameof.hpp:17:53:   required from ‘constexpr ctti::detail::cstring ctti::nameof() [with T = bar_enum; T Value = (bar_enum)0]’
../include/ctti/nameof.hpp:42:39:   required from ‘static constexpr ctti::detail::cstring ctti::detail::nameof_impl<ctti::detail::static_value<T, Value> >::apply() [with T = bar_enum; T Value = (bar_enum)0]’
../include/ctti/nameof.hpp:51:48:   required from ‘constexpr ctti::detail::cstring ctti::nameof() [with T = ctti::detail::static_value<bar_enum, (bar_enum)0>]’
main.cpp:29:65:   required from here
../include/ctti/detail/pretty_function.hpp:30:1: error: body of constexpr function ‘constexpr ctti::detail::cstring ctti::pretty_function::type() [with T = bar_enum]’ not a return-statement
 }
 ^
../include/ctti/detail/pretty_function.hpp: In instantiation of ‘constexpr ctti::detail::cstring ctti::pretty_function::type() [with T = std::basic_ostream<char>]’:
../include/ctti/nameof.hpp:30:47:   required from ‘static constexpr ctti::detail::cstring ctti::detail::nameof_impl<T>::apply() [with T = std::basic_ostream<char>]’
../include/ctti/nameof.hpp:51:48:   required from ‘constexpr ctti::detail::cstring ctti::nameof() [with T = std::basic_ostream<char>]’
../include/ctti/type_id.hpp:120:38:   required from ‘constexpr ctti::type_id_t ctti::detail::type_id() [with T = std::basic_ostream<char>]’
../include/ctti/type_id.hpp:138:62:   required from ‘constexpr ctti::type_id_t ctti::type_id(T&&) [with T = std::basic_ostream<char>&]’
main.cpp:30:41:   required from here
../include/ctti/detail/pretty_function.hpp:30:1: error: body of constexpr function ‘constexpr ctti::detail::cstring ctti::pretty_function::type() [with T = std::basic_ostream<char>]’ not a return-statement
../include/ctti/detail/pretty_function.hpp: In instantiation of ‘constexpr ctti::detail::cstring ctti::pretty_function::type() [with T = std::basic_istream<char>]’:
../include/ctti/nameof.hpp:30:47:   required from ‘static constexpr ctti::detail::cstring ctti::detail::nameof_impl<T>::apply() [with T = std::basic_istream<char>]’
../include/ctti/nameof.hpp:51:48:   required from ‘constexpr ctti::detail::cstring ctti::nameof() [with T = std::basic_istream<char>]’
../include/ctti/type_id.hpp:126:51:   required from ‘constexpr ctti::unnamed_type_id_t ctti::detail::unnamed_type_id() [with T = std::basic_istream<char>]’
../include/ctti/type_id.hpp:158:70:   required from ‘constexpr ctti::unnamed_type_id_t ctti::unnamed_type_id(T&&) [with T = std::basic_istream<char>&]’
main.cpp:31:48:   required from here
../include/ctti/detail/pretty_function.hpp:30:1: error: body of constexpr function ‘constexpr ctti::detail::cstring ctti::pretty_function::type() [with T = std::basic_istream<char>]’ not a return-statement

but when using gcc-7.2 I get the another error:

g++-7 -std=c++11 -I../include main.cpp -omain
main.cpp: In function ‘int main()’:
main.cpp:24:5: error: non-constant condition for static assertion
     static_assert(ctti::type_id<int>() != ctti::type_id<char>(), "what?");
     ^~~~~~~~~~~~~
main.cpp:24:40:   in constexpr expansion of ‘ctti::operator!=(ctti::type_id<int>(), ctti::type_id<char>())’
../include/ctti/type_id.hpp:52:26:   in constexpr expansion of ‘ctti::operator==(lhs, rhs)’
../include/ctti/type_id.hpp:47:28:   in constexpr expansion of ‘(& lhs)->ctti::type_id_t::hash()’
../include/ctti/type_id.hpp:37:30:   in constexpr expansion of ‘((const ctti::type_id_t*)this)->ctti::type_id_t::name_.ctti::detail::cstring::hash()’
../include/ctti/detail/cstring.hpp:48:24:   in constexpr expansion of ‘ctti::detail::sid_hash(((const ctti::detail::cstring*)this)->ctti::detail::cstring::length(), ((const ctti::detail::cstring*)this)->ctti::detail::cstring::begin(), 14695981039346656037)’
main.cpp:24:5: error: the value of ‘__PRETTY_FUNCTION__’ is not usable in a constant expression
In file included from ../include/ctti/nameof.hpp:4:0,
                 from main.cpp:1:
../include/ctti/detail/pretty_function.hpp:13:34: note: ‘__PRETTY_FUNCTION__’ was not declared ‘constexpr’
     #define CTTI_PRETTY_FUNCTION __PRETTY_FUNCTION__
                                  ^
../include/ctti/detail/pretty_function.hpp:29:13: note: in expansion of macro ‘CTTI_PRETTY_FUNCTION’
     return {CTTI_PRETTY_FUNCTION};
             ^~~~~~~~~~~~~~~~~~~~

Reimplement constexpr array initialization

STL told us on reddit that constexpr array initialization is supported by VS2015, then @foonathan noticed that our issue is not array related but about ctor delegation. I would like to change the implementation of ctti::detail::array and ctti::detail::string to not apply the indices trick in a constructor but in an independent function, then pass array contents as a variadic pack.

[Bug] Comparing hashes only is not enough

friend constexpr bool operator==(const type_id_t& lhs, const type_id_t& rhs) { return lhs.hash() == rhs.hash() && lhs.name_ == rhs.name_; }
If hashes are identical, names could be still different, due to collision. Code above is a fix.

Consider ctti::unnamed_type_id()

There is some people complaining about string storage, and I actually agree that the fixed size array is not the best thing to do. I have to try again some alternatives with VS.

However, I noticed that when working with ctti for type indexing, ignoring the compile-time demangling-like functionallity, you don't care about type names at all. So storing the hash in type_id_t should be enough.

So I'm thinking about adding a ctti::unamed_type_id_t (and its ctti::unnamed_type_id() counterpart) to just do type indexing, without all the storage needed for the string. See Manu343726/siplasplas#5 for an example of such a case.

Alternatives for null-terminated substrings

Current discussed alternatives:

  • Disallow raw const char* in favor of ctti::detail::string features, maybe raising it out of the detail namespace. Pros: No implementation headaches, Cons: No user direct access to compile time computed data.
  • Fixed size array for ctti::detail::string storage. Pros: Correct null-terminated sub strings. Cons: Compile-time performance (Strings should be copied always), maybe executable size bloat.

Incorrect name of template types

Hi. Thank you very much for your awesome work on ctti, it is wonderful!

I've met an incorrect behaviour of name(), here's a test case:

namespace ns
{
    template <typename T>
    struct TemplateStruct {};

    struct SomeStruct {};
}

auto fullName = ctti::detailed_nameof<ns::TemplateStruct<ns::SomeStruct>>().full_name();
auto name = ctti::detailed_nameof<ns::TemplateStruct<ns::SomeStruct>>().name();

// fullName == "ns::TemplateStruct<ns::SomeStruct>"
// name == "SomeStruct>"

I'm not sure about what value of name can be treated as correct, but SomeStruct> is probably not correct in any case.

Crash running example w/ msvc 2015

Was ultimately able to compile the example under VC140 after fixing the std::size_t issue described by #22 but the tests still failed to compile. The example crashes on std::cout << ctti::nameof<CTTI_STATIC_VALUE(&f)>() << std::endl; with a bad access. It gives some very very weird output:

nt
truct foo
ntfoo::*
class ctti::detail::cstring __cdecl ctti::pretty_function::value<intfoo::* ,pointer-to-member(0x0)>(void) -> member(0x0)
class ctti::detail::cstring __cdecl ctti::pretty_function::value<enum bar_enum,bar_enum::FOO>(void) -> OO
                                                class ctti::detail::cstring __cdecl ctti::pretty_function::type<class std::basic_istream<char,struct std::char_traits<char> >>(void)                            class ctti::detail::cstring __cdecl ctti::pretty_function::type<class std::basic_ostream<char,struct std::char_traits<char> >>(void)                            p╙L{≈�  Ç╘L{≈�  ╪╒L{≈�   ╓L{≈�  @╓L{≈�  x╓L{≈�  �       �   �   �   �   Stack around the variable '     ' was corrupted.        The variable '  ' is being used without being initialized.                                      The value of ESP was not properly saved across a function call.  This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
                                                    A cast to a smaller data type has caused a loss of data.  If this was intentional, you should mask the source of the cast with the appropriate bitmask.  For example:
        char c = (i & 0xFF);
Changing the code in this way will not affect the quality of the resulting optimized code.
                                                            Stack memory was corrupted
            A local variable was used before it was initialized
           Stack memory around _alloca was corrupted
             Unknown Runtime Check Error
           R u n t i m e   C h e c k   E r r o r .
   U n a b l e   t o   d i s p l a y   R T C   M e s s a g e .                                       R u n - T i m e   C h e c k   F a i l u r e   # % d   -   % s                   Unknown Filename        Unknown Module Name     Run-Time Check Failure #%d - %s         Stack corrupted near unknown variable           %.2X    Stack area around _alloca memory reserved by this function is corrupted

Data: <
Allocation number within this function:
Size:
Address: 0x    Stack area around _alloca memory reserved by this function is corrupted                 %s%s%p%s%zd%s%d%s
   >   %s%s%s%s        A variable is being used without being initialized.             ╚┘L{≈�  Φ┘L{≈�   ┌L{≈�  @┌L{≈�  x┌L{≈�          Stack pointer corruption        Cast to smaller type causing loss of data               Stack memory corruption         Local variable used before initialization               Stack around _alloca corrupted          b i n \ a m d 6 4 \ M S P D B 1 4 0 . D L L     V C R U N T I M E 1 4 0 D . d l l                               a p i - m s - w i n - c o r e - r e g i s t r y - l 1 - 1 - 0 . d l l                   a d v a p i 3 2 . d l l         RegOpenKeyExW   RegQueryValueExW        RegCloseKey     S O F T W A R E \ W o w 6 4 3 2 N o d e \ M i c r o s o f t \ V i s u a l S t u d i o \ 1 4 . 0 \ S e t u p \ V C                               P r o d u c t D i r             D L L           M S P D B 1 4 0         M S P D B 1 4 0         PDBOpenValidate5    r    �M{≈�  └�M{≈�              ëü╡[    �   K   ,▀  ,╔      ëü╡[       �   x▀  x╔          ö                                                                                         M{≈�                   PM{≈�  �PM{≈�                   �                                                                                                                                                                                                                                                                                                                                                                                          RSDS╔8à╛+_!NÆaÜêGà3H�   C:\code\ctti\build\examples\Debug\ctti-example.pdb      #   #       "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       ∩�L{≈�                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          ç�L{≈�                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          ��� �p  ��� �p  �(� �R�p���
R�p�#� ���p��� �p  ��� �p  �(� �2�p�#� �R�p���
R�p��� �p  ���
2�p���
R�p��� �p  ��� �p  ��� �p  �-� �2�p�-� �2�p�#� �r�p�5� ��� �p  └ü  Ç╠          ≡ú                      �   �   �   �   Στ      @           �ñ  H           ,�      ╪       ∙   �   �#      ╗#      �ñ      &ñ  �   Sñ              ��� �Bp�P      ��� �Bp�P  └ü  Ç╠      �4� ���
p  └ü  0═          `ú                      �   �   �   �   ╝Φ      @           âú  H                  �      /�      ╝�  �   9�      ¥�      âú      ûú  �   ├ú              ��� �Bp�P      ��� �Bp�P  └ü  0═      �#� �r�p�-� �R�p�/� ��� �p�`    �'� �┬p�`      �#� �Æ�p�#� �Æ�p�#� �R�p�� p�`���
2�p��� �p  ��� �p  �#� �R�p�
�
p  ���  �� �p      ���
R�p�"� �2
p���
r�p���
2�p���
2�p���
R�p���
R�p���
2�p���
R�p���
2�p���
R�p���
R�p�#� �2�p�#� �2�p�#� �r�p�'�
r�p└ü  x═          ú�      �,� �R�p└ü  ¿═          Çñ      ∙�      |3      @4          ��� �Bp�P      �'�
R�p└ü  ╪═      ÿ�      ��� �p  �"� �2
p�"� �2
p�"� �2
p�"� �2
p�"� �2
p���
r�p���
R�p���
r�p���
r�p���
2�p���
2�p���
2�p���
R�p���
R�p���
R�p���
R�p���
R�p���
2�p���
2�p�"� �2
p�"� �2
p�"� �2
p�"� �2
p�"� �2
p���
r�p���
r�p���
R�p���
R�p���
R�p���
2�p���
2�p���
2�p��� � �4 �2�`    !�� �t� pF  ïF  αδ      !   pF  ïF  αδ      �� B�p�0      !� ⌠� �  G  'G   ∞      !�� �d   'G  AG  0∞      !�� �Σ
 AG  LG  L∞      !   AG  LG  L∞      !   'G  AG  0∞      !    G  'G   ∞      ��� ��  !�� �t   F  6F  ╕∞      !    F  6F  ╕∞      ��� �b  ��� �b  ��� �B  ��� �B  ��� �b  ��� �b  ��� �B  ��� �B         �� �ó  ╥ü  �   äJ  ╦K  ░ñ  ╦K      ��� ��å �p  I�   �      �$ �dï �4è ��å �p  I�   �      ��� �< �α�`�P  I�  └�      ! �  t:4; �N  ÆN  ñφ      !   �N  ÆN  ñφ      � �d
 �T      � �R�p    ��� �bp�0           �� �ó  ╥ü  �   _M  wM  ≡ñ  wM      ��� �2�P     �� �ó  ╥ü  �   ═M  σM   Ñ  σM      ��� �2�P�j� jd╒���╓�≡
╨�└�p�P�0  I�  É�      ��� �2
d� �4�P    !�� �t
 ≡Q  �R  ÿε      !   ≡Q  �R  ÿε      �  �       b  �    �       é  �    �       b               �       ó  ╥ü  �   �_  Γ_  PÑ  Γ_      ��� �2�P��� �é  �B  �B  �� B  �
�
┬�p�`      ��� �b  ��� �B  ��� �B  ��� �B  ��� �B  ��� �B  ��� �B  �    �       B  ��� �b  �    �       B  �    �
B  ��� �é  ��� �B  ��� �B  ��� �b  ��� �"  �    �       �� �p      ��� �b  ��� �B  �� �╛ �p      �    �       b  �
�
4
2�`    !�� �t� �i  -i  ≡      !   �i  -i  ≡      �
�
4
2�`    !�� �t� pi  ìi  H≡      !   pi  ìi  H≡      �    �       B  � at� ��� �≡�╨0�P    !�� �Σ�d� �p  ╝p  î≡      �─� ╝p  Zr  ñ≡      !   ╝p  Zr  ñ≡      !   �p  ╝p  î≡      ���      �L �p  I�  P�      �4N Ék  �l   ±      �dP �l  9l  �±   �╬ �p  I�  `�      ��� �ï I�  @�      ��� �ó  ��� �B      �   ��� �Æ�0I�  @       ��� �"  ��� �"  �B  ��� �b  ��� �B  �
�       b  �    �       Γ  �    �       Γ  �    �       B  �                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               �   �   �   �   �           �   rƒ∩�£τ  ì`�≡c�          �   .                   �                                                                                                                                                                                                                                                                               �       �                       ⁿüL{≈�          �               ì`�≡c�  ì`�≡c�  ì`�≡c�  ì`�≡c�  ì`�≡c�  ì`�≡c�                                          �                           �                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           p�  ü�  └Θ  É�  *�  ╚Θ  α�  ╩�  pΦ  ╨�  Φ#  ÿτ  ≡$  '%  αΘ  @%  w%  êδ  É%  ╟%  ÿδ  α%  �&  ΦΩ  0&  g&   δ  Ç&  ╖&  ≡Ω  ╨&  '  °Ω   '  W'  αΩ  p'  º'  Çδ  └'  ≈'  xδ  �(  G(  Éδ  `(  ─(  °Θ  α(  ╗)  XΘ   *  8*  ╪Θ  P*  ê*  Pδ  á*  ╪*  `δ  ≡*  (+ Ω  @+  x+  0Ω  É+  ╚+  �Ω  α+  �,  (Ω  0,  h,   Ω  Ç,  ╕,  Hδ  ╨, -  @δ   -  X-  Xδ  p-  ¬-  ≡Θ  └-  ·-  hδ  �.  J.  pδ  `.  Ü.  ╨δ  ░.  Ω.  ╪δ   /  8/  8Ω  P/  ù/ δ  ░/  Φ/  @Ω   0  @0  �δ  P0  è0  ╚δ  á0  ┌0  �Ω  ≡0  *1   Ω  @1  ∩1  HΩ   2  u2  8τ  É2  ß2  @τ   3  23  0τ  @3  K4  pΩ  É4  ╡4  ÿΘ  └4  ▀4  ¿Θ  ≡4  ö5  PΩ  └5  �6  ╝Ω  06  ╛6  Éτ  ≡6  p7  PΘ  É7  «7  xτ  └7  ╤7  ╪Ω  α7  B8  Çτ  `8  h8   τ  p8  }8 τ  Ç8  ┘8  ΦΘ  ≡8  I9   δ  `9  ¼9  ░δ  └9  :  └δ   :  l:  ╕δ  Ç:  │:  8δ  └:  ≤:  (δ   ;  3;  0δ  @;  Ö;  �δ  ░;        <  ¿δ   <  y<  áδ  É<  á<  hτ  ░<  ╔<  pτ  ╨<  ┘<  (τ  α<  -=   τ  @=  ¡=  ÇΘ  ╨=  e?  `Θ  ╨?  =@  êΘ  `@  ¬@  ÉΘ  └@  VA  �τ  ÇA  ╫A  `τ  ≡A  !B  áΘ  0B  @B  ░Θ  PB  ╛B  ╕Θ  αB  ║C  pΘ  ≡C  ?D  �τ  `D  qD  Pτ  ÇD  ╪D  Hτ  ≡D  NE  êτ  pE  ₧E  Xτ   F  6F  ╕∞  6F  VF  └∞  VF  [F  ╪∞  pF  ïF  αδ  ïF  ßF  ⌠δ  ßF  ±F  ∞   G  'G   ∞  'G  AG  0∞  AG  LG  L∞  LG  ÿG  d∞  ÿG  ¥G  |∞  ¥G  ░G  É∞  ░G  #H  ñ∞  ÉH  ╧H  ⌠∞  αH  �I  ∞∞  �I  ╠I  �φ   J  �J  �φ   J  :J  $φ  @J  SJ  Xφ  `J  �L  ,φ  pL  àL  ⁿ∞  áL  «L  �φ  └L  ∙L  φ  �M  �M  `φ  @M  üM  �ε  áM  ∩M  Dε  �N  ÆN  ñφ  ÆN  |O  └φ  |O  ÿO  ▄φ  pP  ₧Q  äφ  ≡Q  �R  ÿε  �R  �R  ¼ε  �R  ¢R  ╠ε  ≡R  \U  pε   V  �W  hφ  ÇW  ΓW  ≡φ   X  ?X ε  �Y  KY  £∩  `Y  áY  ñ∩  ╨Y  ûZ  ö∩  ╨Z  Z[  î∩  É[  ≥[  $∩  �\  =\  d∩  P\  m\  \∩  Ç\  ░\  |∩  └\  ╒\  ä∩  α\  >]  T∩  `]  Ä]  l∩  á]  ╡]  t∩  └]     ^  4∩   ^  �_  D∩  `_  δ_  °ε  �`  ?`  ,∩  P`  Å`  <∩  á`  "a  Φε  Pa  áa  ≡ε  └a  ≤a  αε   b  �c  ¼∩  └c  ╓c  ┤∩  αc  ⌡c  ╝∩  @d  àd  ─∩  ád  ┼d  ╠∩  �e  íf  ⌠∩  �g  ag  ╘∩  Ég  6h  Σ∩  `h  vh  ∞∩  Çh  ≥h  �≡  �i  -i  ≡  -i  Ri  �≡  Ri  ]i  4≡  pi  ìi  H≡  ìi  ▓i  X≡  ▓i  ╜i  p≡  ╨i  Θi  ä≡  ≡i  5k  ╕±  Ék  �l   ±  �l  9l  �±  9l  ]l  0±  ]l  ±m  H±  ±m  ∙m  `±  ∙m  �n  t±  �n  �n  ê±  └n  ┼o  £±  �p  ╝p  î≡  ╝p  Zr  ñ≡  Zr  �t  └≡  �t  {t  ╪≡  {t  æt  ∞≡  └u  ·u  ╘±  �v w  ╠±  `w  üw  α±  Éw  �{  Σ±  ≡{  �|  °±  0|  _|   ≥  p|  Ñ|  8≥  └|  æ}   ≥  ╨}  π}  �≥  ≡}  ï~ ≥  └~  ╬�  �≥   Ç  ▒Ç  (≥  αÇ  Æü  0≥  Pô  Rô  @≥  `ú  âú  (Θ  âú  ╥ú  8Θ  ≡ú  �ñ  HΦ  �ñ  bñ  XΦ  Çñ  úñ  ¼Ω  ░ñ  αñ  Pφ  ≡ñ  �Ñ  <ε   Ñ  @Ñ  hε  PÑ  ìÑ  �∩                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      @·>Ö²�  Ét>Ö²�  ád>Ö²�  Ça>Ö²�  └"@Ö²�  Pa>Ö²�  ╨╖>Ö²�  `eߢ²�  ░!@Ö²�  ╨
?Ö²�  áⁿ?Ö²�  ≡|AÖ²�  Ç?Ö²�   ε>Ö²�  áδ>Ö²�  ≡Θ>Ö²�  @b>Ö²�  └ç▄¢²�  pa>Ö²�   s>Ö²�  └�?Ö²�  ░"@Ö²�  ░┐>Ö²�   φ>Ö²�  ÇΣ>Ö²�  α�?Ö²�                                                                                                                                  ≡�}p²�  @�}p²�  Éñvp²�  α[qp²�  └�wp²�  É;vp²�  p4vp²�   [qp²�  P�qp²�  `₧vp²�  α\qp²�  ≡\qp²�  áqp²�  └Ewp²�  ≡ßqp²�  p�qp²�  ░�qp²�   τpp²�  @�rp²�  └τpp²�                                                                                                                           arà²�  É�qà²�  Ç�qà²�  ░yqà²�  ░Äqà²�  αÄqà²�   Åqà²�  É�qà²�                                                                                                  @ÉS²�  �ÉS²�  ╨ìÅS²�  └nÿS²�   £ÿS²�  p#òS²�  ≡�ÉS²�   �ÉS²�  �₧ÅS²�   âÖS²�  pÉS²�  └�ÉS²�  É�ÉS²�   �ÉS²�  ░öèS²�  0öèS²�  └┤ÅS²�  ≡PùÉS²�  ░ÉS²�   oÅS²�  á╩ôS²�  ╨öæS²�  P<ÄS²�  ÇⁿÄS²�  @�ÉS²�  p�ÉS²�   ₧ÅS²�                                                                                                                                          P&�         Z.� P!� h'�         H/� h"�(�         └1�#�  %�         µ3�   �                         Γ1�     ⌠1�
2�      2�     :2�     P2�     f2�     Ç2�     û2�     ¬2�     ─2�     ╪2�     ⌠2�     �3�     $3�     @3�     T3�     d3�     p3�     |3�     ╥3�     ╛3�     ¼3�     ₧3�     Ä3�     ╬1�                                                                                                                                     �.�     Σ-�     ¿-�     d-�      -�     ▐,�     è,�     L,�     �,�     ╓+�     l+�     �+�     ╞*�     ~*�     <*�     �*�     ·)�     ┌)�     ÿ)�     ║)�                                                                                                                             h.�     á.�     ┬.�     ┌.�     ·.�     �/�     0/�     ~.�                                                                                                     d1�     r1�     ê1�     ö1�     ñ1�     ┤1�     x0�     n0�     R0�     D0�     L1�     40�     &0�     �0�     °/�     ╓/�     ╝/�     ¿/�     ÿ/�     å/�     t/�     d/�     Z/�     01�     �1�     �1�     µ0�     ╓0�     ╞0�     ░0�     <0�     é0�     `0�                                                                                                                                             &�?uncaught_exception@std@@YA_NXZ ═�?good@ios_base@std@@QEBA_NXZ  o�?flags@ios_base@std@@QEBAHXZ  F�?width@ios_base@std@@QEBA_JXZ E�?width@ios_base@std@@QEAA_J_J@Z µ�?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHD@Z  Θ�?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA_JPEBD_J@Z  ═�?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXH_N@Z ��?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBAPEAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ  Å�?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBAPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ  i�?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADXZ  <�?widen@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADD@Z  L�?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAXXZ �??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z  ��??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@_K@Z i�?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@D@Z  p�?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ ~�?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAHXZ ½�?cin@std@@3V?$basic_istream@DU?$char_traits@D@std@@@1@A ╝�?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A  MSVCP140D.dll � __CxxFrameHandler3  ( __telemetry_main_invoke_trigger ) __telemetry_main_return_trigger __C_specific_handler  % __std_type_info_destroy_list  . __vcrt_GetModuleFileNameW / __vcrt_GetModuleHandleW 1 __vcrt_LoadLibraryExW VCRUNTIME140D.dll 0�strlen  � _CrtDbgReport � _CrtDbgReportW  ┬�_seh_filter_exe ┼�_set_app_type [ __setusermatherr  ╢ _configure_narrow_argv  q�_initialize_narrow_environment  =�_get_initial_narrow_environment t�_initterm u�_initterm_e O�exit  Ω _exit ╩�_set_fmode  I __p___argc  J __p___argv  ñ _cexit  ƒ _c_exit ╡�_register_thread_local_exe_atexit_callback  ╡ _configthreadlocale ═�_set_new_mode M __p__commode  h __stdio_common_vsprintf_s ┴�_seh_filter_dll r�_initialize_onexit_table  ┤�_register_onexit_function σ _execute_onexit_table ┬ _crt_atexit ┴ _crt_at_quick_exit  J�terminate ¢�_wmakepath_s  ╖�_wsplitpath_s c�wcscpy_s  ucrtbased.dll }�IsDebuggerPresent _�RaiseException  δ�MultiByteToWideChar ��WideCharToMultiByte I�QueryPerformanceCounter ��GetCurrentProcessId  �GetCurrentThreadId  ∞�GetSystemTimeAsFileTime g�InitializeSListHead ╦�RtlCaptureContext ╥�RtlLookupFunctionEntry  ┘�RtlVirtualUnwind  ┤�UnhandledExceptionFilter  s�SetUnhandledExceptionFilter ╙�GetStartupInfoW ä�IsProcessorFeaturePresent z�GetModuleHandleW  c�GetLastError  J�HeapAlloc N�HeapFree  ╖�GetProcessHeap  ╒�VirtualQuery  »�FreeLibrary ▒�GetProcAddress  ��GetCurrentProcess Æ�TerminateProcess  KERNEL32.dll                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              �   �
   �       E   t       7   �   �                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   7�L{≈�          H�L{≈�                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        � �   �  Ç              � �   0  Ç              �      �  H   pa� }�                                                                                                                                                                                                                                                                                                  <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

Collisions

The hash function collides when using strings "a1" and "aa".

On GCC __PRETTY_FUNCTION__ it's not constexpr

Due topic on GCC code works runtime not compile time, e.g.

static_assert(ctti::type_id() != ctti::type_id("hello"), "compile-time type-id comparison");

yields compile error. Be careful.

Publish to conan-center

I love that this library exists. And since it's header only, it seems like it should be fairly to validate quality and get it into conan-center out of conan-transit.

Bug in unnamed_type_id_t

Lines 146-149 (https://github.com/Manu343726/ctti/blob/master/include/ctti/type_id.hpp#L147) are currently:

            return id_from_name(
                CTTI_TYPE_ID_PRETTY_FUNCTION + CTTI_UNNAMED_TYPE_ID_PRETTY_FUNCTION_BEGIN,
                CTTI_UNNAMED_TYPE_ID_PRETTY_FUNCTION_END - CTTI_UNNAMED_TYPE_ID_PRETTY_FUNCTION_BEGIN - 1
            );

but should be:

            return id_from_name(
                CTTI_UNNAMED_TYPE_ID_PRETTY_FUNCTION + CTTI_UNNAMED_TYPE_ID_PRETTY_FUNCTION_BEGIN,
                CTTI_UNNAMED_TYPE_ID_PRETTY_FUNCTION_END - CTTI_UNNAMED_TYPE_ID_PRETTY_FUNCTION_BEGIN - 1
            );

Note the first macro missing UNNAMED.
So for the moment the hash given by unnamed_type_id() is completely incorrect as instead of hashing e.g. Typename (something), it hashes (example for GCC) ith T = (so. That is, the hashed string starts 8 == strlen("unnamed_") characters to early.

Building example_main in VS2015 causes fatal error C1001: An internal error has occurred in the compiler

It seems to compile and work fine if "template struct TypeNameLength" is commented out in nameof.hpp.

The same code compiles properly with clang 4.0.1.

Complete error message below:

1>------ Build started: Project: example_main, Configuration: Debug x64 ------
1> main.cpp
1>C:\Source\ctti\include\ctti/nameof.hpp(47): fatal error C1001: An internal error has occurred in the compiler.
1> (compiler file 'msc1.cpp', line 1468)
1> To work around this problem, try simplifying or changing the program near the locations listed above.
1> Please choose the Technical Support command on the Visual C++
1> Help menu, or open the Technical Support help file for more information
1> C:\Source\ctti\include\ctti/nameof.hpp(48): note: see reference to class template instantiation 'ctti::detail::TypeNameLength<Enum,std::enable_if<std::is_enum<_Ty>::value,void>::type>' being compiled
1> CTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASHCTIPlugin::InvokeCallback=APPCRASH
2>------ Skipped Build: Project: ALL_BUILD, Configuration: Debug x64 ------
2>Project not selected to build for this solution configuration
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 1 skipped ==========

Is ctti still alive?

Is ctti still alive or is it abandoned? Conan package was deleted for example

Crossplatform naming?

Hi,

Thank you for this piece of code, really instructive.

I'm working on a serialization system that works across platforms. I'm wondering if you have any idea of how the ctti::nameof() can produce the same result on MSVC15 and GCC for instance.

Have a nice day, thanks,

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.