remotemono
RMonoAPIFunction_Def.h
1 /*
2  Copyright 2020 David "Alemarius Nexus" Lerch
3 
4  This file is part of RemoteMono.
5 
6  RemoteMono is free software: you can redistribute it and/or modify
7  it under the terms of the GNU Lesser General Public License as published
8  by the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  RemoteMono is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU Lesser General Public License for more details.
15 
16  You should have received a copy of the GNU Lesser General Public License
17  along with RemoteMono. If not, see <https://www.gnu.org/licenses/>.
18  */
19 
20 #pragma once
21 
22 #include "../config.h"
23 
24 #include <string>
25 #include "RMonoAPIFunctionTypeAdapters.h"
26 #include "RMonoAPIFunctionSimple_Def.h"
27 #include "RMonoAPIFunctionRaw_Def.h"
28 #include "RMonoAPIFunctionWrap_Def.h"
29 #include "RMonoAPIFunctionAPI_Def.h"
30 #include "RMonoAPIBase_Def.h"
31 
32 
33 
34 namespace remotemono
35 {
36 
37 
38 
39 
40 
50 template <typename ABI, bool required, typename RetT, typename... ArgsT>
52  public RMonoAPIFunctionRaw<RMonoAPIFunctionBase<ABI, required, RetT, ArgsT...>, ABI, RetT, ArgsT...>,
53  public RMonoAPIFunctionWrap<RMonoAPIFunctionBase<ABI, required, RetT, ArgsT...>, ABI, RetT, ArgsT...>,
54  public RMonoAPIFunctionAPI<RMonoAPIFunctionBase<ABI, required, RetT, ArgsT...>, ABI, RetT, ArgsT...>
55 {
56 public:
57  typedef RMonoAPIFunctionBase<ABI, required, RetT, ArgsT...> Self;
58 
59  typedef RetT DefRetType;
60  typedef std::tuple<ArgsT...> DefArgsTuple;
61 
62 public:
63  constexpr static bool isRequired()
64  {
65  return required;
66  }
67 
68 public:
69  RMonoAPIFunctionBase() : abi(nullptr), mono(nullptr) {}
70 
74  void reset()
75  {
76  resetRaw();
77  resetWrap();
78  resetAPI();
79 
80  abi = nullptr;
81  mono = nullptr;
82  name.clear();
83  }
84 
93  void init(ABI* abi, RMonoAPIBase* mono, const std::string& name, blackbone::ptr_t rawFuncAddr)
94  {
95  this->abi = abi;
96  this->mono = mono;
97  this->name = name;
98  this->initRaw(rawFuncAddr);
99  }
100 
106  void initInvalid(const std::string& name)
107  {
108  this->name = name;
109  }
110 
117  asmjit::Label compile(blackbone::IAsmHelper& a)
118  {
119  return this->compileWrap(a);
120  }
121 
128  void link(blackbone::ptr_t wrapFuncAddr)
129  {
130  this->linkWrap(wrapFuncAddr);
131  }
132 
136  void debugDumpSignatures();
137 
141  ABI* getABI() { return abi; }
142 
146  RMonoAPIBase* getRemoteMonoAPI() { return mono; }
147 
151  std::string getName() const { return name; }
152 
156  operator bool() const { return (bool) rawFunc; }
157 
158 private:
159  template <typename ArgsTupleT, size_t argIdx>
160  void debugDumpSignaturesArgRecurse(std::string& sigStr);
161 
162 private:
163  ABI* abi;
164  RMonoAPIBase* mono;
165  std::string name;
166 };
167 
168 
169 
170 
171 
172 // These methods can be used to access types defined in the component classes without the umbrella class having been fully defined yet.
173 
174 template <typename ABI, bool required, typename RetT, typename... ArgsT>
175 struct RMonoAPIFunctionCommonTraits<RMonoAPIFunctionBase<ABI, required, RetT, ArgsT...>>
176 {
177  typedef RetT DefRetType;
178  typedef std::tuple<ArgsT...> DefArgsTuple;
179 };
180 
181 template <typename ABI, bool required, typename RetT, typename... ArgsT>
182 struct RMonoAPIFunctionRawTraits<RMonoAPIFunctionBase<ABI, required, RetT, ArgsT...>>
183 {
184  typedef RMonoAPIFunctionBase<ABI, required, RetT, ArgsT...> CommonType;
185 
186  typedef RMonoAPIFunctionRaw<CommonType, ABI, RetT, ArgsT...> RawComponent;
187 
188  typedef typename RawComponent::RawRetType RawRetType;
189  typedef typename RawComponent::RawArgsTuple RawArgsTuple;
190 };
191 
192 template <typename ABI, bool required, typename RetT, typename... ArgsT>
193 struct RMonoAPIFunctionWrapTraits<RMonoAPIFunctionBase<ABI, required, RetT, ArgsT...>>
194 {
195  typedef RMonoAPIFunctionBase<ABI, required, RetT, ArgsT...> CommonType;
196 
197  typedef RMonoAPIFunctionWrap<CommonType, ABI, RetT, ArgsT...> WrapComponent;
198 
199  typedef typename WrapComponent::WrapRetType WrapRetType;
200  typedef typename WrapComponent::WrapArgsTuple WrapArgsTuple;
201 };
202 
203 template <typename ABI, bool required, typename RetT, typename... ArgsT>
204 struct RMonoAPIFunctionAPITraits<RMonoAPIFunctionBase<ABI, required, RetT, ArgsT...>>
205 {
206  typedef RMonoAPIFunctionBase<ABI, required, RetT, ArgsT...> CommonType;
207 
208  typedef RMonoAPIFunctionAPI<CommonType, ABI, RetT, ArgsT...> APIComponent;
209 
210  typedef typename APIComponent::APIRetType APIRetType;
211  typedef typename APIComponent::APIArgsTuple APIArgsTuple;
212 };
213 
214 
215 
216 
217 
218 
222 template <typename ABI, bool required, typename RetT, typename... ArgsT>
224  ABI,
225  required,
226  typename tags::ReturnNull<RetT>,
227  typename tags::ParamNull<ArgsT>...
228  > {};
229 
230 
236 template <typename ABI, bool required, typename RetT, typename... ArgsT>
237 using RMonoAPIFunction = RMonoAPIFunctionAutoAddNullTags<ABI, required, RetT, ArgsT...>;
238 
239 
240 
241 }
242 
243 
244 
245 
remotemono::RMonoAPIFunctionCommonTraits
Definition: RMonoAPIFunctionTypeAdapters.h:120
remotemono::RMonoAPIFunctionWrapTraits
Definition: RMonoAPIFunctionTypeAdapters.h:126
remotemono::RMonoAPIBase
Definition: RMonoAPIBase_Def.h:43
remotemono::RMonoAPIFunctionAPI
Definition: RMonoAPIFunctionAPI_Def.h:167
remotemono::RMonoAPIFunctionBase::getABI
ABI * getABI()
Definition: RMonoAPIFunction_Def.h:141
remotemono::RMonoAPIFunctionBase::link
void link(blackbone::ptr_t wrapFuncAddr)
Definition: RMonoAPIFunction_Def.h:128
remotemono::RMonoAPIFunctionWrap
Definition: RMonoAPIFunctionWrap_Def.h:184
remotemono::RMonoAPIFunctionAPITraits
Definition: RMonoAPIFunctionTypeAdapters.h:129
remotemono::RMonoAPIFunctionBase::getName
std::string getName() const
Definition: RMonoAPIFunction_Def.h:151
remotemono::RMonoAPIFunctionBase::initInvalid
void initInvalid(const std::string &name)
Definition: RMonoAPIFunction_Def.h:106
remotemono::RMonoAPIFunctionBase::debugDumpSignatures
void debugDumpSignatures()
Definition: RMonoAPIFunction_Impl.h:38
remotemono::RMonoAPIFunctionBase::init
void init(ABI *abi, RMonoAPIBase *mono, const std::string &name, blackbone::ptr_t rawFuncAddr)
Definition: RMonoAPIFunction_Def.h:93
remotemono::RMonoAPIFunctionBase::getRemoteMonoAPI
RMonoAPIBase * getRemoteMonoAPI()
Definition: RMonoAPIFunction_Def.h:146
remotemono::RMonoAPIFunctionAutoAddNullTags
Definition: RMonoAPIFunction_Def.h:228
remotemono::RMonoAPIFunctionBase
Definition: RMonoAPIFunction_Def.h:55
remotemono::RMonoAPIFunctionBase::reset
void reset()
Definition: RMonoAPIFunction_Def.h:74
remotemono::RMonoAPIFunctionRawTraits
Definition: RMonoAPIFunctionTypeAdapters.h:123
remotemono::RMonoAPIFunctionRaw
Definition: RMonoAPIFunctionRaw_Def.h:124
remotemono::RMonoAPIFunctionBase::compile
asmjit::Label compile(blackbone::IAsmHelper &a)
Definition: RMonoAPIFunction_Def.h:117