// 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 ModulePtr assign(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::assign), "="); return m; } template ModulePtr assign_bitwise_and(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::assign_bitwise_and), "&="); return m; } template ModulePtr assign_xor(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::assign_xor), "^="); return m; } template ModulePtr assign_bitwise_or(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::assign_bitwise_or), "|="); return m; } template ModulePtr assign_difference(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::assign_difference), "-="); return m; } template ModulePtr assign_left_shift(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::assign_left_shift), "<<="); return m; } template ModulePtr assign_product(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::assign_product), "*="); return m; } template ModulePtr assign_quotient(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::assign_quotient), "/="); return m; } template ModulePtr assign_remainder(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::assign_remainder), "%="); return m; } template ModulePtr assign_right_shift(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::assign_right_shift), ">>="); return m; } template ModulePtr assign_sum(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::assign_sum), "+="); return m; } template ModulePtr prefix_decrement(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::prefix_decrement), "--"); return m; } template ModulePtr prefix_increment(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::prefix_increment), "++"); return m; } template ModulePtr equal(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::equal), "=="); return m; } template ModulePtr greater_than(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::greater_than), ">"); return m; } template ModulePtr greater_than_equal(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::greater_than_equal), ">="); return m; } template ModulePtr less_than(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::less_than), "<"); return m; } template ModulePtr less_than_equal(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::less_than_equal), "<="); return m; } template ModulePtr logical_compliment(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::logical_compliment), "!"); return m; } template ModulePtr not_equal(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::not_equal), "!="); return m; } template ModulePtr addition(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::addition), "+"); return m; } template ModulePtr unary_plus(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::unary_plus), "+"); return m; } template ModulePtr subtraction(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::subtraction), "-"); return m; } template ModulePtr unary_minus(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::unary_minus), "-"); return m; } template ModulePtr bitwise_and(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::bitwise_and), "&"); return m; } template ModulePtr bitwise_compliment(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::bitwise_compliment), "~"); return m; } template ModulePtr bitwise_xor(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::bitwise_xor), "^"); return m; } template ModulePtr bitwise_or(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::bitwise_or), "|"); return m; } template ModulePtr division(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::division), "/"); return m; } template ModulePtr left_shift(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::left_shift), "<<"); return m; } template ModulePtr multiplication(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::multiplication), "*"); return m; } template ModulePtr remainder(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::remainder), "%"); return m; } template ModulePtr right_shift(ModulePtr m = std::make_shared()) { m->add(chaiscript::fun(&detail::right_shift), ">>"); return m; } } } } #endif