Ignore:
Timestamp:
Aug 3, 2024, 11:37:45 PM (18 hours ago)
Author:
JiadaL <j82liang@…>
Branches:
master
Children:
bcb41f7
Parents:
1571e4d
Message:

define enum to value cost as implicit cost

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/Cost.hpp

    r1571e4d r06ecda9  
    3131                #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
    3232                        // Little-endian => first value is low priority and last is high priority.
    33                         unsigned char padding;                                  ///< unused
    3433                        unsigned char referenceCost;                    ///< reference conversions
    3534                        unsigned char specCost;                                 ///< Polymorphic type specializations (type assertions), negative cost
     
    3837                        unsigned char safeCost;                                 ///< Safe (widening) conversions
    3938                        unsigned char polyCost;                                 ///< Count of parameters and return values bound to some poly type
     39                        unsigned char implicitCost;                             ///< Aggregate implicit cost
    4040                        unsigned char unsafeCost;                               ///< Unsafe (narrowing) conversions
    4141                #else
     
    4646        };
    4747        static const unsigned char correctb = 0xff;             // byte correction for negative spec cost
    48         static const uint64_t correctw = 0x00'00'00'00'00'ff'00'00; //' word correction for negative spec cost
     48        static const uint64_t correctw = 0x00'00'00'00'00'00'ff'00; //' word correction for negative spec cost
    4949  public:
    5050        // Compiler adjusts constants for correct endian.
    5151        enum : uint64_t {
    52                 zero      = 0x00'00'00'00'00'ff'00'00,
    53                 infinity  = 0xff'ff'ff'ff'ff'00'ff'ff,
    54                 unsafe    = 0x01'00'00'00'00'ff'00'00,
    55                 poly      = 0x00'01'00'00'00'ff'00'00,
    56                 safe      = 0x00'00'01'00'00'ff'00'00,
    57                 sign      = 0x00'00'00'01'00'ff'00'00,
    58                 var       = 0x00'00'00'00'01'ff'00'00,
    59                 spec      = 0x00'00'00'00'00'fe'00'00,
    60                 reference = 0x00'00'00'00'00'ff'01'00,
     52                zero      = 0x00'00'00'00'00'00'ff'00,
     53                infinity  = 0xff'ff'ff'ff'ff'ff'00'ff,
     54                unsafe    = 0x01'00'00'00'00'00'ff'00,
     55                implicit  = 0x00'01'00'00'01'00'ff'00,
     56                poly      = 0x00'00'01'00'00'00'ff'00,
     57                safe      = 0x00'00'00'01'00'00'ff'00,
     58                sign      = 0x00'00'00'00'01'00'ff'00,
     59                var       = 0x00'00'00'00'00'01'ff'00,
     60                spec      = 0x00'00'00'00'00'00'fe'00,
     61                reference = 0x00'00'00'00'00'00'ff'01,
    6162        }; //'
    6263
    6364        Cost( uint64_t all ) { Cost::all = all; }
    64         Cost( int unsafeCost, int polyCost, int safeCost, int signCost, int varCost, int specCost, int referenceCost ) {
     65        Cost( int unsafeCost, int polyCost, int safeCost, int signCost, int implicitCost, int varCost, int specCost, int referenceCost ) {
    6566                // Assume little-endian => first value is low priority and last is high priority.
    6667                v = {
    6768                #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
    68                         (unsigned char)0,                                               // padding
    6969                        (unsigned char)referenceCost,                   // low priority
    7070                        (unsigned char)(specCost + correctb),   // correct for signedness
     
    7373                        (unsigned char)safeCost,
    7474                        (unsigned char)polyCost,
     75                        (unsigned char)implicitCost,
    7576                        (unsigned char)unsafeCost,                              // high priority
    7677                #else
     
    8182
    8283        int get_unsafeCost() const { return v.unsafeCost; }
     84        int get_implictCost() const { return v.implicitCost; }
    8385        int get_polyCost() const { return v.polyCost; }
    8486        int get_safeCost() const { return v.safeCost; }
     
    112114        Cost incUnsafe( int inc = 1 ) {
    113115                if ( all != infinity ) { assert( v.unsafeCost + inc <= UCHAR_MAX ); v.unsafeCost += inc; }
     116                return *this;
     117        }
     118
     119        Cost incImplicit( int inc = 1 ) {
     120                if ( all != infinity ) { assert( v.implicitCost + inc <= UCHAR_MAX ); v.implicitCost += inc; }
    114121                return *this;
    115122        }
     
    168175
    169176inline std::ostream & operator<<( std::ostream & os, const Cost cost ) {
    170         return os << "( " << cost.get_unsafeCost() << ", " << cost.get_polyCost() << ", " << cost.get_safeCost()
     177        return os << "( " << cost.get_unsafeCost() << ", " << cost.get_implictCost() << ", " << cost.get_polyCost() << ", " << cost.get_safeCost()
    171178                          << ", " << cost.get_signCost() << ", " << cost.get_varCost() << ", " << cost.get_specCost()
    172179                          << ", " << cost.get_referenceCost() << " )";
Note: See TracChangeset for help on using the changeset viewer.