1 //===--- OperatorKinds.h - C++ Overloaded Operators -------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// 9 /// \file 10 /// Defines an enumeration for C++ overloaded operators. 11 /// 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_BASIC_OPERATORKINDS_H 15 #define LLVM_CLANG_BASIC_OPERATORKINDS_H 16 17 namespace clang { 18 19 /// Enumeration specifying the different kinds of C++ overloaded 20 /// operators. 21 enum OverloadedOperatorKind : int { 22 OO_None, ///< Not an overloaded operator 23 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 24 OO_##Name, 25 #include "clang/Basic/OperatorKinds.def" 26 NUM_OVERLOADED_OPERATORS 27 }; 28 29 /// Retrieve the spelling of the given overloaded operator, without 30 /// the preceding "operator" keyword. 31 const char *getOperatorSpelling(OverloadedOperatorKind Operator); 32 33 /// Get the other overloaded operator that the given operator can be rewritten 34 /// into, if any such operator exists. 35 inline OverloadedOperatorKind getRewrittenOverloadedOperator(OverloadedOperatorKind Kind)36 getRewrittenOverloadedOperator(OverloadedOperatorKind Kind) { 37 switch (Kind) { 38 case OO_Less: 39 case OO_LessEqual: 40 case OO_Greater: 41 case OO_GreaterEqual: 42 return OO_Spaceship; 43 44 case OO_ExclaimEqual: 45 return OO_EqualEqual; 46 47 default: 48 return OO_None; 49 } 50 } 51 52 /// Determine if this is a compound assignment operator. isCompoundAssignmentOperator(OverloadedOperatorKind Kind)53 inline bool isCompoundAssignmentOperator(OverloadedOperatorKind Kind) { 54 return Kind >= OO_PlusEqual && Kind <= OO_PipeEqual; 55 } 56 57 } // end namespace clang 58 59 #endif 60