GameApi 28
Library used by GameApi Builder tool
Loading...
Searching...
No Matches
function_call_detail.hpp
Go to the documentation of this file.
1// This file is distributed under the BSD License.
2// See "license.txt" for details.
3// Copyright 2009-2012, Jonathan Turner (jonathan@emptycrate.com)
4// Copyright 2009-2017, Jason Turner (jason@emptycrate.com)
5// http://www.chaiscript.com
6
7// This is an open source non-commercial project. Dear PVS-Studio, please check it.
8// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
9
10
11#ifndef CHAISCRIPT_FUNCTION_CALL_DETAIL_HPP_
12#define CHAISCRIPT_FUNCTION_CALL_DETAIL_HPP_
13
14#include <functional>
15#include <memory>
16#include <string>
17#include <type_traits>
18#include <vector>
19
20#include "boxed_cast.hpp"
21#include "boxed_number.hpp"
22#include "boxed_value.hpp"
23#include "type_conversions.hpp"
24#include "proxy_functions.hpp"
25
26namespace chaiscript
27{
28 namespace dispatch
29 {
30 namespace detail
31 {
34 template<typename Ret, bool is_arithmetic>
36 {
37 static Ret call(const std::vector<Const_Proxy_Function> &t_funcs,
38 const std::vector<Boxed_Value> &params, const Type_Conversions_State *t_conversions)
39 {
40 if (t_conversions != nullptr) {
41 return boxed_cast<Ret>(dispatch::dispatch(t_funcs, params, *t_conversions), t_conversions);
42 } else {
44 Type_Conversions_State state(conv, conv.conversion_saves());
45 return boxed_cast<Ret>(dispatch::dispatch(t_funcs, params, state), t_conversions);
46 }
47 }
48 };
49
53 template<typename Ret>
55 {
56 static Ret call(const std::vector<Const_Proxy_Function> &t_funcs,
57 const std::vector<Boxed_Value> &params, const Type_Conversions_State *t_conversions)
58 {
59 if (t_conversions != nullptr) {
60 return Boxed_Number(dispatch::dispatch(t_funcs, params, *t_conversions)).get_as<Ret>();
61 } else {
63 Type_Conversions_State state(conv, conv.conversion_saves());
64 return Boxed_Number(dispatch::dispatch(t_funcs, params, state)).get_as<Ret>();
65 }
66 }
67 };
68
69
73 template<>
74 struct Function_Caller_Ret<void, false>
75 {
76 static void call(const std::vector<Const_Proxy_Function> &t_funcs,
77 const std::vector<Boxed_Value> &params, const Type_Conversions_State *t_conversions)
78 {
79 if (t_conversions != nullptr) {
80 dispatch::dispatch(t_funcs, params, *t_conversions);
81 } else {
83 Type_Conversions_State state(conv, conv.conversion_saves());
84 dispatch::dispatch(t_funcs, params, state);
85 }
86 }
87 };
88
92 template<typename Ret, typename ... Param>
94 {
95 Build_Function_Caller_Helper(std::vector<Const_Proxy_Function> t_funcs, const Type_Conversions *t_conversions)
96 : m_funcs(std::move(t_funcs)),
97 m_conversions(t_conversions)
98 {
99 }
100
101 template<typename ... P>
102 Ret operator()(P&& ... param)
103 {
104 if (m_conversions) {
105 Type_Conversions_State state(*m_conversions, m_conversions->conversion_saves());
106 return Function_Caller_Ret<Ret, std::is_arithmetic<Ret>::value && !std::is_same<Ret, bool>::value>::call(m_funcs, {
107 box<P>(std::forward<P>(param))...
108 }, &state
109 );
110 } else {
111 return Function_Caller_Ret<Ret, std::is_arithmetic<Ret>::value && !std::is_same<Ret, bool>::value>::call(m_funcs, {
112 box<P>(std::forward<P>(param))...
113 }, nullptr
114 );
115 }
116
117 }
118
119 template<typename P, typename Q>
120 static auto box(Q&& q) -> typename std::enable_if<std::is_reference<P>::value&&!std::is_same<chaiscript::Boxed_Value, typename std::remove_const<typename std::remove_reference<P>::type>::type>::value, Boxed_Value>::type
121 {
122 return Boxed_Value(std::ref(std::forward<Q>(q)));
123 }
124
125 template<typename P, typename Q>
126 static auto box(Q&& q) -> typename std::enable_if<!std::is_reference<P>::value&&!std::is_same<chaiscript::Boxed_Value, typename std::remove_const<typename std::remove_reference<P>::type>::type>::value, Boxed_Value>::type
127 {
128 return Boxed_Value(std::forward<Q>(q));
129 }
130
131 template<typename P>
133 {
134 return bv;
135 }
136
137
138 std::vector<Const_Proxy_Function> m_funcs;
140 };
141
142
143
145 template<typename Ret, typename ... Params>
146 std::function<Ret (Params...)> build_function_caller_helper(Ret (Params...), const std::vector<Const_Proxy_Function> &funcs, const Type_Conversions_State *t_conversions)
147 {
148 /*
149 if (funcs.size() == 1)
150 {
151 std::shared_ptr<const Proxy_Function_Impl<Ret (Params...)>> pfi =
152 std::dynamic_pointer_cast<const Proxy_Function_Impl<Ret (Params...)> >
153 (funcs[0]);
154
155 if (pfi)
156 {
157 return pfi->internal_function();
158 }
159 // looks like this either wasn't a Proxy_Function_Impl or the types didn't match
160 // we cannot make any other guesses or assumptions really, so continuing
161 }
162*/
163
164 return std::function<Ret (Params...)>(Build_Function_Caller_Helper<Ret, Params...>(funcs, t_conversions?t_conversions->get():nullptr));
165 }
166 }
167 }
168}
169
170#endif
171
Object call(Vector t_params) const
Calls the function with the given set of parameters and returns the value;.
Represents any numeric type, generically. Used internally for generic operations between POD values.
Definition boxed_number.hpp:66
Boxed_Number get_as(const Type_Info &inp_) const
Definition boxed_number.hpp:543
A wrapper for holding any valid C++ type. All types in ChaiScript are Boxed_Value objects.
Definition boxed_value.hpp:28
Definition type_conversions.hpp:512
Definition type_conversions.hpp:321
Conversion_Saves & conversion_saves() const
Definition type_conversions.hpp:466
Definition callable_traits.hpp:14
std::function< Ret(Params...)> build_function_caller_helper(Ret(Params...), const std::vector< Const_Proxy_Function > &funcs, const Type_Conversions_State *t_conversions)
Definition function_call_detail.hpp:146
Classes and functions specific to the runtime dispatch side of ChaiScript. Some items may be of use t...
Definition callable_traits.hpp:13
Boxed_Value dispatch(const Funcs &funcs, const std::vector< Boxed_Value > &plist, const Type_Conversions_State &t_conversions)
Definition proxy_functions.hpp:936
Namespace chaiscript contains every API call that the average user will be concerned with.
decltype(auto) boxed_cast(const Boxed_Value &bv, const Type_Conversions_State *t_conversions=nullptr)
Function for extracting a value stored in a Boxed_Value object.
Definition boxed_cast.hpp:76
STL namespace.
Definition GameApi.h:23
Definition GameApi.h:70
Definition GameApi_bm.cc:4579
const Type_Conversions * m_conversions
Definition function_call_detail.hpp:139
static Boxed_Value box(Boxed_Value bv)
Definition function_call_detail.hpp:132
Build_Function_Caller_Helper(std::vector< Const_Proxy_Function > t_funcs, const Type_Conversions *t_conversions)
Definition function_call_detail.hpp:95
static auto box(Q &&q) -> typename std::enable_if<!std::is_reference< P >::value &&!std::is_same< chaiscript::Boxed_Value, typename std::remove_const< typename std::remove_reference< P >::type >::type >::value, Boxed_Value >::type
Definition function_call_detail.hpp:126
Ret operator()(P &&... param)
Definition function_call_detail.hpp:102
static auto box(Q &&q) -> typename std::enable_if< std::is_reference< P >::value &&!std::is_same< chaiscript::Boxed_Value, typename std::remove_const< typename std::remove_reference< P >::type >::type >::value, Boxed_Value >::type
Definition function_call_detail.hpp:120
std::vector< Const_Proxy_Function > m_funcs
Definition function_call_detail.hpp:138
static Ret call(const std::vector< Const_Proxy_Function > &t_funcs, const std::vector< Boxed_Value > &params, const Type_Conversions_State *t_conversions)
Definition function_call_detail.hpp:56
static void call(const std::vector< Const_Proxy_Function > &t_funcs, const std::vector< Boxed_Value > &params, const Type_Conversions_State *t_conversions)
Definition function_call_detail.hpp:76
Definition function_call_detail.hpp:36
static Ret call(const std::vector< Const_Proxy_Function > &t_funcs, const std::vector< Boxed_Value > &params, const Type_Conversions_State *t_conversions)
Definition function_call_detail.hpp:37