3#ifndef ICE_DEFAULT_SLICE_LOADER_H
4#define ICE_DEFAULT_SLICE_LOADER_H
6#include "SliceLoader.h"
7#include "UserException.h"
16# pragma warning(disable : 4251)
21 class DefaultSliceLoader;
22 using DefaultSliceLoaderPtr = std::shared_ptr<DefaultSliceLoader>;
25 class ICE_API DefaultSliceLoader final :
public Ice::SliceLoader
30 static DefaultSliceLoaderPtr instance();
32 ~DefaultSliceLoader() final;
34 [[nodiscard]] Ice::ValuePtr newClassInstance(std::string_view typeId) const final;
35 [[nodiscard]] std::exception_ptr newExceptionInstance(std::string_view typeId) const final;
37 template<class T, std::enable_if_t<std::is_base_of_v<Ice::Value, T>,
bool> = true>
void addClass(
int compactId)
39 std::lock_guard lock{_mutex};
40 auto p = _classFactories.find(T::ice_staticId());
41 if (p == _classFactories.end())
43 _classFactories[T::ice_staticId()] = {[] { return std::make_shared<T>(); }, 1};
52 std::string compactIdStr{std::to_string(compactId)};
53 p = _classFactories.find(compactIdStr);
54 if (p == _classFactories.end())
56 _classFactories[compactIdStr] = {[] {
return std::make_shared<T>(); }, 1};
65 void removeClass(std::string_view typeId,
int compactId)
67 std::lock_guard lock{_mutex};
68 auto p = _classFactories.find(typeId);
69 if (p != _classFactories.end())
71 if (--p->second.second == 0)
73 _classFactories.erase(p);
79 std::string compactIdStr{std::to_string(compactId)};
80 p = _classFactories.find(compactIdStr);
81 if (p != _classFactories.end())
83 if (--p->second.second == 0)
85 _classFactories.erase(p);
91 template<
class T, std::enable_if_t<std::is_base_of_v<Ice::UserException, T>,
bool> = true>
void addException()
93 std::lock_guard lock{_mutex};
94 auto p = _exceptionFactories.find(T::ice_staticId());
95 if (p == _exceptionFactories.end())
97 _exceptionFactories[T::ice_staticId()] = {[] {
return std::make_exception_ptr(T{}); }, 1};
105 void removeException(std::string_view typeId)
107 std::lock_guard lock{_mutex};
108 auto p = _exceptionFactories.find(typeId);
109 if (p != _exceptionFactories.end())
111 if (--p->second.second == 0)
113 _exceptionFactories.erase(p);
120 using ExceptionFactory = std::function<std::exception_ptr()>;
122 DefaultSliceLoader() =
default;
124 mutable std::mutex _mutex;
126 std::map<std::string, std::pair<ClassFactory, int>, std::less<>> _classFactories;
127 std::map<std::string, std::pair<ExceptionFactory, int>, std::less<>> _exceptionFactories;
130 template<
class T>
class ClassInit
133 explicit ClassInit(
int compactId = -1) noexcept : _typeId(T::ice_staticId()), _compactId(compactId)
135 DefaultSliceLoader::instance()->addClass<T>(compactId);
138 ~ClassInit() { DefaultSliceLoader::instance()->removeClass(_typeId, _compactId); }
145 template<
class T>
class ExceptionInit
148 ExceptionInit() noexcept : _typeId(T::ice_staticId()) { DefaultSliceLoader::instance()->addException<T>(); }
149 ~ExceptionInit() { DefaultSliceLoader::instance()->removeException(_typeId); }
std::shared_ptr< Value > ValuePtr
A shared pointer to a Value.