3#ifndef ICE_DEFAULT_SLICE_LOADER_H
4#define ICE_DEFAULT_SLICE_LOADER_H
6#include "SliceLoader.h"
7#include "UserException.h"
16 class DefaultSliceLoader;
17 using DefaultSliceLoaderPtr = std::shared_ptr<DefaultSliceLoader>;
20 class ICE_API DefaultSliceLoader final :
public Ice::SliceLoader
25 static DefaultSliceLoaderPtr instance();
27 ~DefaultSliceLoader() final;
29 [[nodiscard]] Ice::ValuePtr newClassInstance(std::string_view typeId) const final;
30 [[nodiscard]] std::exception_ptr newExceptionInstance(std::string_view typeId) const final;
32 template<class T, std::enable_if_t<std::is_base_of_v<Ice::Value, T>,
bool> = true>
void addClass(
int compactId)
34 std::lock_guard lock{_mutex};
35 auto p = _classFactories.find(T::ice_staticId());
36 if (p == _classFactories.end())
38 _classFactories[T::ice_staticId()] = {[] { return std::make_shared<T>(); }, 1};
47 std::string compactIdStr{std::to_string(compactId)};
48 p = _classFactories.find(compactIdStr);
49 if (p == _classFactories.end())
51 _classFactories[compactIdStr] = {[] {
return std::make_shared<T>(); }, 1};
60 void removeClass(std::string_view typeId,
int compactId)
62 std::lock_guard lock{_mutex};
63 auto p = _classFactories.find(typeId);
64 if (p != _classFactories.end())
66 if (--p->second.second == 0)
68 _classFactories.erase(p);
74 std::string compactIdStr{std::to_string(compactId)};
75 p = _classFactories.find(compactIdStr);
76 if (p != _classFactories.end())
78 if (--p->second.second == 0)
80 _classFactories.erase(p);
86 template<
class T, std::enable_if_t<std::is_base_of_v<Ice::UserException, T>,
bool> = true>
void addException()
88 std::lock_guard lock{_mutex};
89 auto p = _exceptionFactories.find(T::ice_staticId());
90 if (p == _exceptionFactories.end())
92 _exceptionFactories[T::ice_staticId()] = {[] {
return std::make_exception_ptr(T{}); }, 1};
100 void removeException(std::string_view typeId)
102 std::lock_guard lock{_mutex};
103 auto p = _exceptionFactories.find(typeId);
104 if (p != _exceptionFactories.end())
106 if (--p->second.second == 0)
108 _exceptionFactories.erase(p);
115 using ExceptionFactory = std::function<std::exception_ptr()>;
117 DefaultSliceLoader() =
default;
119 mutable std::mutex _mutex;
121 std::map<std::string, std::pair<ClassFactory, int>, std::less<>> _classFactories;
122 std::map<std::string, std::pair<ExceptionFactory, int>, std::less<>> _exceptionFactories;
125 template<
class T>
class ClassInit
128 explicit ClassInit(
int compactId = -1) noexcept : _typeId(T::ice_staticId()), _compactId(compactId)
130 DefaultSliceLoader::instance()->addClass<T>(compactId);
133 ~ClassInit() { DefaultSliceLoader::instance()->removeClass(_typeId, _compactId); }
140 template<
class T>
class ExceptionInit
143 ExceptionInit() noexcept : _typeId(T::ice_staticId()) { DefaultSliceLoader::instance()->addException<T>(); }
144 ~ExceptionInit() { DefaultSliceLoader::instance()->removeException(_typeId); }
std::shared_ptr< Value > ValuePtr
A shared pointer to a Value.