Repository navigation
Expand file tree
/
Copy pathmethod_info.hpp
More file actions
180 lines (139 loc) · 6.43 KB
/
Copy pathmethod_info.hpp
File metadata and controls
180 lines (139 loc) · 6.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
/*
Copyright (C) 2015-present The DotCpp Authors.
This file is part of .C++, a native C++ implementation of
popular .NET class library APIs developed to facilitate
code reuse between C# and C++.
http://github.com/dotcpp/dotcpp (source)
http://dotcpp.org (documentation)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#pragma once
#include <dot/system/reflection/member_info.hpp>
#include <dot/system/reflection/parameter_info.hpp>
#include <dot/system/exception.hpp>
#include <dot/detail/traits.hpp>
namespace dot
{
class method_info_impl; using method_info = ptr<method_info_impl>;
class type_impl; using type = ptr<type_impl>;
/// Obtains information about the attributes of a method and provides access to method metadata.
class method_info_impl : public member_info_impl
{
friend class type_builder_impl;
typedef method_info_impl self;
public: // METHODS
/// A string representing the name of the current type.
virtual string to_string() override { return "MethodInfo"; }
/// Gets the parameters of this method.
virtual list<parameter_info> GetParameters()
{
return parameters;
}
/// Invokes specified method with given parameters.
virtual object invoke(object, list<object>) = 0;
/// Gets the return type of this method.
type return_type; // TODO - convert to method
protected: // FIELDS
list<parameter_info> parameters;
protected: // CONSTRUCTORS
/// Create from method name, declaring type, return type.
///
/// This constructor is protected. It is used by derived classes only.
method_info_impl(const string& name, type declaring_type, type return_type)
: member_info_impl(name, declaring_type)
{
this->return_type = return_type;
}
};
/// Obtains information about the attributes of a non-static method and provides access to method metadata.
template <class class_, class return_t, class ... args>
class member_method_info_impl : public method_info_impl
{
friend class type_builder_impl;
typedef return_t (class_::*method_type)(args...);
private: // FIELDS
/// C++ function pointer type for the method.
method_type ptr_;
public: // METHODS
/// A string representing the name of the current type.
virtual string to_string() override { return "MemberMethodInfo"; }
/// Invokes the method reflected by this method_info instance.
template <int ... I>
object invoke_impl(object obj, list<object> params, detail::index_sequence<I...>, std::false_type)
{
return ((*ptr<class_>(obj)).*ptr_)(params[I]...);
}
/// Invokes the method reflected by this method_info instance.
template <int ... I>
object invoke_impl(object obj, list<object> params, detail::index_sequence<I...>, std::true_type)
{
((*ptr<class_>(obj)).*ptr_)(params[I]...);
return object();
}
/// Invokes the method reflected by this MethodInfo instance.
virtual object invoke(object obj, list<object> params)
{
if (params->count() != parameters->count())
throw exception("Wrong number of parameters for method " + this->declaring_type->name + "." + this->name);
return invoke_impl(obj, params, typename detail::make_index_sequence<sizeof...(args)>::index_type(), typename std::is_same<return_t, void>::type());
}
private: // CONSTRUCTORS
/// Create from method name, declaring type, return type, and pointer to method.
///
/// This constructor is private. Use make_MethodInfo(...)
/// function with matching signature instead.
member_method_info_impl(const string& name, type declaring_type, type return_type, method_type p)
: method_info_impl(name, declaring_type, return_type)
, ptr_(p)
{}
};
/// Obtains information about the attributes of a static method and provides access to method metadata.
template <class return_t, class ... args>
class static_method_info_impl : public method_info_impl
{
friend class type_builder_impl;
typedef return_t (*method_type)(args...);
private: // FIELDS
method_type ptr_;
public: // METHODS
/// A string representing the name of the current type.
virtual string to_string() override { return "StaticMethodInfo"; }
/// Invokes the method reflected by this MethodInfo instance.
template <int ... I>
object invoke_impl(object obj, list<object> params, detail::index_sequence<I...>, std::false_type)
{
return (*ptr_)(params[I]...);
}
/// Invokes the method reflected by this MethodInfo instance.
template <int ... I>
object invoke_impl(object obj, list<object> params, detail::index_sequence<I...>, std::true_type)
{
(*ptr_)(params[I]...);
return object();
}
/// Invokes the method reflected by this MethodInfo instance.
virtual object invoke(object obj, list<object> params)
{
if (params->count() != parameters->count())
throw exception("Wrong number of parameters for method " + this->declaring_type->name + "." + this->name);
return invoke_impl(obj, params, typename detail::make_index_sequence<sizeof...(args)>::index_type(), typename std::is_same<return_t, void>::type());
}
private: // CONSTRUCTORS
/// Create from method name, declaring type, return type, and pointer to method.
///
/// This constructor is private. Use make_MethodInfo(...)
/// function with matching signature instead.
static_method_info_impl(const string& name, type declaring_type, type return_type, method_type p)
: method_info_impl(name, declaring_type, return_type)
, ptr_(p)
{}
};
}