Home | History | Annotate | Line # | Download | only in Basic
      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
     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.
     53 inline bool isCompoundAssignmentOperator(OverloadedOperatorKind Kind) {
     54   return Kind >= OO_PlusEqual && Kind <= OO_PipeEqual;
     55 }
     56 
     57 } // end namespace clang
     58 
     59 #endif
     60