Remove unnecessary code

This commit is contained in:
Jason Turner
2016-04-15 23:02:42 -06:00
parent 6fa83bca85
commit 1a42614441
5 changed files with 53 additions and 266 deletions

View File

@@ -29,7 +29,8 @@ namespace chaiscript
throw std::runtime_error("Attempted to dereference null Boxed_Value"); throw std::runtime_error("Attempted to dereference null Boxed_Value");
} }
static const void *verify_type_no_throw(const Boxed_Value &ob, const std::type_info &ti, const void *ptr) { template<typename T>
static const T *verify_type_no_throw(const Boxed_Value &ob, const std::type_info &ti, const T *ptr) {
if (ob.get_type_info() == ti) { if (ob.get_type_info() == ti) {
return ptr; return ptr;
} else { } else {
@@ -37,7 +38,8 @@ namespace chaiscript
} }
} }
static void *verify_type_no_throw(const Boxed_Value &ob, const std::type_info &ti, void *ptr) { template<typename T>
static T *verify_type_no_throw(const Boxed_Value &ob, const std::type_info &ti, T *ptr) {
if (!ob.is_const() && ob.get_type_info() == ti) { if (!ob.is_const() && ob.get_type_info() == ti) {
return ptr; return ptr;
} else { } else {
@@ -46,7 +48,8 @@ namespace chaiscript
} }
static const void *verify_type(const Boxed_Value &ob, const std::type_info &ti, const void *ptr) { template<typename T>
static const T *verify_type(const Boxed_Value &ob, const std::type_info &ti, const T *ptr) {
if (ob.get_type_info().bare_equal_type_info(ti)) { if (ob.get_type_info().bare_equal_type_info(ti)) {
return throw_if_null(ptr); return throw_if_null(ptr);
} else { } else {
@@ -54,7 +57,8 @@ namespace chaiscript
} }
} }
static void *verify_type(const Boxed_Value &ob, const std::type_info &ti, void *ptr) { template<typename T>
static T *verify_type(const Boxed_Value &ob, const std::type_info &ti, T *ptr) {
if (!ob.is_const() && ob.get_type_info().bare_equal_type_info(ti)) { if (!ob.is_const() && ob.get_type_info().bare_equal_type_info(ti)) {
return throw_if_null(ptr); return throw_if_null(ptr);
} else { } else {

View File

@@ -243,16 +243,8 @@ namespace chaiscript
m_data.get().m_const_data_ptr = m_ptr.get().get(); m_data.get().m_const_data_ptr = m_ptr.get().get();
} }
Sentinel& operator=(Sentinel&&s) { Sentinel& operator=(Sentinel&&s) = default;
m_ptr = std::move(s.m_ptr); Sentinel(Sentinel &&s) = default;
m_data = std::move(s.m_data);
}
Sentinel(Sentinel &&s)
: m_ptr(std::move(s.m_ptr)),
m_data(std::move(s.m_data))
{
}
operator std::shared_ptr<T>&() const operator std::shared_ptr<T>&() const
{ {

View File

@@ -146,6 +146,14 @@ namespace chaiscript
} }
}; };
template<typename Ret>
struct Handle_Return<const Ret>
{
static Boxed_Value handle(const Ret &r)
{
return Boxed_Value(std::cref(r));
}
};
template<typename Ret> template<typename Ret>
struct Handle_Return<Ret &> struct Handle_Return<Ret &>
@@ -154,11 +162,6 @@ namespace chaiscript
{ {
return Boxed_Value(std::ref(r)); return Boxed_Value(std::ref(r));
} }
static Boxed_Value handle(const Ret &r)
{
return Boxed_Value(std::cref(r));
}
}; };
template<> template<>

View File

