// This file is distributed under the BSD License. // See "license.txt" for details. // Copyright 2009-2012, Jonathan Turner (jonathan@emptycrate.com) // Copyright 2009-2016, Jason Turner (jason@emptycrate.com) // http://www.chaiscript.com #ifndef CHAISCRIPT_OPERATORS_HPP_ #define CHAISCRIPT_OPERATORS_HPP_ #include "../chaiscript_defines.hpp" #include "register_function.hpp" namespace chaiscript { namespace bootstrap { namespace operators { namespace detail { /// \todo make this return a decltype once we drop gcc 4.6 template auto assign(L l, R r) -> L& { return (l = r); } template auto assign_bitwise_and(L l, R r) -> decltype((l &= r)) { return (l &= r); } template auto assign_xor(L l, R r) -> decltype((l^=r)) { return (l ^= r); } template auto assign_bitwise_or(L l, R r) -> decltype((l |= r)) { return (l |= r); } template auto assign_difference(L l, R r) -> decltype(( l -= r)) { return (l -= r); } template auto assign_left_shift(L l, R r) -> decltype(( l <<= r)) { return (l <<= r); } template auto assign_product(L l, R r) -> decltype(( l *= r )) { return (l *= r); } template auto assign_quotient(L l, R r) -> decltype(( l /= r )) { return (l /= r); } template auto assign_remainder(L l, R r) -> decltype(( l %= r )) { return (l %= r); } template 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 auto assign_sum(L l, R r) -> L& { return (l += r); } template auto prefix_decrement(L l) -> decltype(( --l )) { return (--l); } template auto prefix_increment(L l) -> decltype(( ++l )) { return (++l); } template auto equal(L l, R r) -> decltype(( l == r )) { return (l == r); } template auto greater_than(L l, R r) -> decltype(( l > r )) { return (l > r); } template auto greater_than_equal(L l, R r) -> decltype(( l >= r )) { return (l >= r); } template auto less_than(L l, R r) -> decltype(( l < r )) { return (l < r); } template auto less_than_equal(L l, R r) -> decltype(( l <= r )) { return (l <= r); } template auto logical_compliment(L l) -> decltype(( !l )) { return (!l); } template auto not_equal(L l, R r) -> decltype(( l != r )) { return (l != r); } template auto addition(L l, R r) -> decltype(( l + r )) { return (l + r); } template auto unary_plus(L l) -> decltype(( +l )) { return (+l); } template auto subtraction(L l, R r) -> decltype(( l - r )) { return (l - r); } template 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 auto bitwise_and(L l, R r) -> decltype(( l & r )) { return (l & r); } template auto bitwise_compliment(L l) -> decltype(( ~l )) { return (~l); } template auto bitwise_xor(L l, R r) -> decltype(( l ^ r )) { return (l ^ r); } template auto bitwise_or(L l, R r) -> decltype(( l | r )) { return (l | r); } template auto division(L l, R r) -> decltype(( l / r )) { return (l / r); } template auto left_shift(L l, R r) -> decltype(( l << r )) { return l << r; } template auto multiplication(L l, R r) -> decltype(( l * r )) { return l * r; } template auto remainder(L l, R r) -> decltype(( l % r )) { return (l % r); } template auto right_shift(L l, R r) -> decltype(( l >> r )) { return (l >> r); } } template Module& assign(Module& m) { return m.add(chaiscript::fun(&detail::assign), "="); } template Module& assign_bitwise_and(Module& m) { return m.add(chaiscript::fun(&detail::assign_bitwise_and), "&="); } template Module& assign_xor(Module& m) { return m.add(chaiscript::fun(&detail::assign_xor), "^="); } template Module& assign_bitwise_or(Module& m) { return m.add(chaiscript::fun(&detail::assign_bitwise_or), "|="); } template Module& assign_difference(Module& m) { return m.add(chaiscript::fun(&detail::assign_difference), "-="); } template Module& assign_left_shift(Module& m) { return m.add(chaiscript::fun(&detail::assign_left_shift), "<<="); } template Module& assign_product(Module& m) { return m.add(chaiscript::fun(&detail::assign_product), "*="); } template Module& assign_quotient(Module& m) { return m.add(chaiscript::fun(&detail::assign_quotient), "/="); } template Module& assign_remainder(Module& m) { return m.add(chaiscript::fun(&detail::assign_remainder), "%="); } template Module& assign_right_shift(Module& m) { return m.add(chaiscript::fun(&detail::assign_right_shift), ">>="); } template Module& assign_sum(Module& m) { return m.add(chaiscript::fun(&detail::assign_sum), "+="); } template Module& prefix_decrement(Module& m) { return m.add(chaiscript::fun(&detail::prefix_decrement), "--"); } template Module& prefix_increment(Module& m) { return m.add(chaiscript::fun(&detail::prefix_increment), "++"); } template Module& equal(Module& m) { return m.add(chaiscript::fun(&detail::equal), "=="); } template Module& greater_than(Module& m) { return m.add(chaiscript::fun(&detail::greater_than), ">"); } template Module& greater_than_equal(Module& m) { return m.add(chaiscript::fun(&detail::greater_than_equal), ">="); } template Module& less_than(Module& m) { return m.add(chaiscript::fun(&detail::less_than), "<"); } template Module& less_than_equal(Module& m) { return m.add(chaiscript::fun(&detail::less_than_equal), "<="); } template Module& logical_compliment(Module& m) { return m.add(chaiscript::fun(&detail::logical_compliment), "!"); } template Module& not_equal(Module& m) { return m.add(chaiscript::fun(&detail::not_equal), "!="); } template Module& addition(Module& m) { return m.add(chaiscript::fun(&detail::addition), "+"); } template Module& unary_plus(Module& m) { return m.add(chaiscript::fun(&detail::unary_plus), "+"); } template Module& subtraction(Module& m) { return m.add(chaiscript::fun(&detail::subtraction), "-"); } template Module& unary_minus(Module& m) { return m.add(chaiscript::fun(&detail::unary_minus), "-"); } template Module& bitwise_and(Module& m) { return m.add(chaiscript::fun(&detail::bitwise_and), "&"); } template Module& bitwise_compliment(Module& m) { return m.add(chaiscript::fun(&detail::bitwise_compliment), "~"); } template Module& bitwise_xor(Module& m) { return m.add(chaiscript::fun(&detail::bitwise_xor), "^"); } template Module& bitwise_or(Module& m) { return m.add(chaiscript::fun(&detail::bitwise_or), "|"); } template Module& division(Module& m) { return m.add(chaiscript::fun(&detail::division), "/"); } template Module& left_shift(Module& m) { return m.add(chaiscript::fun(&detail::left_shift), "<<"); } template Module& multiplication(Module& m) { return m.add(chaiscript::fun(&detail::multiplication), "*"); } template Module& remainder(Module& m) { return m.add(chaiscript::fun(&detail::remainder), "%"); } template Module& right_shift(Module& m) { return m.add(chaiscript::fun(&detail::right_shift), ">>"); } } } } #endif