| 1 | //
 | 
|---|
| 2 | // Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
 | 
|---|
| 3 | //
 | 
|---|
| 4 | // The contents of this file are covered under the licence agreement in the
 | 
|---|
| 5 | // file "LICENCE" distributed with Cforall.
 | 
|---|
| 6 | //
 | 
|---|
| 7 | // OperatorTable.cc --
 | 
|---|
| 8 | //
 | 
|---|
| 9 | // Author           : Richard C. Bilson
 | 
|---|
| 10 | // Created On       : Mon May 18 07:44:20 2015
 | 
|---|
| 11 | // Last Modified By : Andrew Beach
 | 
|---|
| 12 | // Last Modified On : Fri Nov  3 16:00:00 2023
 | 
|---|
| 13 | // Update Count     : 56
 | 
|---|
| 14 | //
 | 
|---|
| 15 | 
 | 
|---|
| 16 | #include "OperatorTable.h"
 | 
|---|
| 17 | 
 | 
|---|
| 18 | #include <cassert>         // for assert
 | 
|---|
| 19 | #include <unordered_map>   // for unordered_map
 | 
|---|
| 20 | 
 | 
|---|
| 21 | namespace CodeGen {
 | 
|---|
| 22 | 
 | 
|---|
| 23 | static const OperatorInfo tableValues[] = {
 | 
|---|
| 24 |         //  inputName symbol  outputName                     friendlyName                  type
 | 
|---|
| 25 |         {       "?[?]",   "",     "_operator_index",             "Index",                      OT_INDEX          },
 | 
|---|
| 26 |         {       "?{}",    "=",    "_constructor",                "Constructor",                OT_CTOR           },
 | 
|---|
| 27 |         {       "^?{}",   "",     "_destructor",                 "Destructor",                 OT_DTOR           },
 | 
|---|
| 28 |         {       "?()",    "",     "_operator_call",              "Call Operator",              OT_CALL           },
 | 
|---|
| 29 |         {       "?++",    "++",   "_operator_postincr",          "Postfix Increment",          OT_POSTFIXASSIGN  },
 | 
|---|
| 30 |         {       "?--",    "--",   "_operator_postdecr",          "Postfix Decrement",          OT_POSTFIXASSIGN  },
 | 
|---|
| 31 |         {       "*?",     "*",    "_operator_deref",             "Dereference",                OT_PREFIX         },
 | 
|---|
| 32 |         {       "+?",     "+",    "_operator_unaryplus",         "Plus",                       OT_PREFIX         },
 | 
|---|
| 33 |         {       "-?",     "-",    "_operator_unaryminus",        "Minus",                      OT_PREFIX         },
 | 
|---|
| 34 |         {       "~?",     "~",    "_operator_bitnot",            "Bitwise Not",                OT_PREFIX         },
 | 
|---|
| 35 |         {       "!?",     "!",    "_operator_lognot",            "Logical Not",                OT_PREFIX         },
 | 
|---|
| 36 |         {       "++?",    "++",   "_operator_preincr",           "Prefix Increment",           OT_PREFIXASSIGN   },
 | 
|---|
| 37 |         {       "--?",    "--",   "_operator_predecr",           "Prefix Decrement",           OT_PREFIXASSIGN   },
 | 
|---|
| 38 |         {       "?\\?",   "\\",   "_operator_exponential",       "Exponentiation",             OT_INFIX          },
 | 
|---|
| 39 |         {       "?*?",    "*",    "_operator_multiply",          "Multiplication",             OT_INFIX          },
 | 
|---|
| 40 |         {       "?/?",    "/",    "_operator_divide",            "Division",                   OT_INFIX          },
 | 
|---|
| 41 |         {       "?%?",    "%",    "_operator_modulus",           "Modulo",                     OT_INFIX          },
 | 
|---|
| 42 |         {       "?+?",    "+",    "_operator_add",               "Addition",                   OT_INFIX          },
 | 
|---|
| 43 |         {       "?-?",    "-",    "_operator_subtract",          "Substraction",               OT_INFIX          },
 | 
|---|
| 44 |         {       "?<<?",   "<<",   "_operator_shiftleft",         "Shift Left",                 OT_INFIX          },
 | 
|---|
| 45 |         {       "?>>?",   ">>",   "_operator_shiftright",        "Shift Right",                OT_INFIX          },
 | 
|---|
| 46 |         {       "?<?",    "<",    "_operator_less",              "Less-than",                  OT_INFIX          },
 | 
|---|
| 47 |         {       "?>?",    ">",    "_operator_greater",           "Greater-than",               OT_INFIX          },
 | 
|---|
| 48 |         {       "?<=?",   "<=",   "_operator_lessequal",         "Less-than-or-Equal",         OT_INFIX          },
 | 
|---|
| 49 |         {       "?>=?",   ">=",   "_operator_greaterequal",      "Greater-than-or-Equal",      OT_INFIX          },
 | 
|---|
| 50 |         {       "?==?",   "==",   "_operator_equal",             "Equality",                   OT_INFIX          },
 | 
|---|
| 51 |         {       "?!=?",   "!=",   "_operator_notequal",          "Not-Equal",                  OT_INFIX          },
 | 
|---|
| 52 |         {       "?&?",    "&",    "_operator_bitand",            "Bitwise And",                OT_INFIX          },
 | 
|---|
| 53 |         {       "?^?",    "^",    "_operator_bitxor",            "Bitwise Xor",                OT_INFIX          },
 | 
|---|
| 54 |         {       "?|?",    "|",    "_operator_bitor",             "Bitwise Or",                 OT_INFIX          },
 | 
|---|
| 55 |         {       "?=?",    "=",    "_operator_assign",            "Assignment",                 OT_INFIXASSIGN    },
 | 
|---|
| 56 |         {       "?\\=?",  "\\=",  "_operator_expassign",         "Exponentiation Assignment",  OT_INFIXASSIGN    },
 | 
|---|
| 57 |         {       "?*=?",   "*=",   "_operator_multassign",        "Multiplication Assignment",  OT_INFIXASSIGN    },
 | 
|---|
| 58 |         {       "?/=?",   "/=",   "_operator_divassign",         "Division Assignment",        OT_INFIXASSIGN    },
 | 
|---|
| 59 |         {       "?%=?",   "%=",   "_operator_modassign",         "Modulo Assignment",          OT_INFIXASSIGN    },
 | 
|---|
| 60 |         {       "?+=?",   "+=",   "_operator_addassign",         "Addition Assignment",        OT_INFIXASSIGN    },
 | 
|---|
| 61 |         {       "?-=?",   "-=",   "_operator_subassign",         "Substrction Assignment",     OT_INFIXASSIGN    },
 | 
|---|
| 62 |         {       "?<<=?",  "<<=",  "_operator_shiftleftassign",   "Shift Left Assignment",      OT_INFIXASSIGN    },
 | 
|---|
| 63 |         {       "?>>=?",  ">>=",  "_operator_shiftrightassign",  "Shift Right Assignment",     OT_INFIXASSIGN    },
 | 
|---|
| 64 |         {       "?&=?",   "&=",   "_operator_bitandassign",      "Bitwise And Assignment",     OT_INFIXASSIGN    },
 | 
|---|
| 65 |         {       "?^=?",   "^=",   "_operator_bitxorassign",      "Bitwise Xor Assignment",     OT_INFIXASSIGN    },
 | 
|---|
| 66 |         {       "?|=?",   "|=",   "_operator_bitorassign",       "Bitwise Or Assignment",      OT_INFIXASSIGN    },
 | 
|---|
| 67 | }; // tableValues
 | 
|---|
| 68 | 
 | 
|---|
| 69 | enum { numOps = sizeof( tableValues ) / sizeof( OperatorInfo ) };
 | 
|---|
| 70 | 
 | 
|---|
| 71 | const OperatorInfo * operatorLookup( const std::string & inputName ) {
 | 
|---|
| 72 |         // Static information set up:
 | 
|---|
| 73 |         static std::unordered_map<std::string, const OperatorInfo *> inputTable;
 | 
|---|
| 74 |         if ( inputTable.empty() ) for ( const OperatorInfo & op : tableValues ) {
 | 
|---|
| 75 |                 inputTable[ op.inputName ] = &op;
 | 
|---|
| 76 |         }
 | 
|---|
| 77 | 
 | 
|---|
| 78 |         if ( inputName.find_first_of( "?^*+-!", 0, 1 ) == std::string::npos ) return nullptr; // prefilter
 | 
|---|
| 79 |         const OperatorInfo * ret = inputTable.find( inputName )->second;
 | 
|---|
| 80 |         // This can only happen if an invalid identifier name has been used.
 | 
|---|
| 81 |         assert( ret );
 | 
|---|
| 82 |         return ret;
 | 
|---|
| 83 | }
 | 
|---|
| 84 | 
 | 
|---|
| 85 | bool isOperator( const std::string & inputName ) {
 | 
|---|
| 86 |         return operatorLookup( inputName ) != nullptr;
 | 
|---|
| 87 | }
 | 
|---|
| 88 | 
 | 
|---|
| 89 | std::string operatorFriendlyName( const std::string & inputName ) {
 | 
|---|
| 90 |         const OperatorInfo * info = operatorLookup( inputName );
 | 
|---|
| 91 |         if ( info ) return info->friendlyName;
 | 
|---|
| 92 |         return "";
 | 
|---|
| 93 | }
 | 
|---|
| 94 | 
 | 
|---|
| 95 | // This is only used in the demangler, so it is smaller (and only maybe slow).
 | 
|---|
| 96 | const OperatorInfo * operatorLookupByOutput( const std::string & outputName ) {
 | 
|---|
| 97 |         if ( '_' != outputName[0] ) return nullptr;
 | 
|---|
| 98 |         for ( const OperatorInfo & op : tableValues ) {
 | 
|---|
| 99 |                 if ( outputName == op.outputName ) {
 | 
|---|
| 100 |                         return &op;
 | 
|---|
| 101 |                 }
 | 
|---|
| 102 |         }
 | 
|---|
| 103 |         return nullptr;
 | 
|---|
| 104 | }
 | 
|---|
| 105 | 
 | 
|---|
| 106 | bool isConstructor( const std::string & inputName ) {
 | 
|---|
| 107 |         const OperatorInfo * info = operatorLookup( inputName );
 | 
|---|
| 108 |         if ( info ) return info->type == OT_CTOR;
 | 
|---|
| 109 |         return false;
 | 
|---|
| 110 | }
 | 
|---|
| 111 | 
 | 
|---|
| 112 | bool isDestructor( const std::string & inputName ) {
 | 
|---|
| 113 |         const OperatorInfo * info = operatorLookup( inputName );
 | 
|---|
| 114 |         if ( info ) return info->type == OT_DTOR;
 | 
|---|
| 115 |         return false;
 | 
|---|
| 116 | }
 | 
|---|
| 117 | 
 | 
|---|
| 118 | bool isCtorDtor( const std::string & inputName ) {
 | 
|---|
| 119 |         const OperatorInfo * info = operatorLookup( inputName );
 | 
|---|
| 120 |         if ( info ) return info->type <= OT_CONSTRUCTOR;
 | 
|---|
| 121 |         return false;
 | 
|---|
| 122 | }
 | 
|---|
| 123 | 
 | 
|---|
| 124 | bool isAssignment( const std::string & inputName ) {
 | 
|---|
| 125 |         const OperatorInfo * info = operatorLookup( inputName );
 | 
|---|
| 126 |         if ( info ) return info->type > OT_CONSTRUCTOR && info->type <= OT_ASSIGNMENT;
 | 
|---|
| 127 |         return false;
 | 
|---|
| 128 | }
 | 
|---|
| 129 | 
 | 
|---|
| 130 | bool isCtorDtorAssign( const std::string & inputName ) {
 | 
|---|
| 131 |         const OperatorInfo * info = operatorLookup( inputName );
 | 
|---|
| 132 |         if ( info ) return info->type <= OT_ASSIGNMENT;
 | 
|---|
| 133 |         return false;
 | 
|---|
| 134 | }
 | 
|---|
| 135 | 
 | 
|---|
| 136 | } // namespace CodeGen
 | 
|---|
| 137 | 
 | 
|---|
| 138 | // Local Variables: //
 | 
|---|
| 139 | // tab-width: 4 //
 | 
|---|
| 140 | // End: //
 | 
|---|