|
|
|
@ -142,7 +142,8 @@ template <typename Self> |
|
|
|
class ServiceFramework : public ServiceFrameworkBase { |
|
|
|
protected: |
|
|
|
/// Contains information about a request type which is handled by the service. |
|
|
|
struct FunctionInfo : FunctionInfoBase { |
|
|
|
template <typename T> |
|
|
|
struct FunctionInfoTyped : FunctionInfoBase { |
|
|
|
// TODO(yuriks): This function could be constexpr, but clang is the only compiler that |
|
|
|
// doesn't emit an ICE or a wrong diagnostic because of the static_cast. |
|
|
|
|
|
|
|
@ -155,12 +156,13 @@ protected: |
|
|
|
* the request |
|
|
|
* @param name_ human-friendly name for the request. Used mostly for logging purposes. |
|
|
|
*/ |
|
|
|
FunctionInfo(u32 expected_header_, HandlerFnP<Self> handler_callback_, const char* name_) |
|
|
|
FunctionInfoTyped(u32 expected_header_, HandlerFnP<T> handler_callback_, const char* name_) |
|
|
|
: FunctionInfoBase{ |
|
|
|
expected_header_, |
|
|
|
// Type-erase member function pointer by casting it down to the base class. |
|
|
|
static_cast<HandlerFnP<ServiceFrameworkBase>>(handler_callback_), name_} {} |
|
|
|
}; |
|
|
|
using FunctionInfo = FunctionInfoTyped<Self>; |
|
|
|
|
|
|
|
/** |
|
|
|
* Initializes the handler with no functions installed. |
|
|
|
@ -175,8 +177,8 @@ protected: |
|
|
|
: ServiceFrameworkBase(system_, service_name_, max_sessions_, Invoker) {} |
|
|
|
|
|
|
|
/// Registers handlers in the service. |
|
|
|
template <std::size_t N> |
|
|
|
void RegisterHandlers(const FunctionInfo (&functions)[N]) { |
|
|
|
template <typename T = Self, std::size_t N> |
|
|
|
void RegisterHandlers(const FunctionInfoTyped<T> (&functions)[N]) { |
|
|
|
RegisterHandlers(functions, N); |
|
|
|
} |
|
|
|
|
|
|
|
@ -184,13 +186,14 @@ protected: |
|
|
|
* Registers handlers in the service. Usually prefer using the other RegisterHandlers |
|
|
|
* overload in order to avoid needing to specify the array size. |
|
|
|
*/ |
|
|
|
void RegisterHandlers(const FunctionInfo* functions, std::size_t n) { |
|
|
|
template <typename T = Self> |
|
|
|
void RegisterHandlers(const FunctionInfoTyped<T>* functions, std::size_t n) { |
|
|
|
RegisterHandlersBase(functions, n); |
|
|
|
} |
|
|
|
|
|
|
|
/// Registers handlers in the service. |
|
|
|
template <std::size_t N> |
|
|
|
void RegisterHandlersTipc(const FunctionInfo (&functions)[N]) { |
|
|
|
template <typename T = Self, std::size_t N> |
|
|
|
void RegisterHandlersTipc(const FunctionInfoTyped<T> (&functions)[N]) { |
|
|
|
RegisterHandlersTipc(functions, N); |
|
|
|
} |
|
|
|
|
|
|
|
@ -198,7 +201,8 @@ protected: |
|
|
|
* Registers handlers in the service. Usually prefer using the other RegisterHandlers |
|
|
|
* overload in order to avoid needing to specify the array size. |
|
|
|
*/ |
|
|
|
void RegisterHandlersTipc(const FunctionInfo* functions, std::size_t n) { |
|
|
|
template <typename T = Self> |
|
|
|
void RegisterHandlersTipc(const FunctionInfoTyped<T>* functions, std::size_t n) { |
|
|
|
RegisterHandlersBaseTipc(functions, n); |
|
|
|
} |
|
|
|
|
|
|
|
|