williamr@2: // -- operator_actions.hpp - Boost Lambda Library ----------------------
williamr@2: 
williamr@2: // Copyright (C) 1999, 2000 Jaakko Järvi (jaakko.jarvi@cs.utu.fi)
williamr@2: //
williamr@2: // Distributed under the Boost Software License, Version 1.0. (See
williamr@2: // accompanying file LICENSE_1_0.txt or copy at
williamr@2: // http://www.boost.org/LICENSE_1_0.txt)
williamr@2: 
williamr@2: // For more information, see http://lambda.cs.utu.fi 
williamr@2: 
williamr@2: #ifndef BOOST_LAMBDA_OPERATOR_ACTIONS_HPP
williamr@2: #define BOOST_LAMBDA_OPERATOR_ACTIONS_HPP
williamr@2: 
williamr@2: namespace boost { 
williamr@2: namespace lambda {
williamr@2: 
williamr@2: 
williamr@2: // -- artihmetic ----------------------
williamr@2: 
williamr@2: class plus_action {};
williamr@2: class minus_action {};
williamr@2: class multiply_action {};
williamr@2: class divide_action {};
williamr@2: class remainder_action {};
williamr@2: 
williamr@2: // -- bitwise  -------------------
williamr@2: 
williamr@2: class leftshift_action {};
williamr@2: class rightshift_action {};
williamr@2: class xor_action {};
williamr@2: 
williamr@2: 
williamr@2: // -- bitwise/logical -------------------
williamr@2: 
williamr@2: class and_action {};
williamr@2: class or_action {};
williamr@2: class not_action {};
williamr@2: 
williamr@2: // -- relational -------------------------
williamr@2: 
williamr@2: class less_action {};
williamr@2: class greater_action {};
williamr@2: class lessorequal_action {};
williamr@2: class greaterorequal_action {};
williamr@2: class equal_action {};
williamr@2: class notequal_action {};
williamr@2: 
williamr@2: // -- increment/decrement ------------------------------
williamr@2: 
williamr@2: class increment_action {};
williamr@2: class decrement_action {};
williamr@2: 
williamr@2: // -- void return ------------------------------
williamr@2: 
williamr@2: // -- other  ------------------------------
williamr@2: 
williamr@2: class addressof_action {};
williamr@2:   // class comma_action {}; // defined in actions.hpp
williamr@2: class contentsof_action {};
williamr@2: // class member_pointer_action {}; (defined in member_ptr.hpp)
williamr@2: 
williamr@2: 
williamr@2: // -- actioun group templates --------------------
williamr@2: 
williamr@2: template <class Action> class arithmetic_action;
williamr@2: template <class Action> class bitwise_action;
williamr@2: template <class Action> class logical_action;
williamr@2: template <class Action> class relational_action;
williamr@2: template <class Action> class arithmetic_assignment_action;
williamr@2: template <class Action> class bitwise_assignment_action;
williamr@2: template <class Action> class unary_arithmetic_action;
williamr@2: template <class Action> class pre_increment_decrement_action;
williamr@2: template <class Action> class post_increment_decrement_action;
williamr@2: 
williamr@2: // ---------------------------------------------------------
williamr@2: 
williamr@2:   // actions, for which the existence of protect is checked in return type 
williamr@2:   // deduction.
williamr@2: 
williamr@2: template <class Act> struct is_protectable<arithmetic_action<Act> > {
williamr@2:   BOOST_STATIC_CONSTANT(bool, value = true);
williamr@2: };
williamr@2: template <class Act> struct is_protectable<bitwise_action<Act> > {
williamr@2:   BOOST_STATIC_CONSTANT(bool, value = true);
williamr@2: };
williamr@2: template <class Act> struct is_protectable<logical_action<Act> > {
williamr@2:   BOOST_STATIC_CONSTANT(bool, value = true);
williamr@2: };
williamr@2: template <class Act> struct is_protectable<relational_action<Act> > {
williamr@2:   BOOST_STATIC_CONSTANT(bool, value = true);
williamr@2: };
williamr@2: template <class Act> 
williamr@2: struct is_protectable<arithmetic_assignment_action<Act> > {
williamr@2:   BOOST_STATIC_CONSTANT(bool, value = true);
williamr@2: };
williamr@2: template <class Act> struct is_protectable<bitwise_assignment_action<Act> > {
williamr@2:   BOOST_STATIC_CONSTANT(bool, value = true);
williamr@2: };
williamr@2: template <class Act> struct is_protectable<unary_arithmetic_action<Act> > {
williamr@2:   BOOST_STATIC_CONSTANT(bool, value = true);
williamr@2: };
williamr@2: template <class Act> 
williamr@2: struct is_protectable<pre_increment_decrement_action<Act> > {
williamr@2:   BOOST_STATIC_CONSTANT(bool, value = true);
williamr@2: };
williamr@2: template <class Act> struct 
williamr@2: is_protectable<post_increment_decrement_action<Act> > {
williamr@2:   BOOST_STATIC_CONSTANT(bool, value = true);
williamr@2: };
williamr@2: 
williamr@2: template <> struct is_protectable<other_action<addressof_action> > {
williamr@2:   BOOST_STATIC_CONSTANT(bool, value = true);
williamr@2: };
williamr@2: template <> struct is_protectable<other_action<contentsof_action> > {
williamr@2:   BOOST_STATIC_CONSTANT(bool, value = true);
williamr@2: };
williamr@2: 
williamr@2: template<> struct is_protectable<other_action<subscript_action> > {
williamr@2:   BOOST_STATIC_CONSTANT(bool, value = true);
williamr@2: };
williamr@2: template<> struct is_protectable<other_action<assignment_action> > {
williamr@2:   BOOST_STATIC_CONSTANT(bool, value = true);
williamr@2: };
williamr@2: 
williamr@2: // NOTE: comma action is also protectable, but the specialization is
williamr@2:   // in actions.hpp
williamr@2: 
williamr@2: 
williamr@2: } // namespace lambda 
williamr@2: } // namespace boost
williamr@2: 
williamr@2: #endif
williamr@2: 
williamr@2: 
williamr@2: 
williamr@2: 
williamr@2: 
williamr@2: 
williamr@2: