//===--- OperatorKinds.h - C++ Overloaded Operators -------------*- C++ -*-===//
 
//
 
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 
// See https://llvm.org/LICENSE.txt for license information.
 
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
//
 
//===----------------------------------------------------------------------===//
 
///
 
/// \file
 
/// Defines an enumeration for C++ overloaded operators.
 
///
 
//===----------------------------------------------------------------------===//
 
 
 
#ifndef LLVM_CLANG_BASIC_OPERATORKINDS_H
 
#define LLVM_CLANG_BASIC_OPERATORKINDS_H
 
 
 
namespace clang {
 
 
 
/// Enumeration specifying the different kinds of C++ overloaded
 
/// operators.
 
enum OverloadedOperatorKind : int {
 
  OO_None,                ///< Not an overloaded operator
 
#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
 
  OO_##Name,
 
#include "clang/Basic/OperatorKinds.def"
 
  NUM_OVERLOADED_OPERATORS
 
};
 
 
 
/// Retrieve the spelling of the given overloaded operator, without
 
/// the preceding "operator" keyword.
 
const char *getOperatorSpelling(OverloadedOperatorKind Operator);
 
 
 
/// Get the other overloaded operator that the given operator can be rewritten
 
/// into, if any such operator exists.
 
inline OverloadedOperatorKind
 
getRewrittenOverloadedOperator(OverloadedOperatorKind Kind) {
 
  switch (Kind) {
 
  case OO_Less:
 
  case OO_LessEqual:
 
  case OO_Greater:
 
  case OO_GreaterEqual:
 
    return OO_Spaceship;
 
 
 
  case OO_ExclaimEqual:
 
    return OO_EqualEqual;
 
 
 
  default:
 
    return OO_None;
 
  }
 
}
 
 
 
/// Determine if this is a compound assignment operator.
 
inline bool isCompoundAssignmentOperator(OverloadedOperatorKind Kind) {
 
  return Kind >= OO_PlusEqual && Kind <= OO_PipeEqual;
 
}
 
 
 
} // end namespace clang
 
 
 
#endif