source: src/GenPoly/GenPoly.cc @ ecb1534

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsctordeferred_resndemanglerenumforall-pointer-decaygc_noraiijacob/cs343-translationjenkins-sandboxmemorynew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newstringwith_gc
Last change on this file since ecb1534 was 843054c2, checked in by Peter A. Buhr <pabuhr@…>, 10 years ago

licencing: seventh groups of files

  • Property mode set to 100644
File size: 2.1 KB
Line 
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// GenPoly.cc --
8//
9// Author           : Richard C. Bilson
10// Created On       : Mon May 18 07:44:20 2015
11// Last Modified By : Peter A. Buhr
12// Last Modified On : Tue May 19 07:37:46 2015
13// Update Count     : 1
14//
15
16#include "GenPoly.h"
17#include "SynTree/Type.h"
18
19#include <iostream>
20using namespace std;
21
22namespace GenPoly {
23        // interface functions
24        bool isPolyVal( Type *type, const TyVarMap &tyVars ) {
25                return isPolyVal( type, tyVars, false );
26        }
27
28        bool needsAdapter( FunctionType *adaptee, const TyVarMap &tyVars ) { 
29                return needsAdapter( adaptee, tyVars, false );
30        }
31
32        bool isPolyVal( Type *type, const TyVarMap &tyVars, bool considerAllTyVars ) {
33                if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( type ) ) {
34                        if ( tyVars.find( typeInst->get_name() ) != tyVars.end() ) {
35                                return true;
36                        } // if
37                        return considerAllTyVars;
38                } // if
39                return false;
40        }
41
42        // A function needs an adapter if it returns a polymorphic value or if any of its
43        // parameters have polymorphic type
44        bool needsAdapter( FunctionType *adaptee, const TyVarMap &tyVars, bool considerAllTyVars ) {
45                bool needsAdapter = false;
46                if ( ! adaptee->get_returnVals().empty() && isPolyVal( adaptee->get_returnVals().front()->get_type(), tyVars, considerAllTyVars ) ) {
47                        needsAdapter = true;
48                } // if
49                for ( std::list< DeclarationWithType* >::const_iterator innerArg = adaptee->get_parameters().begin(); ! needsAdapter && innerArg != adaptee->get_parameters().end(); ++innerArg ) {
50                        if ( isPolyVal( (*innerArg)->get_type(), tyVars, considerAllTyVars ) ) {
51                                needsAdapter = true;
52                        } // if
53                } // for
54                return needsAdapter;
55        }
56
57        void printTyVarMap( std::ostream &os, const TyVarMap &tyVarMap ) {
58                for ( TyVarMap::const_iterator i = tyVarMap.begin(); i != tyVarMap.end(); ++i ) {
59                        os << i->first << " (" << i->second << ") ";
60                } // for
61                os << std::endl;
62        }
63} // namespace GenPoly
64
65// Local Variables: //
66// tab-width: 4 //
67// mode: c++ //
68// compile-command: "make install" //
69// End: //
Note: See TracBrowser for help on using the repository browser.