-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathunique_class_id.hpp
More file actions
52 lines (44 loc) · 1.56 KB
/
Copy pathunique_class_id.hpp
File metadata and controls
52 lines (44 loc) · 1.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#pragma once
#ifndef _UNIQUE_CLASS_ID_HPP_INCLUDED
#define _UNIQUE_CLASS_ID_HPP_INCLUDED
#include <typeinfo>
#include <cstdint>
namespace unique_class_id {
using class_id_t = std::uint32_t;
namespace detail {
class_id_t djb2_hash(const char *str) {
std::uint32_t hash = 5381;
int c = 0;
while ((c = *str++)) {
hash = ((hash << 5) + hash) + c;
}
return static_cast<class_id_t>(hash);
}
}
template<class T>
class_id_t get_class_id() {
static const class_id_t id = detail::djb2_hash(typeid(T).name());
return id;
}
template<class T1, class T2>
bool is_same_class(T2 *second) {
static const class_id_t id1 = get_class_id<T1>();
class_id_t id2 = second->id();
return id1 == id2;
}
}
#define DEFINE_UNIQUE_CLASS_ID(T) \
public: \
virtual unique_class_id::class_id_t id() const { \
static const unique_class_id::class_id_t id = \
unique_class_id::get_class_id<T>(); \
return id; \
}
#define DEFINE_FINAL_UNIQUE_CLASS_ID(T) \
public: \
unique_class_id::class_id_t id() const override final { \
static const unique_class_id::class_id_t id = \
unique_class_id::get_class_id<T>(); \
return id; \
}
#endif // _UNIQUE_CLASS_ID_HPP_INCLUDED