Various cleanups and fixes for older compilers

This commit is contained in:
Jason Turner
2015-05-22 19:40:56 -06:00
parent df724b5c33
commit e0234d942e
5 changed files with 41 additions and 42 deletions

View File

@@ -243,18 +243,18 @@ namespace chaiscript
template<typename ContainerType> template<typename ContainerType>
ModulePtr random_access_container_type(const std::string &/*type*/, ModulePtr m = std::make_shared<Module>()) ModulePtr random_access_container_type(const std::string &/*type*/, ModulePtr m = std::make_shared<Module>())
{ {
// cppcheck-suppress syntaxError
typedef typename ContainerType::reference(ContainerType::*indexoper)(size_t);
//In the interest of runtime safety for the m, we prefer the at() method for [] access, //In the interest of runtime safety for the m, we prefer the at() method for [] access,
//to throw an exception in an out of bounds condition. //to throw an exception in an out of bounds condition.
m->add( m->add(
fun(std::function<typename ContainerType::reference (ContainerType *, int)> fun(
(std::mem_fn(static_cast<indexoper>(&ContainerType::at)))), "[]"); [](ContainerType &c, int index) -> typename ContainerType::reference {
return c.at(index);
}), "[]");
m->add( m->add(
fun( fun(
[](const ContainerType *c, int index) -> typename ContainerType::const_reference { [](const ContainerType &c, int index) -> typename ContainerType::const_reference {
return c->at(index); return c.at(index);
}), "[]"); }), "[]");
return m; return m;

View File

@@ -60,7 +60,7 @@ namespace chaiscript
{ {
private: private:
template<typename T> template<typename T>
static void check_divide_by_zero(T t, typename std::enable_if<std::is_integral<T>::value>::type* = nullptr) inline static void check_divide_by_zero(T t, typename std::enable_if<std::is_integral<T>::value>::type* = nullptr)
{ {
#ifndef CHAISCRIPT_NO_PROTECT_DIVIDEBYZERO #ifndef CHAISCRIPT_NO_PROTECT_DIVIDEBYZERO
if (t == 0) { if (t == 0) {
@@ -70,7 +70,7 @@ namespace chaiscript
} }
template<typename T> template<typename T>
static void check_divide_by_zero(T, typename std::enable_if<std::is_floating_point<T>::value>::type* = nullptr) inline static void check_divide_by_zero(T, typename std::enable_if<std::is_floating_point<T>::value>::type* = nullptr)
{ {
} }
@@ -78,7 +78,7 @@ namespace chaiscript
{ {
template<typename T, typename U> template<typename T, typename U>
static Boxed_Value go(Operators::Opers t_oper, const T &t, const U &u, const Boxed_Value &) inline static Boxed_Value go(Operators::Opers t_oper, const T &t, const U &u, const Boxed_Value &)
{ {
switch (t_oper) switch (t_oper)
{ {
@@ -103,7 +103,7 @@ namespace chaiscript
struct binary struct binary
{ {
template<typename T, typename U> template<typename T, typename U>
static Boxed_Value go(Operators::Opers t_oper, T &t, const U &u, const Boxed_Value &t_lhs) inline static Boxed_Value go(Operators::Opers t_oper, T &t, const U &u, const Boxed_Value &t_lhs)
{ {
switch (t_oper) switch (t_oper)
{ {
@@ -140,7 +140,7 @@ namespace chaiscript
struct binary_int struct binary_int
{ {
template<typename T, typename U> template<typename T, typename U>
static Boxed_Value go(Operators::Opers t_oper, T &t, const U &u, const Boxed_Value &t_lhs) inline static Boxed_Value go(Operators::Opers t_oper, T &t, const U &u, const Boxed_Value &t_lhs)
{ {
switch (t_oper) switch (t_oper)
{ {
@@ -173,7 +173,7 @@ namespace chaiscript
struct const_binary_int struct const_binary_int
{ {
template<typename T, typename U> template<typename T, typename U>
static Boxed_Value go(Operators::Opers t_oper, const T &t, const U &u, const Boxed_Value &) inline static Boxed_Value go(Operators::Opers t_oper, const T &t, const U &u, const Boxed_Value &)
{ {
switch (t_oper) switch (t_oper)
{ {
@@ -201,7 +201,7 @@ namespace chaiscript
struct const_binary struct const_binary
{ {
template<typename T, typename U> template<typename T, typename U>
static Boxed_Value go(Operators::Opers t_oper, const T &t, const U &u, const Boxed_Value &) inline static Boxed_Value go(Operators::Opers t_oper, const T &t, const U &u, const Boxed_Value &)
{ {
switch (t_oper) switch (t_oper)
{ {
@@ -227,7 +227,7 @@ namespace chaiscript
template<typename LHS, typename RHS, bool Float> template<typename LHS, typename RHS, bool Float>
struct Go struct Go
{ {
static Boxed_Value go(Operators::Opers t_oper, const Boxed_Value &t_lhs, const Boxed_Value &t_rhs) inline static Boxed_Value go(Operators::Opers t_oper, const Boxed_Value &t_lhs, const Boxed_Value &t_rhs)
{ {
if (t_oper > Operators::boolean_flag && t_oper < Operators::non_const_flag) if (t_oper > Operators::boolean_flag && t_oper < Operators::non_const_flag)
{ {
@@ -249,7 +249,7 @@ namespace chaiscript
template<typename LHS, typename RHS> template<typename LHS, typename RHS>
struct Go<LHS, RHS, true> struct Go<LHS, RHS, true>
{ {
static Boxed_Value go(Operators::Opers t_oper, const Boxed_Value &t_lhs, const Boxed_Value &t_rhs) inline static Boxed_Value go(Operators::Opers t_oper, const Boxed_Value &t_lhs, const Boxed_Value &t_rhs)
{ {
if (t_oper > Operators::boolean_flag && t_oper < Operators::non_const_flag) if (t_oper > Operators::boolean_flag && t_oper < Operators::non_const_flag)
{ {
@@ -269,7 +269,7 @@ namespace chaiscript
}; };
template<typename LHS, bool Float> template<typename LHS, bool Float>
static Boxed_Value oper_rhs(Operators::Opers t_oper, const Boxed_Value &t_lhs, const Boxed_Value &t_rhs) inline static Boxed_Value oper_rhs(Operators::Opers t_oper, const Boxed_Value &t_lhs, const Boxed_Value &t_rhs)
{ {
const auto &inp_ = t_rhs.get_type_info(); const auto &inp_ = t_rhs.get_type_info();
@@ -310,7 +310,7 @@ namespace chaiscript
} }
} }
static Boxed_Value oper(Operators::Opers t_oper, const Boxed_Value &t_lhs, const Boxed_Value &t_rhs) inline static Boxed_Value oper(Operators::Opers t_oper, const Boxed_Value &t_lhs, const Boxed_Value &t_rhs)
{ {
const Type_Info &inp_ = t_lhs.get_type_info(); const Type_Info &inp_ = t_lhs.get_type_info();

View File

@@ -47,29 +47,32 @@ namespace chaiscript {
Ret (Class::*m_func)(Param...); Ret (Class::*m_func)(Param...);
}; };
template<typename T> template<typename T>
struct Function_Signature struct Function_Signature
{ {
template<typename Ret, typename ... Param>
static Ret deduce_ret_type(Function_Signature<Ret (Param...)> *);
typedef T Signature;
typedef Function_Signature<T> *ptr_type;
typedef decltype(deduce_ret_type(ptr_type(nullptr))) Return_Type;
}; };
template<typename Ret, typename ... Params>
struct Function_Signature<Ret (Params...)>
{
typedef Ret Return_Type;
typedef Ret (Signature)(Params...);
};
template<typename Ret, typename T, typename ... Params>
struct Function_Signature<Ret (T::*)(Params...) const>
{
typedef Ret Return_Type;
typedef Ret (Signature)(Params...);
};
template<typename T> template<typename T>
struct Callable_Traits struct Callable_Traits
{ {
typedef typename Function_Signature<decltype(&T::operator())>::Signature Signature;
template<typename Ret, typename ... Param> typedef typename Function_Signature<decltype(&T::operator())>::Return_Type Return_Type;
static Function_Signature<Ret (Param...)> deduce_sig_type(Ret (T::*)(Param...) const);
typedef typename decltype(deduce_sig_type(&T::operator()))::Signature Signature;
typedef decltype(deduce_sig_type(&T::operator())) Signature_Object;
typedef typename Signature_Object::Return_Type Return_Type;
}; };
} }
} }

View File

@@ -558,7 +558,7 @@ namespace chaiscript
public: public:
Proxy_Function_Callable_Impl(Callable f) Proxy_Function_Callable_Impl(Callable f)
: Proxy_Function_Impl_Base(detail::build_param_type_list(static_cast<Func *>(nullptr))), : Proxy_Function_Impl_Base(detail::build_param_type_list(static_cast<Func *>(nullptr))),
m_f(std::move(f)), m_dummy_func(nullptr) m_f(std::move(f))
{ {
} }
@@ -566,7 +566,7 @@ namespace chaiscript
virtual bool compare_types_with_cast(const std::vector<Boxed_Value> &vals, const Type_Conversions &t_conversions) const CHAISCRIPT_OVERRIDE virtual bool compare_types_with_cast(const std::vector<Boxed_Value> &vals, const Type_Conversions &t_conversions) const CHAISCRIPT_OVERRIDE
{ {
return detail::compare_types_cast(m_dummy_func, vals, t_conversions); return detail::compare_types_cast(static_cast<Func *>(nullptr), vals, t_conversions);
} }
virtual bool operator==(const Proxy_Function_Base &t_func) const CHAISCRIPT_OVERRIDE virtual bool operator==(const Proxy_Function_Base &t_func) const CHAISCRIPT_OVERRIDE
@@ -582,10 +582,8 @@ namespace chaiscript
return detail::Do_Call<Return_Type>::template go<Func>(m_f, params, t_conversions); return detail::Do_Call<Return_Type>::template go<Func>(m_f, params, t_conversions);
} }
private: private:
Callable m_f; Callable m_f;
Func *m_dummy_func;
}; };
@@ -611,17 +609,16 @@ namespace chaiscript
public: public:
Assignable_Proxy_Function_Impl(std::reference_wrapper<std::function<Func>> t_f, std::shared_ptr<std::function<Func>> t_ptr) Assignable_Proxy_Function_Impl(std::reference_wrapper<std::function<Func>> t_f, std::shared_ptr<std::function<Func>> t_ptr)
: Assignable_Proxy_Function(detail::build_param_type_list(static_cast<Func *>(nullptr))), : Assignable_Proxy_Function(detail::build_param_type_list(static_cast<Func *>(nullptr))),
m_f(std::move(t_f)), m_shared_ptr_holder(std::move(t_ptr)), m_dummy_func(nullptr) m_f(std::move(t_f)), m_shared_ptr_holder(std::move(t_ptr))
{ {
assert(!m_shared_ptr_holder || m_shared_ptr_holder.get() == &m_f.get()); assert(!m_shared_ptr_holder || m_shared_ptr_holder.get() == &m_f.get());
} }
virtual ~Assignable_Proxy_Function_Impl() {} virtual ~Assignable_Proxy_Function_Impl() {}
virtual bool compare_types_with_cast(const std::vector<Boxed_Value> &vals, const Type_Conversions &t_conversions) const CHAISCRIPT_OVERRIDE virtual bool compare_types_with_cast(const std::vector<Boxed_Value> &vals, const Type_Conversions &t_conversions) const CHAISCRIPT_OVERRIDE
{ {
return detail::compare_types_cast(m_dummy_func, vals, t_conversions); return detail::compare_types_cast(static_cast<Func *>(nullptr), vals, t_conversions);
} }
virtual bool operator==(const Proxy_Function_Base &t_func) const CHAISCRIPT_OVERRIDE virtual bool operator==(const Proxy_Function_Base &t_func) const CHAISCRIPT_OVERRIDE
@@ -648,7 +645,6 @@ namespace chaiscript
private: private:
std::reference_wrapper<std::function<Func>> m_f; std::reference_wrapper<std::function<Func>> m_f;
std::shared_ptr<std::function<Func>> m_shared_ptr_holder; std::shared_ptr<std::function<Func>> m_shared_ptr_holder;
Func *m_dummy_func;
}; };
/// Attribute getter Proxy_Function implementation /// Attribute getter Proxy_Function implementation
template<typename T, typename Class> template<typename T, typename Class>

View File

@@ -98,7 +98,7 @@ namespace chaiscript
template<typename Ret, typename ... Params> template<typename Ret, typename ... Params>
bool compare_types_cast(Ret (*)(Params...), bool compare_types_cast(Ret (*)(Params...),
const std::vector<Boxed_Value> &params, const Type_Conversions &t_conversions) const std::vector<Boxed_Value> &params, const Type_Conversions &t_conversions)
{ {
try { try {
Try_Cast<Params...>::do_try(params, 0, t_conversions); Try_Cast<Params...>::do_try(params, 0, t_conversions);
} catch (const exception::bad_boxed_cast &) { } catch (const exception::bad_boxed_cast &) {