// This file is distributed under the BSD License. // See "license.txt" for details. // Copyright 2009-2012, Jonathan Turner (jonathan@emptycrate.com) // and Jason Turner (jason@emptycrate.com) // http://www.chaiscript.com #ifndef CHAISCRIPT_OPERATORS_HPP_ #define CHAISCRIPT_OPERATORS_HPP_ #include "../chaiscript_defines.hpp" namespace chaiscript { namespace bootstrap { namespace operators { template Ret assign(L l, R r) { return (l = r); } template Ret assign_bitwise_and(L l, R r) { return (l &= r); } template Ret assign_xor(L l, R r) { return (l ^= r); } template Ret assign_bitwise_or(L l, R r) { return (l |= r); } template Ret assign_difference(L l, R r) { return (l -= r); } template Ret assign_left_shift(L l, R r) { return (l <<= r); } template Ret assign_product(L l, R r) { return (l *= r); } template Ret assign_quotient(L l, R r) { return (l /= r); } template Ret assign_remainder(L l, R r) { return (l %= r); } template Ret assign_right_shift(L l, R r) { return (l >>= r); } template Ret assign_sum(L l, R r) { return (l += r); } template Ret prefix_decrement(L l) { return (--l); } template Ret prefix_increment(L l) { return (++l); } template Ret equal(L l, R r) { return (l == r); } template Ret greater_than(L l, R r) { return (l > r); } template Ret greater_than_equal(L l, R r) { return (l >= r); } template Ret less_than(L l, R r) { return (l < r); } template Ret less_than_equal(L l, R r) { return (l <= r); } template Ret logical_compliment(L l) { return (!l); } template Ret not_equal(L l, R r) { return (l != r); } template Ret addition(L l, R r) { return (l + r); } template Ret unary_plus(L l) { return (+l); } template Ret subtraction(L l, R r) { return (l - r); } template Ret unary_minus(L l) { #ifdef CHAISCRIPT_MSVC #pragma warning(push) #pragma warning(disable : 4146) return (-l); #pragma warning(pop) #else return (-l); #endif } template Ret bitwise_and(L l, R r) { return (l & r); } template Ret bitwise_compliment(L l) { return (~l); } template Ret bitwise_xor(L l, R r) { return (l ^ r); } template Ret bitwise_or(L l, R r) { return (l | r); } template Ret division(L l, R r) { return (l / r); } template Ret left_shift(L l, R r) { return l << r; } template Ret multiplication(L l, R r) { return l * r; } template Ret remainder(L l, R r) { return (l % r); } template Ret right_shift(L l, R r) { return (l >> r); } template ModulePtr assign(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&assign), "="); return m; } template ModulePtr assign_bitwise_and(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&assign_bitwise_and), "&="); return m; } template ModulePtr assign_xor(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&assign_xor), "^="); return m; } template ModulePtr assign_bitwise_or(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&assign_bitwise_or), "|="); return m; } template ModulePtr assign_difference(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&assign_difference), "-="); return m; } template ModulePtr assign_left_shift(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&assign_left_shift), "<<="); return m; } template ModulePtr assign_product(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&assign_product), "*="); return m; } template ModulePtr assign_quotient(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&assign_quotient), "/="); return m; } template ModulePtr assign_remainder(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&assign_remainder), "%="); return m; } template ModulePtr assign_right_shift(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&assign_right_shift), ">>="); return m; } template ModulePtr assign_sum(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&assign_sum), "+="); return m; } template ModulePtr prefix_decrement(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&prefix_decrement), "--"); return m; } template ModulePtr prefix_increment(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&prefix_increment), "++"); return m; } template ModulePtr equal(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&equal), "=="); return m; } template ModulePtr greater_than(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&greater_than), ">"); return m; } template ModulePtr greater_than_equal(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&greater_than_equal), ">="); return m; } template ModulePtr less_than(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&less_than), "<"); return m; } template ModulePtr less_than_equal(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&less_than_equal), "<="); return m; } template ModulePtr logical_compliment(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&logical_compliment), "!"); return m; } template ModulePtr not_equal(ModulePtr m = ModulePtr(new Module())) { m->add(fun(¬_equal), "!="); return m; } template ModulePtr addition(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&addition), "+"); return m; } template ModulePtr unary_plus(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&unary_plus), "+"); return m; } template ModulePtr subtraction(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&subtraction), "-"); return m; } template ModulePtr unary_minus(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&unary_minus), "-"); return m; } template ModulePtr bitwise_and(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&bitwise_and), "&"); return m; } template ModulePtr bitwise_compliment(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&bitwise_compliment), "~"); return m; } template ModulePtr bitwise_xor(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&bitwise_xor), "^"); return m; } template ModulePtr bitwise_or(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&bitwise_or), "|"); return m; } template ModulePtr division(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&division), "/"); return m; } template ModulePtr left_shift(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&left_shift), "<<"); return m; } template ModulePtr multiplication(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&multiplication), "*"); return m; } template ModulePtr remainder(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&remainder), "%"); return m; } template ModulePtr right_shift(ModulePtr m = ModulePtr(new Module())) { m->add(fun(&right_shift), ">>"); return m; } } } } #endif