1 /////////////////////////////////////////////////////////////////////////////// 2 /// \file op_tags.hpp 3 /// Contains the tags for all the overloadable operators in C++, as well as 4 /// the base tags unary_tag, binary_tag and nary_tag, as well as the is_unary\<\>, 5 /// is_binary\<\> and is_nary\<\> predicates. 6 // 7 // Copyright 2007 Eric Niebler. Distributed under the Boost 8 // Software License, Version 1.0. (See accompanying file 9 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 10 11 #ifndef BOOST_PROTO_V1_OP_TAGS_HPP_EAN_04_01_2005 12 #define BOOST_PROTO_V1_OP_TAGS_HPP_EAN_04_01_2005 13 14 #include <boost/type_traits/is_base_and_derived.hpp> 15 #include <boost/xpressive/proto/v1_/proto_fwd.hpp> 16 17 namespace boost { namespace proto1 18 { 19 20 /////////////////////////////////////////////////////////////////////////////// 21 // Operator tags 22 struct unary_tag {}; 23 struct binary_tag {}; 24 struct nary_tag {}; // for operator() 25 26 struct noop_tag : unary_tag {}; 27 struct unary_plus_tag : unary_tag {}; 28 struct unary_minus_tag : unary_tag {}; 29 struct unary_star_tag : unary_tag {}; 30 struct complement_tag : unary_tag {}; 31 struct address_of_tag : unary_tag {}; 32 struct logical_not_tag : unary_tag {}; 33 struct pre_inc_tag : unary_tag {}; 34 struct pre_dec_tag : unary_tag {}; 35 struct post_inc_tag : unary_tag {}; 36 struct post_dec_tag : unary_tag {}; 37 38 struct left_shift_tag : binary_tag {}; 39 struct right_shift_tag : binary_tag {}; 40 struct multiply_tag : binary_tag {}; 41 struct divide_tag : binary_tag {}; 42 struct modulus_tag : binary_tag {}; 43 struct add_tag : binary_tag {}; 44 struct subtract_tag : binary_tag {}; 45 struct less_tag : binary_tag {}; 46 struct greater_tag : binary_tag {}; 47 struct less_equal_tag : binary_tag {}; 48 struct greater_equal_tag : binary_tag {}; 49 struct equal_tag : binary_tag {}; 50 struct not_equal_tag : binary_tag {}; 51 struct logical_or_tag : binary_tag {}; 52 struct logical_and_tag : binary_tag {}; 53 struct bitand_tag : binary_tag {}; 54 struct bitor_tag : binary_tag {}; 55 struct bitxor_tag : binary_tag {}; 56 struct comma_tag : binary_tag {}; 57 struct mem_ptr_tag : binary_tag {}; 58 59 struct assign_tag : binary_tag {}; 60 struct left_shift_assign_tag : binary_tag {}; 61 struct right_shift_assign_tag : binary_tag {}; 62 struct multiply_assign_tag : binary_tag {}; 63 struct divide_assign_tag : binary_tag {}; 64 struct modulus_assign_tag : binary_tag {}; 65 struct add_assign_tag : binary_tag {}; 66 struct subtract_assign_tag : binary_tag {}; 67 struct bitand_assign_tag : binary_tag {}; 68 struct bitor_assign_tag : binary_tag {}; 69 struct bitxor_assign_tag : binary_tag {}; 70 struct subscript_tag : binary_tag {}; 71 72 struct function_tag : nary_tag {}; 73 74 /////////////////////////////////////////////////////////////////////////////// 75 // is_unary 76 template<typename Tag> 77 struct is_unary 78 : boost::is_base_and_derived<unary_tag, Tag> 79 { 80 }; 81 82 /////////////////////////////////////////////////////////////////////////////// 83 // is_binary 84 template<typename Tag> 85 struct is_binary 86 : boost::is_base_and_derived<binary_tag, Tag> 87 { 88 }; 89 90 /////////////////////////////////////////////////////////////////////////////// 91 // is_nary 92 template<typename Tag> 93 struct is_nary 94 : boost::is_base_and_derived<nary_tag, Tag> 95 { 96 }; 97 98 }} 99 100 #endif 101