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