@@ -16,414 +16,202 @@ namespace chaiscript
{ {
namespace operators namespace operators
{ {
namespace detail
{
/// \todo make this return a decltype once we drop gcc 4.6
template<typename L, typename R>
auto assign(L l, R r) -> L&
{
return (l = r);
}
template<typename L, typename R>
auto assign_bitwise_and(L l, R r) -> decltype((l &= r))
{
return (l &= r);
}
template<typename L, typename R>
auto assign_xor(L l, R r) -> decltype((l^=r))
{
return (l ^= r);
}
template<typename L, typename R>
auto assign_bitwise_or(L l, R r) -> decltype((l |= r))
{
return (l |= r);
}
template<typename L, typename R>
auto assign_difference(L l, R r) -> decltype(( l -= r))
{
return (l -= r);
}
template<typename L, typename R>
auto assign_left_shift(L l, R r) -> decltype(( l <<= r))
{
return (l <<= r);
}
template<typename L, typename R>
auto assign_product(L l, R r) -> decltype(( l *= r ))
{
return (l *= r);
}
template<typename L, typename R>
auto assign_quotient(L l, R r) -> decltype(( l /= r ))
{
return (l /= r);
}
template<typename L, typename R>
auto assign_remainder(L l, R r) -> decltype(( l %= r ))
{
return (l %= r);
}
template<typename L, typename R>
auto assign_right_shift(L l, R r) -> decltype(( l >>= r))
{
return (l >>= r);
}
/// \todo make this return a decltype once we drop gcc 4.6
template<typename L, typename R>
auto assign_sum(L l, R r) -> L&
{
return (l += r);
}
template<typename L>
auto prefix_decrement(L l) -> decltype(( --l ))
{
return (--l);
}
template<typename L>
auto prefix_increment(L l) -> decltype(( ++l ))
{
return (++l);
}
template<typename L, typename R>
auto equal(L l, R r) -> decltype(( l == r ))
{
return (l == r);
}
template<typename L, typename R>
auto greater_than(L l, R r) -> decltype(( l > r ))
{
return (l > r);
}
template<typename L, typename R>
auto greater_than_equal(L l, R r) -> decltype(( l >= r ))
{
return (l >= r);
}
template<typename L, typename R>
auto less_than(L l, R r) -> decltype(( l < r ))
{
return (l < r);
}
template<typename L, typename R>
auto less_than_equal(L l, R r) -> decltype(( l <= r ))
{
return (l <= r);
}
template<typename L>
auto logical_compliment(L l) -> decltype(( !l ))
{
return (!l);
}
template<typename L, typename R>
auto not_equal(L l, R r) -> decltype(( l != r ))
{
return (l != r);
}
template<typename L, typename R>
auto addition(L l, R r) -> decltype(( l + r ))
{
return (l + r);
}
template<typename L>
auto unary_plus(L l) -> decltype(( +l ))
{
return (+l);
}
template<typename L, typename R>
auto subtraction(L l, R r) -> decltype(( l - r ))
{
return (l - r);
}
template<typename L>
auto unary_minus(L l) -> decltype(( -l ))
{
#ifdef CHAISCRIPT_MSVC
#pragma warning(push)
#pragma warning(disable : 4146)
return (-l);
#pragma warning(pop)
#else
return (-l);
#endif
}
template<typename L, typename R>
auto bitwise_and(L l, R r) -> decltype(( l & r ))
{
return (l & r);
}
template<typename L>
auto bitwise_compliment(L l) -> decltype(( ~l ))
{
return (~l);
}
template<typename L, typename R>
auto bitwise_xor(L l, R r) -> decltype(( l ^ r ))
{
return (l ^ r);
}
template<typename L, typename R>
auto bitwise_or(L l, R r) -> decltype(( l | r ))
{
return (l | r);
}
template<typename L, typename R>
auto division(L l, R r) -> decltype(( l / r ))
{
return (l / r);
}
template<typename L, typename R>
auto left_shift(L l, R r) -> decltype(( l << r ))
{
return l << r;
}
template<typename L, typename R>
auto multiplication(L l, R r) -> decltype(( l * r ))
{
return l * r;
}
template<typename L, typename R>
auto remainder(L l, R r) -> decltype(( l % r ))
{
return (l % r);
}
template<typename L, typename R>
auto right_shift(L l, R r) -> decltype(( l >> r ))
{
return (l >> r);
}
}
template<typename T> template<typename T>
void assign(Module& m) void assign(Module& m)
{ {
m.add(chaiscript::fun(&detail::assign<T &, const T&>), "="); m.add(chaiscript::fun([](T &lhs, const T&rhs)->T&{return lhs = rhs;}), "=");
} }
template<typename T> template<typename T>
void assign_bitwise_and(Module& m) void assign_bitwise_and(Module& m)
{ {
m.add(chaiscript::fun(&detail::assign_bitwise_and<T &, const T&>), "&="); m.add(chaiscript::fun([](T &lhs, const T&rhs)->T&{return lhs &= rhs;}), "&=");
} }
template<typename T> template<typename T>
void assign_xor(Module& m) void assign_xor(Module& m)
{ {
m.add(chaiscript::fun(&detail::assign_xor<T &, const T&>), "^="); m.add(chaiscript::fun([](T &lhs, const T&rhs)->T&{return lhs ^= rhs;}), "^=");
} }
template<typename T> template<typename T>
void assign_bitwise_or(Module& m) void assign_bitwise_or(Module& m)
{ {
m.add(chaiscript::fun(&detail::assign_bitwise_or<T &, const T&>), "|="); m.add(chaiscript::fun([](T &lhs, const T&rhs)->T&{return lhs |= rhs;}), "|=");
} }
template<typename T> template<typename T>
void assign_difference(Module& m) void assign_difference(Module& m)
{ {
m.add(chaiscript::fun(&detail::assign_difference<T &, const T&>), "-="); m.add(chaiscript::fun([](T &lhs, const T&rhs)->T&{return lhs -= rhs;}), "-=");
} }
template<typename T> template<typename T>
void assign_left_shift(Module& m) void assign_left_shift(Module& m)
{ {
m.add(chaiscript::fun(&detail::assign_left_shift<T &, const T&>), "<<="); m.add(chaiscript::fun([](T &lhs, const T&rhs)->T&{return lhs <<= rhs;}), "<<=");
} }
template<typename T> template<typename T>
void assign_product(Module& m) void assign_product(Module& m)
{ {
m.add(chaiscript::fun(&detail::assign_product<T &, const T&>), "*="); m.add(chaiscript::fun([](T &lhs, const T&rhs)->T&{return lhs <<= rhs;}), "*=");
} }
template<typename T> template<typename T>
void assign_quotient(Module& m) void assign_quotient(Module& m)
{ {
m.add(chaiscript::fun(&detail::assign_quotient<T &, const T&>), "/="); m.add(chaiscript::fun([](T &lhs, const T&rhs)->T&{return lhs /= rhs;}), "/=");
} }
template<typename T> template<typename T>
void assign_remainder(Module& m) void assign_remainder(Module& m)
{ {
m.add(chaiscript::fun(&detail::assign_remainder<T &, const T&>), "%="); m.add(chaiscript::fun([](T &lhs, const T&rhs)->T&{return lhs %= rhs;}), "%=");
} }
template<typename T> template<typename T>
void assign_right_shift(Module& m) void assign_right_shift(Module& m)
{ {
m.add(chaiscript::fun(&detail::assign_right_shift<T &, const T&>), ">>="); m.add(chaiscript::fun([](T &lhs, const T&rhs)->T&{return lhs >>= rhs;}), ">>=");
} }
template<typename T> template<typename T>
void assign_sum(Module& m) void assign_sum(Module& m)
{ {
m.add(chaiscript::fun(&detail::assign_sum<T &, const T&>), "+="); m.add(chaiscript::fun([](T &lhs, const T&rhs)->T&{return lhs += rhs;}), "+=");
} }
template<typename T> template<typename T>
void prefix_decrement(Module& m) void prefix_decrement(Module& m)
{ {
m.add(chaiscript::fun(&detail::prefix_decrement<T &>), "--"); m.add(chaiscript::fun([](T &lhs)->T&{return --lhs;}), "--");
} }
template<typename T> template<typename T>
void prefix_increment(Module& m) void prefix_increment(Module& m)
{ {
m.add(chaiscript::fun(&detail::prefix_increment<T &>), "++"); m.add(chaiscript::fun([](T &lhs)->T&{return ++lhs;}), "++");
} }
template<typename T> template<typename T>
void equal(Module& m) void equal(Module& m)
{ {
m.add(chaiscript::fun(&detail::equal<const T&, const T&>), "=="); m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs==rhs;}), "==");
} }
template<typename T> template<typename T>
void greater_than(Module& m) void greater_than(Module& m)
{ {
m.add(chaiscript::fun(&detail::greater_than<const T&, const T&>), ">"); m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs>rhs;}), ">");
} }
template<typename T> template<typename T>
void greater_than_equal(Module& m) void greater_than_equal(Module& m)
{ {
m.add(chaiscript::fun(&detail::greater_than_equal<const T&, const T&>), ">="); m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs>=rhs;}), ">=");
} }
template<typename T> template<typename T>
void less_than(Module& m) void less_than(Module& m)
{ {
m.add(chaiscript::fun(&detail::less_than<const T&, const T&>), "<"); m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs<rhs;}), "<");
} }
template<typename T> template<typename T>
void less_than_equal(Module& m) void less_than_equal(Module& m)
{ {
m.add(chaiscript::fun(&detail::less_than_equal<const T&, const T&>), "<="); m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs<=rhs;}), "<=");
} }
template<typename T> template<typename T>
void logical_compliment(Module& m) void logical_compliment(Module& m)
{ {
m.add(chaiscript::fun(&detail::logical_compliment<const T &>), "!"); m.add(chaiscript::fun([](const T &lhs){return !lhs;}), "!");
} }
template<typename T> template<typename T>
void not_equal(Module& m) void not_equal(Module& m)
{ {
m.add(chaiscript::fun(&detail::not_equal<const T &, const T &>), "!="); m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs!=rhs;}), "!=");
} }
template<typename T> template<typename T>
void addition(Module& m) void addition(Module& m)
{ {
m.add(chaiscript::fun(&detail::addition<const T &, const T &>), "+"); m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs+rhs;}), "+");
} }
template<typename T> template<typename T>
void unary_plus(Module& m) void unary_plus(Module& m)
{ {
m.add(chaiscript::fun(&detail::unary_plus<const T &>), "+"); m.add(chaiscript::fun([](const T &lhs){return +lhs;}), "+");
} }
template<typename T> template<typename T>
void subtraction(Module& m) void subtraction(Module& m)
{ {
m.add(chaiscript::fun(&detail::subtraction<const T &, const T &>), "-"); m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs-rhs;}), "-");
} }
template<typename T> template<typename T>
void unary_minus(Module& m) void unary_minus(Module& m)
{ {
m.add(chaiscript::fun(&detail::unary_minus<const T &>), "-"); m.add(chaiscript::fun([](const T &lhs){return -lhs;}), "-");
} }
template<typename T> template<typename T>
void bitwise_and(Module& m) void bitwise_and(Module& m)
{ {
m.add(chaiscript::fun(&detail::bitwise_and<const T &, const T &>), "&"); m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs&rhs;}), "&");
} }
template<typename T> template<typename T>
void bitwise_compliment(Module& m) void bitwise_compliment(Module& m)
{ {
m.add(chaiscript::fun(&detail::bitwise_compliment<const T &>), "~"); m.add(chaiscript::fun([](const T &lhs){return ~lhs;}), "~");
} }
template<typename T> template<typename T>
void bitwise_xor(Module& m) void bitwise_xor(Module& m)
{ {
m.add(chaiscript::fun(&detail::bitwise_xor<const T &, const T &>), "^"); m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs^rhs;}), "^");
} }
template<typename T> template<typename T>
void bitwise_or(Module& m) void bitwise_or(Module& m)
{ {
m.add(chaiscript::fun(&detail::bitwise_or<const T &, const T &>), "|"); m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs|rhs;}), "|");
} }
template<typename T> template<typename T>
void division(Module& m) void division(Module& m)
{ {
m.add(chaiscript::fun(&detail::division<const T &, const T &>), "/"); m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs/rhs;}), "/");
} }
template<typename T> template<typename T>
void left_shift(Module& m) void left_shift(Module& m)
{ {
m.add(chaiscript::fun(&detail::left_shift<const T &, const T &>), "<<"); m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs<<rhs;}), "<<");
} }
template<typename T> template<typename T>
void multiplication(Module& m) void multiplication(Module& m)
{ {
m.add(chaiscript::fun(&detail::multiplication<const T &, const T &>), "*"); m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs*rhs;}), "*");
} }
template<typename T> template<typename T>
void remainder(Module& m) void remainder(Module& m)
{ {
m.add(chaiscript::fun(&detail::remainder<const T &, const T &>), "%"); m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs%rhs;}), "%");
} }
template<typename T> template<typename T>
void right_shift(Module& m) void right_shift(Module& m)
{ {
m.add(chaiscript::fun(&detail::right_shift<const T &, const T &>), ">>"); m.add(chaiscript::fun([](const T &lhs, const T &rhs){return lhs>>rhs;}), ">>");
} }
} }
} }

View File

@@ -727,13 +727,13 @@ namespace chaiscript
template<typename Type> template<typename Type>
auto do_call_impl(Class *o) const -> std::enable_if_t<!std::is_pointer<Type>::value, Boxed_Value> auto do_call_impl(Class *o) const -> std::enable_if_t<!std::is_pointer<Type>::value, Boxed_Value>
{ {
return detail::Handle_Return<const typename std::add_lvalue_reference<Type>::type>::handle(o->*m_attr); return detail::Handle_Return<typename std::add_lvalue_reference<Type>::type>::handle(o->*m_attr);
} }
template<typename Type> template<typename Type>
auto do_call_impl(const Class *o) const -> std::enable_if_t<!std::is_pointer<Type>::value, Boxed_Value> auto do_call_impl(const Class *o) const -> std::enable_if_t<!std::is_pointer<Type>::value, Boxed_Value>
{ {
return detail::Handle_Return<const typename std::add_lvalue_reference<Type>::type>::handle(o->*m_attr); return detail::Handle_Return<typename std::add_lvalue_reference<typename std::add_const<Type>::type>::type>::handle(o->*m_attr);
} }