11#ifndef CHAISCRIPT_DISPATCHKIT_HPP_
12#define CHAISCRIPT_DISPATCHKIT_HPP_
48class Dynamic_Proxy_Function;
49class Proxy_Function_Base;
50struct Placeholder_Object;
68 : std::runtime_error(
"Reserved word not allowed in object name: " + t_word), m_word(t_word)
90 : std::runtime_error(
"Reserved name not allowed in object name: " + t_name), m_name(t_name)
113 : std::runtime_error(
"Name already exists in current context " + t_name), m_name(t_name)
137 :
std::runtime_error(
"a global object must be const")
154 m_typeinfos.emplace_back(ti, std::move(
name));
160 m_conversions.push_back(std::move(
d));
166 m_funcs.emplace_back(std::move(
f), std::move(
name));
177 m_globals.emplace_back(std::move(t_bv), std::move(t_name));
185 m_evals.push_back(
str);
189 template<
typename Eval,
typename Engine>
190 void apply(Eval &t_eval, Engine &t_engine)
const
192 apply(m_typeinfos.begin(), m_typeinfos.end(), t_engine);
193 apply(m_funcs.begin(), m_funcs.end(), t_engine);
194 apply_eval(m_evals.begin(), m_evals.end(), t_eval);
195 apply_single(m_conversions.begin(), m_conversions.end(), t_engine);
196 apply_globals(m_globals.begin(), m_globals.end(), t_engine);
201 return std::any_of(m_funcs.begin(), m_funcs.end(),
202 [&](
const std::pair<Proxy_Function, std::string> &existing_f) {
203 return existing_f.second == name && *(existing_f.first) == *(new_f);
210 std::vector<std::pair<Type_Info, std::string>> m_typeinfos;
211 std::vector<std::pair<Proxy_Function, std::string>> m_funcs;
212 std::vector<std::pair<Boxed_Value, std::string>> m_globals;
213 std::vector<std::string> m_evals;
214 std::vector<Type_Conversion> m_conversions;
216 template<
typename T,
typename InItr>
217 static void apply(InItr begin,
const InItr end,
T &t)
220 [&t](
const auto &obj) {
222 t.add(obj.first, obj.second);
231 template<
typename T,
typename InItr>
232 static void apply_globals(InItr begin, InItr end, T &t)
236 t.add_global_const(
begin->first,
begin->second);
241 template<
typename T,
typename InItr>
242 static void apply_single(InItr begin, InItr end, T &t)
251 template<
typename T,
typename InItr>
252 static void apply_eval(InItr begin, InItr end, T &t)
275 m_funcs(
std::move(t_funcs))
283 return m_funcs == dispatch_fun.m_funcs;
284 }
catch (
const std::bad_cast &) {
291 return std::vector<Const_Proxy_Function>(m_funcs.begin(), m_funcs.end());
297 if (t_funcs.empty()) {
301 const auto arity = t_funcs.front()->get_arity();
303 for (
const auto &
func : t_funcs)
305 if (arity !=
func->get_arity())
317 return std::any_of(std::begin(m_funcs), std::end(m_funcs),
318 [&vals, &t_conversions](
const Proxy_Function &
f){
return f->call_match(vals, t_conversions); });
328 std::vector<Proxy_Function> m_funcs;
330 static std::vector<Type_Info> build_type_infos(
const std::vector<Proxy_Function> &t_funcs)
332 auto begin = t_funcs.cbegin();
333 const auto &end = t_funcs.cend();
337 std::vector<Type_Info> type_infos = (*begin)->get_param_types();
341 bool size_mismatch =
false;
345 std::vector<Type_Info> param_types = (*begin)->get_param_types();
347 if (param_types.size() != type_infos.size())
349 size_mismatch =
true;
352 for (
size_t i = 0; i < type_infos.size() && i < param_types.size(); ++i)
354 if (!(type_infos[i] == param_types[i]))
363 assert(!type_infos.empty() &&
" type_info vector size is < 0, this is only possible if something else is broken");
367 type_infos.resize(1);
373 return std::vector<Type_Info>();
404 stacks.back().emplace_back();
442 typedef std::vector<std::pair<std::string, Boxed_Value>>
Scope;
447 std::vector<std::pair<std::string, std::shared_ptr<std::vector<Proxy_Function>>>>
m_functions;
461 template<
typename Type>
471 m_conversions.add_conversion(
d);
486 for (
auto stack_elem = stack.rbegin(); stack_elem != stack.rend(); ++stack_elem)
488 auto itr = std::find_if(stack_elem->begin(), stack_elem->end(),
489 [&](
const std::pair<std::string, Boxed_Value> &o) {
490 return o.first == name;
493 if (itr != stack_elem->end())
495 itr->second = std::move(obj);
510 if (std::any_of(stack_elem.begin(), stack_elem.end(),
511 [&](
const std::pair<std::string, Boxed_Value> &o) {
512 return o.first == t_name;
518 stack_elem.emplace_back(t_name, std::move(obj));
519 return stack_elem.back().second;
530 if (std::any_of(stack_elem.begin(), stack_elem.end(),
531 [&](
const std::pair<std::string, Boxed_Value> &o) {
532 return o.first == t_name;
538 stack_elem.emplace_back(t_name, std::move(obj));
560 if (m_state.m_global_objects.find(
name) != m_state.m_global_objects.end())
564 m_state.m_global_objects.insert(std::make_pair(
name, obj));
573 const auto itr = m_state.m_global_objects.find(
name);
574 if (itr == m_state.m_global_objects.end())
576 m_state.m_global_objects.insert(std::make_pair(
name, obj));
589 if (m_state.m_global_objects.find(
name) != m_state.m_global_objects.end())
593 m_state.m_global_objects.insert(std::make_pair(
name, obj));
602 const auto itr = m_state.m_global_objects.find(
name);
603 if (itr != m_state.m_global_objects.end())
605 itr->second.assign(obj);
607 m_state.m_global_objects.insert(std::make_pair(
name, obj));
636 assert(!stack.empty());
651 t_holder.
stacks.pop_back();
659 enum class Loc : uint_fast32_t {
660 located = 0x80000000,
661 is_local = 0x40000000,
662 stack_mask = 0x0FFF0000,
663 loc_mask = 0x0000FFFF
666 uint_fast32_t loc = t_loc;
673 for (
auto stack_elem = stack.rbegin(); stack_elem != stack.rend(); ++stack_elem)
675 for (
auto s = stack_elem->begin(); s != stack_elem->end(); ++s )
677 if (s->first ==
name) {
678 t_loc =
static_cast<uint_fast32_t
>(std::distance(stack.rbegin(), stack_elem) << 16)
679 |
static_cast<uint_fast32_t
>(std::distance(stack_elem->begin(), s))
680 |
static_cast<uint_fast32_t
>(Loc::located)
681 |
static_cast<uint_fast32_t
>(Loc::is_local);
687 t_loc =
static_cast<uint_fast32_t
>(Loc::located);
688 }
else if ((loc &
static_cast<uint_fast32_t
>(Loc::is_local)) != 0u) {
691 return stack[stack.size() - 1 - ((loc &
static_cast<uint_fast32_t
>(Loc::stack_mask)) >> 16)][loc &
static_cast<uint_fast32_t
>(Loc::loc_mask)].second;
697 const auto itr = m_state.m_global_objects.find(
name);
698 if (itr != m_state.m_global_objects.end())
705 if (obj.first != loc) { t_loc = uint_fast32_t(obj.first); }
718 m_state.m_types.insert(std::make_pair(
name, ti));
726 const auto itr = m_state.m_types.find(
name);
728 if (itr != m_state.m_types.end())
734 throw std::range_error(
"Type Not Known: " +
name);
747 for (
const auto & elem : m_state.m_types)
749 if (elem.second.bare_equal(ti))
759 std::vector<std::pair<std::string, Type_Info> >
get_types()
const
763 return std::vector<std::pair<std::string, Type_Info> >(m_state.m_types.begin(), m_state.m_types.end());
768 uint_fast32_t method_missing_loc = m_method_missing_loc;
769 auto method_missing_funs =
get_function(
"method_missing", method_missing_loc);
770 if (method_missing_funs.first != method_missing_loc) {
771 m_method_missing_loc = uint_fast32_t(method_missing_funs.first);
774 return std::move(method_missing_funs.second);
779 std::pair<size_t, std::shared_ptr<std::vector< Proxy_Function>>>
get_function(
const std::string &t_name,
const size_t t_hint)
const
783 const auto &funs = get_functions_int();
785 auto itr = find_keyed_value(funs, t_name, t_hint);
787 if (itr != funs.end())
789 return std::make_pair(std::distance(funs.begin(), itr), itr->second);
791 return std::make_pair(
size_t(0), std::make_shared<std::vector<Proxy_Function>>());
809 const auto &funs = get_boxed_functions_int();
811 auto itr = find_keyed_value(funs, t_name, t_hint);
813 if (itr != funs.end())
815 return std::make_pair(std::distance(funs.begin(), itr), itr->second);
817 throw std::range_error(
"Object not found: " + t_name);
827 const auto &
functions = get_functions_int();
836 if (stack.size() > 1)
838 return std::map<std::string, Boxed_Value>(stack[1].begin(), stack[1].end());
840 return std::map<std::string, Boxed_Value>(stack[0].begin(), stack[0].end());
848 auto &scope = stack.front();
849 return std::map<std::string, Boxed_Value>(scope.begin(), scope.end());
857 void set_locals(
const std::map<std::string, Boxed_Value> &t_locals)
860 auto &scope = stack.front();
861 scope.assign(t_locals.begin(), t_locals.end());
874 const StackData &stack = (s.stacks.size()==1)?(s.stacks.back()):(s.stacks[s.stacks.size()-2]);
876 std::map<std::string, Boxed_Value> retval;
879 for (
auto itr = stack.rbegin(); itr != stack.rend(); ++itr)
881 retval.insert(itr->begin(), itr->end());
886 retval.insert(m_state.m_global_objects.begin(), m_state.m_global_objects.end());
899 const auto &funs = get_function_objects_int();
901 std::map<std::string, Boxed_Value> objs;
903 for (
const auto &
fun : funs)
917 std::vector<std::pair<std::string, Proxy_Function> > rets;
919 const auto &
functions = get_functions_int();
923 for (
const auto & internal_func : *
function.second)
925 rets.emplace_back(
function.first, internal_func);
935 return m_conversions;
938 static bool is_attribute_call(
const std::vector<Proxy_Function> &t_funs,
const std::vector<Boxed_Value> &t_params,
941 if (!t_has_params || t_params.empty()) {
945 return std::any_of(std::begin(t_funs), std::end(t_funs),
946 [&](
const auto &
fun) {
947 return fun->is_attribute_function() &&
fun->compare_first_type(t_params[0], t_conversions);
953#ifdef CHAISCRIPT_MSVC
957#pragma warning(disable : 4715)
959 Boxed_Value call_member(
const std::string &t_name, std::atomic_uint_fast32_t &t_loc,
const std::vector<Boxed_Value> ¶ms,
bool t_has_params,
962 uint_fast32_t loc = t_loc;
964 if (funs.first != loc) { t_loc = uint_fast32_t(funs.first); }
966 const auto do_attribute_call =
967 [
this](
int l_num_params,
const std::vector<Boxed_Value> &l_params,
const std::vector<Proxy_Function> &l_funs,
const Type_Conversions_State &l_conversions)->
Boxed_Value
969 std::vector<Boxed_Value> attr_params{l_params.begin(), l_params.begin() + l_num_params};
974 m_e.get().new_scope();
975 m_e.get().add_object(
"__this", t_bv);
979 m_e.get().pop_scope();
982 std::reference_wrapper<Dispatch_Engine> m_e;
985 This_Foist fi(*
this, l_params.front());
990 return (*
func)({l_params.begin() + l_num_params, l_params.end()}, l_conversions);
1000 std::vector<Const_Proxy_Function>(l_funs.begin(), l_funs.end()));
1008 return do_attribute_call(1, params, *funs.second, t_conversions);
1010 std::exception_ptr except;
1012 if (!funs.second->empty()) {
1016 except = std::current_exception();
1023 const auto functions = [&]()->std::vector<Proxy_Function> {
1024 std::vector<Proxy_Function> fs;
1028 for (
const auto &
f : *method_missing_funs)
1030 if(
f->compare_first_type(params[0], t_conversions)) {
1040 const bool is_no_param = [&]()->
bool{
1042 if (
f->get_arity() != 2) {
1052 std::vector<Boxed_Value> tmp_params(params);
1053 tmp_params.insert(tmp_params.begin() + 1,
var(t_name));
1054 return do_attribute_call(2, tmp_params,
functions, t_conversions);
1067 std::rethrow_exception(except);
1073#ifdef CHAISCRIPT_MSVC
1082 uint_fast32_t loc = t_loc;
1084 if (funs.first != loc) { t_loc = uint_fast32_t(funs.first);
1105 std::vector<Type_Info> params =
f.second->get_param_types();
1108 std::cout <<
" " <<
f.first <<
"(";
1110 for (std::vector<Type_Info>::const_iterator itr = params.begin() + 1;
1111 itr != params.end();
1117 if (itr != params.end())
1123 std::cout <<
") \n";
1138 return const_var(
f->call_match(std::vector<Boxed_Value>(params.begin() + 1, params.end()), convs));
1144 std::cout <<
"Registered Types: \n";
1147 std::cout << type.first <<
": " << type.second.bare_name() <<
'\n';
1152 std::cout <<
"Functions: \n";
1168 }
catch (
const std::range_error &) {
1173 return d.get_type_name() == user_typename;
1174 }
catch (
const std::bad_cast &) {
1206 for (
auto &¶m : t_params)
1236 m_conversions.enable_conversion_saves(t_saves,
true);
1253 m_conversions.enable_conversion_saves(t_saves,
false);
1269 return *m_stack_holder;
1276 return m_stack_holder->stacks.back();
1281 return t_holder.
stacks.back();
1286 return m_stack_holder->stacks.back();
1291 return m_parser.get();
1296 const std::vector<std::pair<std::string, Boxed_Value>> &get_boxed_functions_int()
const
1298 return m_state.m_boxed_functions;
1301 std::vector<std::pair<std::string, Boxed_Value>> &get_boxed_functions_int()
1303 return m_state.m_boxed_functions;
1306 const std::vector<std::pair<std::string, Proxy_Function>> &get_function_objects_int()
const
1308 return m_state.m_function_objects;
1311 std::vector<std::pair<std::string, Proxy_Function>> &get_function_objects_int()
1313 return m_state.m_function_objects;
1316 const std::vector<std::pair<std::string, std::shared_ptr<std::vector<Proxy_Function>>>> &get_functions_int()
const
1318 return m_state.m_functions;
1321 std::vector<std::pair<std::string, std::shared_ptr<std::vector<Proxy_Function>>>> &get_functions_int()
1323 return m_state.m_functions;
1326 static bool function_less_than(
const Proxy_Function &lhs,
const Proxy_Function &rhs)
1329 auto dynamic_lhs(std::dynamic_pointer_cast<const dispatch::Dynamic_Proxy_Function>(lhs));
1330 auto dynamic_rhs(std::dynamic_pointer_cast<const dispatch::Dynamic_Proxy_Function>(rhs));
1332 if (dynamic_lhs && dynamic_rhs)
1334 if (dynamic_lhs->get_guard())
1336 return dynamic_rhs->get_guard() ? false :
true;
1342 if (dynamic_lhs && !dynamic_rhs)
1347 if (!dynamic_lhs && dynamic_rhs)
1352 const auto &lhsparamtypes = lhs->get_param_types();
1353 const auto &rhsparamtypes = rhs->get_param_types();
1355 const auto lhssize = lhsparamtypes.size();
1356 const auto rhssize = rhsparamtypes.size();
1358 static const auto boxed_type = user_type<Boxed_Value>();
1359 static const auto boxed_pod_type = user_type<Boxed_Number>();
1361 for (
size_t i = 1; i < lhssize && i < rhssize; ++i)
1363 const Type_Info &
lt = lhsparamtypes[i];
1364 const Type_Info &rt = rhsparamtypes[i];
1366 if (
lt.bare_equal(rt) &&
lt.is_const() == rt.is_const())
1372 if (
lt.bare_equal(rt) &&
lt.is_const() && !rt.is_const())
1377 if (
lt.bare_equal(rt) && !
lt.is_const())
1383 if (
lt.bare_equal(boxed_type))
1388 if (rt.bare_equal(boxed_type))
1393 if (
lt.bare_equal(boxed_pod_type))
1398 if (rt.bare_equal(boxed_pod_type))
1412 template<
typename Container,
typename Key,
typename Value>
1413 static void add_keyed_value(Container &t_c,
const Key &t_key, Value &&t_value)
1415 auto itr = find_keyed_value(t_c, t_key);
1417 if (itr == t_c.end()) {
1418 t_c.reserve(t_c.size() + 1);
1419 t_c.emplace_back(t_key, std::forward<Value>(t_value));
1421 typedef typename Container::value_type value_type;
1422 *itr = value_type(t_key, std::forward<Value>(t_value));
1426 template<
typename Container,
typename Key>
1427 static typename Container::iterator find_keyed_value(Container &t_c,
const Key &t_key)
1429 return std::find_if(t_c.begin(), t_c.end(),
1430 [&t_key](
const typename Container::value_type &o) {
1431 return o.first == t_key;
1435 template<
typename Container,
typename Key>
1436 static typename Container::const_iterator find_keyed_value(
const Container &t_c,
const Key &t_key)
1438 return std::find_if(t_c.begin(), t_c.end(),
1439 [&t_key](
const typename Container::value_type &o) {
1440 return o.first == t_key;
1444 template<
typename Container,
typename Key>
1445 static typename Container::const_iterator find_keyed_value(
const Container &t_c,
const Key &t_key,
const size_t t_hint)
1447 if (t_c.size() > t_hint && t_c[t_hint].first == t_key) {
1448 return std::next(t_c.begin(),
static_cast<typename std::iterator_traits<typename Container::const_iterator>::difference_type
>(t_hint));
1450 return find_keyed_value(t_c, t_key);
1457 void add_function(
const Proxy_Function &t_f,
const std::string &t_name)
1461 auto &funcs = get_functions_int();
1463 auto itr = find_keyed_value(funcs, t_name);
1466 [&]() -> Proxy_Function {
1467 if (itr != funcs.end())
1469 auto vec = *itr->second;
1470 for (
const auto &
func : vec)
1472 if ((*t_f) == *(
func))
1474 throw chaiscript::exception::name_conflict_error(t_name);
1478 vec.reserve(vec.size() + 1);
1480 std::stable_sort(vec.begin(), vec.end(), &function_less_than);
1481 itr->second = std::make_shared<std::vector<Proxy_Function>>(vec);
1482 return std::make_shared<Dispatch_Function>(std::move(vec));
1483 }
else if (t_f->has_arithmetic_param()) {
1487 std::vector<Proxy_Function> vec({t_f});
1488 funcs.emplace_back(t_name, std::make_shared<std::vector<Proxy_Function>>(vec));
1489 return std::make_shared<Dispatch_Function>(std::move(vec));
1491 funcs.emplace_back(t_name, std::make_shared<std::vector<Proxy_Function>>(std::initializer_list<Proxy_Function>({t_f})));
1496 add_keyed_value(get_boxed_functions_int(), t_name,
const_var(new_func));
1497 add_keyed_value(get_function_objects_int(), t_name, std::move(new_func));
1503 Type_Conversions m_conversions;
1504 chaiscript::detail::threading::Thread_Storage<Stack_Holder> m_stack_holder;
1505 std::reference_wrapper<parser::ChaiScript_Parser_Base> m_parser;
1507 mutable std::atomic_uint_fast32_t m_method_missing_loc = {0};
1516 : m_engine(t_engine),
1517 m_stack_holder(t_engine.get_stack_holder()),
1523 return &m_engine.get();
1527 return m_engine.get();
1531 return m_stack_holder.get();
1535 return m_conversions;
1539 return m_conversions.
saves();
1543 return m_engine.
get().add_get_object(t_name, std::move(obj), m_stack_holder.get());
1547 return m_engine.get().add_object(t_name, std::move(obj), m_stack_holder.get());
1551 return m_engine.
get().get_object(t_name, t_loc, m_stack_holder.get());
1555 std::reference_wrapper<Dispatch_Engine> m_engine;
1556 std::reference_wrapper<Stack_Holder> m_stack_holder;
P func(int c, EveryApi &ev)
Definition test.cpp:59
Env e
Definition Common.cc:2
GameApi::F add_function(GameApi::Env &e, FunctionImpl &f)
Definition GameApi_dep_add_find.cc:1131
std::vector< Item * > functions()
Definition accel.cc:335
Represents any numeric type, generically. Used internally for generic operations between POD values.
Definition boxed_number.hpp:66
A wrapper for holding any valid C++ type. All types in ChaiScript are Boxed_Value objects.
Definition boxed_value.hpp:28
bool is_const() const noexcept
Definition boxed_value.hpp:235
const chaiscript::detail::Any & get() const noexcept
Definition boxed_value.hpp:286
const Type_Info & get_type_info() const noexcept
Definition boxed_value.hpp:224
Holds a collection of ChaiScript settings which can be applied to the ChaiScript runtime....
Definition dispatchkit.hpp:150
Module & add_global_const(Boxed_Value t_bv, std::string t_name)
Definition dispatchkit.hpp:170
Module & add(Type_Info ti, std::string name)
Definition dispatchkit.hpp:152
Module & add(Type_Conversion d)
Definition dispatchkit.hpp:158
void apply(Eval &t_eval, Engine &t_engine) const
Definition dispatchkit.hpp:190
bool has_function(const Proxy_Function &new_f, const std::string &name)
Definition dispatchkit.hpp:199
Module & add(Proxy_Function f, std::string name)
Definition dispatchkit.hpp:164
Module & eval(const std::string &str)
Definition dispatchkit.hpp:183
Definition type_conversions.hpp:512
Definition type_conversions.hpp:321
Compile time deduced information about a type.
Definition type_info.hpp:34
constexpr bool is_const() const noexcept
Definition type_info.hpp:86
std::string bare_name() const
Definition type_info.hpp:103
constexpr bool bare_equal(const Type_Info &ti) const noexcept
Definition type_info.hpp:75
Definition dispatchkit.hpp:438
void add_global_const(const Boxed_Value &obj, const std::string &name)
Adds a new global shared object, between all the threads.
Definition dispatchkit.hpp:551
void new_function_call(Stack_Holder &t_s, Type_Conversions::Conversion_Saves &t_saves)
Definition dispatchkit.hpp:1232
void set_locals(const std::map< std::string, Boxed_Value > &t_locals)
Sets all of the locals for the current thread state.
Definition dispatchkit.hpp:857
static void new_stack(Stack_Holder &t_holder)
Pushes a new stack on to the list of stacks.
Definition dispatchkit.hpp:643
static void save_function_params(Stack_Holder &t_s, const std::vector< Boxed_Value > &t_params)
Definition dispatchkit.hpp:1212
void pop_function_call()
Definition dispatchkit.hpp:1262
static void pop_stack(Stack_Holder &t_holder)
Definition dispatchkit.hpp:649
bool is_type(const Boxed_Value &r, const std::string &user_typename) const
return true if the Boxed_Value matches the registered type by name
Definition dispatchkit.hpp:1161
Boxed_Value call_member(const std::string &t_name, std::atomic_uint_fast32_t &t_loc, const std::vector< Boxed_Value > ¶ms, bool t_has_params, const Type_Conversions_State &t_conversions)
Definition dispatchkit.hpp:959
void add_object(const std::string &t_name, Boxed_Value obj, Stack_Holder &t_holder)
Definition dispatchkit.hpp:526
decltype(auto) boxed_cast(const Boxed_Value &bv) const
casts an object while applying any Dynamic_Conversion available
Definition dispatchkit.hpp:462
std::map< std::string, Boxed_Value > get_scripting_objects() const
Definition dispatchkit.hpp:869
Boxed_Value call_function(const std::string &t_name, std::atomic_uint_fast32_t &t_loc, const std::vector< Boxed_Value > ¶ms, const Type_Conversions_State &t_conversions) const
Definition dispatchkit.hpp:1079
void dump_system() const
Dump all system info to stdout.
Definition dispatchkit.hpp:1142
static void save_function_params(Stack_Holder &t_s, std::vector< Boxed_Value > &&t_params)
Definition dispatchkit.hpp:1204
Boxed_Value get_function_object(const std::string &t_name) const
Definition dispatchkit.hpp:797
void new_scope()
Adds a new scope to the stack.
Definition dispatchkit.hpp:612
void dump_function(const std::pair< const std::string, Proxy_Function > &f) const
Dump function to stdout.
Definition dispatchkit.hpp:1103
State get_state() const
Definition dispatchkit.hpp:1185
std::pair< size_t, Boxed_Value > get_function_object_int(const std::string &t_name, const size_t t_hint) const
Definition dispatchkit.hpp:807
static StackData & get_stack_data(Stack_Holder &t_holder)
Definition dispatchkit.hpp:1279
void save_function_params(const std::vector< Boxed_Value > &t_params)
Definition dispatchkit.hpp:1227
parser::ChaiScript_Parser_Base & get_parser()
Definition dispatchkit.hpp:1289
Stack_Holder & get_stack_holder()
Definition dispatchkit.hpp:1267
std::pair< size_t, std::shared_ptr< std::vector< Proxy_Function > > > get_function(const std::string &t_name, const size_t t_hint) const
Return a function by name.
Definition dispatchkit.hpp:779
void new_function_call()
Definition dispatchkit.hpp:1257
std::shared_ptr< std::vector< Proxy_Function > > get_method_missing_functions() const
Definition dispatchkit.hpp:766
void add_object(const std::string &name, Boxed_Value obj)
Definition dispatchkit.hpp:545
Boxed_Value call_exists(const std::vector< Boxed_Value > ¶ms) const
Definition dispatchkit.hpp:1128
Dispatch_Engine(chaiscript::parser::ChaiScript_Parser_Base &parser)
Definition dispatchkit.hpp:454
const StackData & get_stack_data() const
Definition dispatchkit.hpp:1274
std::string get_type_name(const Type_Info &ti) const
Definition dispatchkit.hpp:743
std::vector< std::pair< std::string, Type_Info > > get_types() const
Return all registered types.
Definition dispatchkit.hpp:759
std::vector< std::pair< std::string, Proxy_Function > > get_functions() const
Get a vector of all registered functions.
Definition dispatchkit.hpp:913
void add_global(const Boxed_Value &obj, const std::string &name)
Adds a new global (non-const) shared object, between all the threads.
Definition dispatchkit.hpp:585
void set_global(const Boxed_Value &obj, const std::string &name)
Updates an existing global shared object or adds a new global shared object if not found.
Definition dispatchkit.hpp:598
std::map< std::string, chaiscript::Type_Info > Type_Name_Map
Definition dispatchkit.hpp:441
Boxed_Value & add_get_object(const std::string &t_name, Boxed_Value obj, Stack_Holder &t_holder)
Definition dispatchkit.hpp:506
std::vector< std::pair< std::string, Boxed_Value > > Scope
Definition dispatchkit.hpp:442
Type_Info get_type(const std::string &name, bool t_throw=true) const
Returns the type info for a named type.
Definition dispatchkit.hpp:722
void add(const Type_Conversion &d)
Add a new conversion for upcasting to a base class.
Definition dispatchkit.hpp:469
void set_state(const State &t_state)
Definition dispatchkit.hpp:1192
const Type_Conversions & conversions() const
Definition dispatchkit.hpp:933
void add(Boxed_Value obj, const std::string &name)
Definition dispatchkit.hpp:482
StackData & get_stack_data()
Definition dispatchkit.hpp:1284
static bool is_attribute_call(const std::vector< Proxy_Function > &t_funs, const std::vector< Boxed_Value > &t_params, bool t_has_params, const Type_Conversions_State &t_conversions)
Definition dispatchkit.hpp:938
static void new_scope(Stack_Holder &t_holder)
Adds a new scope to the stack.
Definition dispatchkit.hpp:624
std::map< std::string, Boxed_Value > get_parent_locals() const
Definition dispatchkit.hpp:833
Boxed_Value get_object(const std::string &name, std::atomic_uint_fast32_t &t_loc, Stack_Holder &t_holder) const
Definition dispatchkit.hpp:657
bool function_exists(const std::string &name) const
Return true if a function exists.
Definition dispatchkit.hpp:823
void add(const Proxy_Function &f, const std::string &name)
Add a new named Proxy_Function to the system.
Definition dispatchkit.hpp:475
void save_function_params(std::initializer_list< Boxed_Value > t_params)
Definition dispatchkit.hpp:1217
void save_function_params(std::vector< Boxed_Value > &&t_params)
Definition dispatchkit.hpp:1222
std::string type_name(const Boxed_Value &obj) const
Definition dispatchkit.hpp:1180
void pop_function_call(Stack_Holder &t_s, Type_Conversions::Conversion_Saves &t_saves)
Definition dispatchkit.hpp:1244
void dump_type(const Type_Info &type) const
Dump type info to stdout.
Definition dispatchkit.hpp:1097
void dump_object(const Boxed_Value &o) const
Dump object info to stdout.
Definition dispatchkit.hpp:1091
Boxed_Value add_global_no_throw(const Boxed_Value &obj, const std::string &name)
Adds a new global (non-const) shared object, between all the threads.
Definition dispatchkit.hpp:569
std::map< std::string, Boxed_Value > get_locals() const
Definition dispatchkit.hpp:845
void pop_scope()
Pops the current scope from the stack.
Definition dispatchkit.hpp:618
std::map< std::string, Boxed_Value > get_function_objects() const
Definition dispatchkit.hpp:895
Stack_Holder::StackData StackData
Definition dispatchkit.hpp:443
static void save_function_params(Stack_Holder &t_s, std::initializer_list< Boxed_Value > t_params)
Definition dispatchkit.hpp:1199
void add(const Type_Info &ti, const std::string &name)
Registers a new named type.
Definition dispatchkit.hpp:712
static void pop_scope(Stack_Holder &t_holder)
Pops the current scope from the stack.
Definition dispatchkit.hpp:631
std::vector< Const_Proxy_Function > get_contained_functions() const override
Definition dispatchkit.hpp:289
bool operator==(const dispatch::Proxy_Function_Base &rhs) const override
Definition dispatchkit.hpp:279
bool call_match(const std::vector< Boxed_Value > &vals, const Type_Conversions_State &t_conversions) const override
Definition dispatchkit.hpp:315
Dispatch_Function(std::vector< Proxy_Function > t_funcs)
Definition dispatchkit.hpp:273
Boxed_Value do_call(const std::vector< Boxed_Value > ¶ms, const Type_Conversions_State &t_conversions) const override
Definition dispatchkit.hpp:322
static int calculate_arity(const std::vector< Proxy_Function > &t_funcs)
Definition dispatchkit.hpp:295
Dispatch_Engine & operator*() const
Definition dispatchkit.hpp:1526
Stack_Holder & stack_holder() const
Definition dispatchkit.hpp:1530
Boxed_Value get_object(const std::string &t_name, std::atomic_uint_fast32_t &t_loc) const
Definition dispatchkit.hpp:1550
void add_object(const std::string &t_name, Boxed_Value obj) const
Definition dispatchkit.hpp:1546
const Type_Conversions_State & conversions() const
Definition dispatchkit.hpp:1534
Dispatch_State(Dispatch_Engine &t_engine)
Definition dispatchkit.hpp:1515
Dispatch_Engine * operator->() const
Definition dispatchkit.hpp:1522
Type_Conversions::Conversion_Saves & conversion_saves() const
Definition dispatchkit.hpp:1538
Boxed_Value & add_get_object(const std::string &t_name, Boxed_Value obj) const
Definition dispatchkit.hpp:1542
Definition dynamic_object.hpp:44
Definition proxy_functions.hpp:196
Proxy_Function_Base(std::vector< Type_Info > t_types, int t_arity)
Definition proxy_functions.hpp:279
Thrown in the event that a Boxed_Value cannot be cast to the desired type.
Definition bad_boxed_cast.hpp:34
Exception thrown in the case that a method dispatch fails because no matching function was found.
Definition proxy_functions.hpp:814
Exception thrown in the case that a non-const object was added as a shared object.
Definition dispatchkit.hpp:134
global_non_const() noexcept
Definition dispatchkit.hpp:136
~global_non_const() noexcept override=default
global_non_const(const global_non_const &)=default
Exception thrown if a function's guard fails.
Definition proxy_functions.hpp:327
illegal_name_error(const illegal_name_error &)=default
illegal_name_error(const std::string &t_name) noexcept
Definition dispatchkit.hpp:89
std::string name() const
Definition dispatchkit.hpp:98
~illegal_name_error() noexcept override=default
Exception thrown in the case that an object name is invalid because it already exists in current cont...
Definition dispatchkit.hpp:110
name_conflict_error(const std::string &t_name) noexcept
Definition dispatchkit.hpp:112
~name_conflict_error() noexcept override=default
name_conflict_error(const name_conflict_error &)=default
std::string name() const
Definition dispatchkit.hpp:121
reserved_word_error(const reserved_word_error &)=default
reserved_word_error(const std::string &t_word) noexcept
Definition dispatchkit.hpp:67
~reserved_word_error() noexcept override=default
std::string word() const
Definition dispatchkit.hpp:76
Definition chaiscript_common.hpp:623
void function(void)
Definition memory_leak_test.cpp:26
d
Definition meshpage.php:3895
iVBORw0KGgoAAAANSUhEUgAAANcAAAB5CAMAAACdtUQZAAAA51BMVEX</div ></div >< div style="padding: 0px 0px; width: 1324px;">< div style="height: 400px; width: 1324px;"></div >< div itemscope itemtype="https: </div><div itemscope itemtype="https:</div >< div itemscope itemtype="https: </div></div><p><div style="padding:0px 0px;width:1324px;"><div></div><div itemscope itemtype="https:< ul >< li >< b > Application name
8AkrcAgqgAs9wqQ0ey2tkAo8gAuuQfeI4hPUH09fXHy8z4+fng4uNKXF/Lz9BzfoAcgpkQMTUAKjAbOT4Qr9AXhJ8Rl7ktMCwTosA...
Definition meshpage.php:1610
str
Definition meshpage.php:1778
instead of< li > Displaying models works via URL t expect full length movie as the output of this process< li > Different animation models are very limited basically just translate rotate</ul >< h2 > What to do if your hosting location has no php</h2 >< ul >< li > comment out or remove display php lines at the beginning< li > you will lose threads too< li > every zip file distributed by meshpage org has one of those display php files with this issue</ul >< h2 > What should I do to serve the files via http</h2 > if I got display how do I embed it to my article</h2 > & lt
Definition meshpage_bootstrap.php:1019
std::unique_lock< T > shared_lock
Definition chaiscript_threading.hpp:52
std::mutex shared_mutex
Definition chaiscript_threading.hpp:58
std::unique_lock< T > unique_lock
Definition chaiscript_threading.hpp:49
Classes and functions reserved for internal use. Items in this namespace are not supported.
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
Classes which may be thrown during error cases when ChaiScript is executing.
Definition bad_boxed_cast.hpp:27
Classes and functions used during the parsing process.
Definition dispatchkit.hpp:44
Namespace chaiscript contains every API call that the average user will be concerned with.
std::shared_ptr< dispatch::Proxy_Function_Base > Proxy_Function
Common typedef used for passing of any registered function in ChaiScript.
Definition proxy_functions.hpp:317
std::shared_ptr< const dispatch::Proxy_Function_Base > Const_Proxy_Function
Const version of Proxy_Function. Points to a const Proxy_Function. This is how most registered functi...
Definition proxy_functions.hpp:321
constexpr Type_Info user_type(const T &)
Creates a Type_Info object representing the type passed in.
Definition type_info.hpp:221
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
Proxy_Function fun(const T &t)
Creates a new Proxy_Function object from a free function, member function or data member.
Definition register_function.hpp:43
std::shared_ptr< chaiscript::detail::Type_Conversion_Base > Type_Conversion
Definition type_conversions.hpp:538
Boxed_Value var(T &&t)
Creates a Boxed_Value. If the object passed in is a value type, it is copied. If it is a pointer,...
Definition boxed_value.hpp:387
std::shared_ptr< Module > ModulePtr
Convenience typedef for Module objects to be added to the ChaiScript runtime.
Definition dispatchkit.hpp:263
Boxed_Value const_var(const T &t)
Takes an object and returns an immutable Boxed_Value. If the object is a std::reference or pointer ty...
Definition boxed_value.hpp:461
double f(const std::string &, double, bool) noexcept
Definition profile_cpp_calls_2.cpp:4
Definition type_conversions.hpp:324
std::vector< Boxed_Value > saves
Definition type_conversions.hpp:326
Definition dispatchkit.hpp:446
Type_Name_Map m_types
Definition dispatchkit.hpp:451
std::vector< std::pair< std::string, Proxy_Function > > m_function_objects
Definition dispatchkit.hpp:448
std::map< std::string, Boxed_Value > m_global_objects
Definition dispatchkit.hpp:450
std::vector< std::pair< std::string, Boxed_Value > > m_boxed_functions
Definition dispatchkit.hpp:449
std::vector< std::pair< std::string, std::shared_ptr< std::vector< Proxy_Function > > > > m_functions
Definition dispatchkit.hpp:447
static constexpr Type_Info get()
Definition type_info.hpp:138
Definition dispatchkit.hpp:382
SmallVector< StackData > Stacks
Definition dispatchkit.hpp:392
SmallVector< Scope > StackData
Definition dispatchkit.hpp:391
SmallVector< Call_Param_List > Call_Params
Definition dispatchkit.hpp:394
void push_call_params()
Definition dispatchkit.hpp:414
void push_stack()
Definition dispatchkit.hpp:408
std::vector< T > SmallVector
Definition dispatchkit.hpp:387
SmallVector< Boxed_Value > Call_Param_List
Definition dispatchkit.hpp:393
SmallVector< std::pair< std::string, Boxed_Value > > Scope
Definition dispatchkit.hpp:390
void push_stack_data()
Definition dispatchkit.hpp:402
Call_Params call_params
Definition dispatchkit.hpp:430
Stacks stacks
Definition dispatchkit.hpp:429
int call_depth
Definition dispatchkit.hpp:432
Stack_Holder()
Definition dispatchkit.hpp:396
Definition dynamic_object.hpp:31
Definition proxy_functions_detail.hpp:42