Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/Alternative.h

    rfd642d2 r4a161bec  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sat May 16 23:45:43 2015
    11 // Last Modified By : Aaron B. Moss
    12 // Last Modified On : Thu Oct 11 10:55:00 2018
    13 // Update Count     : 4
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:36:36 2017
     13// Update Count     : 3
    1414//
    1515
     
    2020
    2121#include "Cost.h"             // for Cost
    22 #include "TypeEnvironment.h"  // for TypeEnvironment, AssertionSetValue
    23 
    24 #include "Common/utility.h"   // for maybeClone
     22#include "TypeEnvironment.h"  // for TypeEnvironment
    2523
    2624class Expression;
    2725
    2826namespace ResolvExpr {
    29         /// One assertion to resolve
    30         struct AssertionItem {
    31                 const DeclarationWithType* decl;
    32                 AssertionSetValue info;
    33 
    34                 AssertionItem() = default;
    35                 AssertionItem( const DeclarationWithType* decl, const AssertionSetValue& info )
    36                 : decl(decl), info(info) {}
    37                 AssertionItem( const AssertionSet::value_type& e ) : decl(e.first), info(e.second) {}
    38                 operator AssertionSet::value_type () const { return { decl, info }; }
    39 
    40                 // to support cloneAll
    41                 AssertionItem clone() const { return { maybeClone(decl), info }; }
    42         };
    43         /// A list of unresolved assertions
    44         using AssertionList = std::vector<AssertionItem>;
    45 
    46         /// Clones an assertion list into an assertion set
    47         static inline void cloneAll( const AssertionList& src, AssertionSet& dst ) {
    48                 for ( const AssertionItem& item : src ) {
    49                         dst.emplace( maybeClone(item.decl), item.info );
    50                 }
    51         }
    52 
    53         /// Clones an assertion set into an assertion list
    54         static inline void cloneAll( const AssertionSet& src, AssertionList& dst ) {
    55                 dst.reserve( dst.size() + src.size() );
    56                 for ( const auto& entry : src ) {
    57                         dst.emplace_back( maybeClone(entry.first), entry.second );
    58                 }
    59         }
    60 
    61         /// Clones an assertion list into an assertion list
    62         static inline void cloneAll( const AssertionList& src, AssertionList& dst ) {
    63                 dst.reserve( dst.size() + src.size() );
    64                 for ( const AssertionItem& item : src ) {
    65                         dst.emplace_back( maybeClone(item.decl), item.info );
    66                 }
    67         }
    68 
    69         /// One option for resolution of an expression
    7027        struct Alternative {
    7128                Alternative();
    72                 Alternative( Expression *expr, const TypeEnvironment &env );
    73                 Alternative( const Alternative &o, Expression *expr, const Cost &cost );
    74                 Alternative( Expression *expr, const TypeEnvironment &env, const OpenVarSet& openVars,
    75                         const AssertionList& need, const Cost &cost );
    76                 Alternative( Expression *expr, const TypeEnvironment &env, const OpenVarSet& openVars,
    77                         const AssertionList& need, const Cost &cost, const Cost &cvtCost );
    78                 Alternative( Expression *expr, const TypeEnvironment &env, const OpenVarSet &openVars,
    79                         const AssertionSet &need, const Cost &cost);
    80                 Alternative( Expression *expr, const TypeEnvironment &env, const OpenVarSet &openVars,
    81                         const AssertionSet &need, const Cost &cost, const Cost& cvtCost );
    82                 Alternative( Expression *expr, TypeEnvironment &&env, OpenVarSet &&openVars,
    83                         AssertionSet &&need, const Cost &cost );
    84                 Alternative( Expression *expr, TypeEnvironment &&env, OpenVarSet &&openVars,
    85                         AssertionSet &&need, const Cost &cost, const Cost &cvtCost );
     29                Alternative( Expression *expr, const TypeEnvironment &env, const Cost &cost );
     30                Alternative( Expression *expr, const TypeEnvironment &env, const Cost &cost, const Cost &cvtCost );
    8631                Alternative( const Alternative &other );
    8732                Alternative &operator=( const Alternative &other );
     
    9944                }
    10045
    101                 /// Sorts by cost
    102                 bool operator< ( const Alternative& o ) const { return cost < o.cost; }
    103 
    104                 Cost cost;            ///< Cost of the whole expression
    105                 Cost cvtCost;         ///< Cost of conversions to the satisfying expression
    106                 Expression *expr;     ///< Satisfying expression
    107                 TypeEnvironment env;  ///< Containing type environment
    108                 OpenVarSet openVars;  ///< Open variables for environment
    109                 AssertionList need;   ///< Assertions which need to be resolved
     46                Cost cost;
     47                Cost cvtCost;
     48                Expression *expr;
     49                TypeEnvironment env;
    11050        };
    11151
    11252        typedef std::vector< Alternative > AltList;
     53
     54        /// Moves all elements from src to the end of dst
     55        void splice( AltList& dst, AltList& src );
     56
     57        /// Moves all elements from src to the beginning of dst
     58        void spliceBegin( AltList& dst, AltList& src );
    11359
    11460        static inline std::ostream & operator<<(std::ostream & os, const ResolvExpr::Alternative & alt) {
Note: See TracChangeset for help on using the changeset viewer.