Changes in src/ResolvExpr/Cost.hpp [06ecda9:c92bdcc]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/Cost.hpp
r06ecda9 rc92bdcc 31 31 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 32 32 // Little-endian => first value is low priority and last is high priority. 33 unsigned char padding; ///< unused 33 34 unsigned char referenceCost; ///< reference conversions 34 35 unsigned char specCost; ///< Polymorphic type specializations (type assertions), negative cost … … 37 38 unsigned char safeCost; ///< Safe (widening) conversions 38 39 unsigned char polyCost; ///< Count of parameters and return values bound to some poly type 39 unsigned char implicitCost; ///< Aggregate implicit cost40 40 unsigned char unsafeCost; ///< Unsafe (narrowing) conversions 41 41 #else … … 46 46 }; 47 47 static const unsigned char correctb = 0xff; // byte correction for negative spec cost 48 static const uint64_t correctw = 0x00'00'00'00'00' 00'ff'00; //' word correction for negative spec cost48 static const uint64_t correctw = 0x00'00'00'00'00'ff'00'00; //' word correction for negative spec cost 49 49 public: 50 50 // Compiler adjusts constants for correct endian. 51 51 enum : uint64_t { 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, 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, 62 61 }; //' 63 62 64 63 Cost( uint64_t all ) { Cost::all = all; } 65 Cost( int unsafeCost, int polyCost, int safeCost, int signCost, int implicitCost, intvarCost, int specCost, int referenceCost ) {64 Cost( int unsafeCost, int polyCost, int safeCost, int signCost, int varCost, int specCost, int referenceCost ) { 66 65 // Assume little-endian => first value is low priority and last is high priority. 67 66 v = { 68 67 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 68 (unsigned char)0, // padding 69 69 (unsigned char)referenceCost, // low priority 70 70 (unsigned char)(specCost + correctb), // correct for signedness … … 73 73 (unsigned char)safeCost, 74 74 (unsigned char)polyCost, 75 (unsigned char)implicitCost,76 75 (unsigned char)unsafeCost, // high priority 77 76 #else … … 82 81 83 82 int get_unsafeCost() const { return v.unsafeCost; } 84 int get_implictCost() const { return v.implicitCost; }85 83 int get_polyCost() const { return v.polyCost; } 86 84 int get_safeCost() const { return v.safeCost; } … … 114 112 Cost incUnsafe( int inc = 1 ) { 115 113 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; }121 114 return *this; 122 115 } … … 175 168 176 169 inline std::ostream & operator<<( std::ostream & os, const Cost cost ) { 177 return os << "( " << cost.get_unsafeCost() << ", " << cost.get_ implictCost() << ", " << cost.get_polyCost() << ", " << cost.get_safeCost()170 return os << "( " << cost.get_unsafeCost() << ", " << cost.get_polyCost() << ", " << cost.get_safeCost() 178 171 << ", " << cost.get_signCost() << ", " << cost.get_varCost() << ", " << cost.get_specCost() 179 172 << ", " << cost.get_referenceCost() << " )";
Note: See TracChangeset
for help on using the changeset viewer.