source: src/GenPoly/GenPoly.cc @ f8b961b

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 f8b961b was f8b961b, checked in by Aaron Moss <a3moss@…>, 8 years ago

Documentation improvements

  • Property mode set to 100644
File size: 3.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 : Rob Schluntz
12// Last Modified On : Tue Nov 24 15:23:08 2015
13// Update Count     : 11
14//
15
16#include "GenPoly.h"
17#include "SynTree/Type.h"
18
19#include <iostream>
20using namespace std;
21
22namespace GenPoly {
23        /// A function needs an adapter if it returns a polymorphic value or if any of its
24        /// parameters have polymorphic type
25        bool needsAdapter( FunctionType *adaptee, const TyVarMap &tyVars ) {
26                if ( ! adaptee->get_returnVals().empty() && isPolyVal( adaptee->get_returnVals().front()->get_type(), tyVars ) ) {
27                        return true;
28                } // if
29                for ( std::list< DeclarationWithType* >::const_iterator innerArg = adaptee->get_parameters().begin(); innerArg != adaptee->get_parameters().end(); ++innerArg ) {
30                        if ( isPolyVal( (*innerArg)->get_type(), tyVars ) ) {
31                                return true;
32                        } // if
33                } // for
34                return false;
35        }
36
37        bool isPolyRet( FunctionType *function, std::string &name, const TyVarMap &otherTyVars ) {
38                bool doTransform = false;
39                if ( ! function->get_returnVals().empty() ) {
40                        if ( TypeInstType *typeInst = dynamic_cast< TypeInstType *>( function->get_returnVals().front()->get_type() ) ) {
41       
42                                // figure out if the return type is specified by a type parameter
43                                for ( std::list< TypeDecl *>::const_iterator tyVar = function->get_forall().begin(); tyVar != function->get_forall().end(); ++tyVar ) {
44                                        if ( (*tyVar)->get_name() == typeInst->get_name() ) {
45                                                doTransform = true;
46                                                name = typeInst->get_name();
47                                                break;
48                                        } // if
49                                } // for
50                                if ( ! doTransform && otherTyVars.find( typeInst->get_name() ) != otherTyVars.end() ) {
51                                        doTransform = true;
52                                } // if
53                        } // if
54                } // if
55                return doTransform;
56        }
57
58        bool isPolyRet( FunctionType *function, std::string &name ) {
59                TyVarMap dummyTyVars;
60                return isPolyRet( function, name, dummyTyVars );
61        }
62
63        bool isPolyRet( FunctionType *function, const TyVarMap &otherTyVars ) {
64                std::string dummyString;
65                return isPolyRet( function, dummyString, otherTyVars );
66        }
67
68        bool isPolyVal( Type *type, const TyVarMap &tyVars ) {
69                if ( TypeInstType *typeInst = dynamic_cast< TypeInstType * >( type ) ) {
70                        if ( tyVars.find( typeInst->get_name() ) != tyVars.end() ) {
71                                return true;
72                        } // if
73                } // if
74                return false;
75        }
76
77        bool isPolyObj( Type *type, const TyVarMap &tyVars ) {
78                if ( isPolyVal( type, tyVars ) ) {
79                        return true;
80                } else if ( PointerType *pt = dynamic_cast<PointerType*>( type ) ) {
81                        return isPolyObj( pt->get_base(), tyVars );
82                } else {
83                        return false;
84                }
85        }
86
87        void printTyVarMap( std::ostream &os, const TyVarMap &tyVarMap ) {
88                for ( TyVarMap::const_iterator i = tyVarMap.begin(); i != tyVarMap.end(); ++i ) {
89                        os << i->first << " (" << i->second << ") ";
90                } // for
91                os << std::endl;
92        }
93} // namespace GenPoly
94
95// Local Variables: //
96// tab-width: 4 //
97// mode: c++ //
98// compile-command: "make install" //
99// End: //
Note: See TracBrowser for help on using the repository browser.