LeviLamina
Loading...
Searching...
No Matches
ServiceId.h
1#pragma once
2
3#include "ll/api/reflection/Reflection.h"
4#include "ll/api/utils/HashUtils.h"
5
6namespace ll::service {
7
8template <class T>
9struct auto_name_t {};
10
11class ServiceIdView;
12class ServiceId : public hash_utils::HashedIdBase {
13public:
14 size_t version;
15 std::string name;
16
17 [[nodiscard]] constexpr explicit ServiceId(std::string_view id, size_t ver) noexcept
18 : HashedIdBase(hash_utils::HashCombiner{hash_utils::doHash(id)}.add(ver)),
19 name(id),
20 version(ver) {}
21
22 [[nodiscard]] constexpr ServiceId(ServiceIdView const& id) noexcept;
23};
24class ServiceIdView : public hash_utils::HashedIdBase {
25public:
26 size_t version;
27 std::string_view name;
28
29 [[nodiscard]] constexpr explicit ServiceIdView(std::string_view id, size_t ver) noexcept
30 : HashedIdBase(hash_utils::HashCombiner{hash_utils::doHash(id)}.add(ver)),
31 name(id),
32 version(ver) {}
33 [[nodiscard]] constexpr ServiceIdView(ServiceId const& id) noexcept
34 : HashedIdBase(id.hash),
35 name(id.name),
36 version(id.version) {}
37
38 template <class T>
39 [[nodiscard]] constexpr ServiceIdView(auto_name_t<T>, size_t version) noexcept
40 : ServiceIdView{ll::reflection::type_unprefix_name_v<T>, version} {}
41};
42[[nodiscard]] constexpr ServiceId::ServiceId(ServiceIdView const& id) noexcept
43: HashedIdBase(id.hash),
44 name(id.name),
45 version(id.version) {}
46
47constexpr ServiceIdView EmptyServiceId{{}, 0};
48
49template <class T>
50constexpr ServiceIdView getServiceId = []() -> ServiceIdView {
51 using self = std::remove_cvref_t<T>;
52 if constexpr (requires { self::ServiceId; } && self::ServiceId != EmptyServiceId) {
53 return self::ServiceId;
54 } else {
55 static_assert(traits::always_false<T>, "ServiceId not defined for type");
56 }
57}();
58} // namespace ll::service
Definition ServiceId.h:24
Definition ServiceId.h:12
Definition ServiceId.h:9