Changeset 0531b5d for src/GenPoly/Box.cc
- Timestamp:
- Mar 9, 2016, 3:11:25 PM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, string, with_gc
- Children:
- 89173242
- Parents:
- d1caa6c
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Box.cc
rd1caa6c r0531b5d 115 115 /// Wraps value for a specific (Key, TypeList) combination 116 116 typedef std::pair< TypeList, Value* > Instantiation; 117 /// Map of keys to instantiations of them 118 typedef std::map< Key*, std::vector< Instantiation > > Scope; 119 120 std::vector< Scope > scopes; ///< list of scopes, from outermost to innermost 117 /// List of TypeLists paired with their appropriate values 118 typedef std::vector< Instantiation > ValueList; 119 /// Underlying map type; maps keys to a linear list of corresponding TypeLists and values 120 typedef ScopedMap< Key*, std::vector< Instantiation > > InnerMap; 121 122 InnerMap instantiations; ///< instantiations 121 123 122 124 public: 123 125 /// Starts a new scope 124 void beginScope() { 125 Scope scope; 126 scopes.push_back(scope); 127 } 126 void beginScope() { instantiations.beginScope(); } 128 127 129 128 /// Ends a scope 130 void endScope() { 131 scopes.pop_back(); 132 } 133 134 /// Default constructor initializes with one scope 135 InstantiationMap() { beginScope(); } 129 void endScope() { instantiations.endScope(); } 136 130 137 131 /// Gets the value for the (key, typeList) pair, returns NULL on none such. 138 Value *lookup( Key *key, const std::list< TypeExpr* >& params ) { 139 TypeList typeList( params ); 140 141 // scan scopes from innermost out 142 for ( typename std::vector< Scope >::const_reverse_iterator scope = scopes.rbegin(); scope != scopes.rend(); ++scope ) { 143 // skip scope if nothing for this key 144 typename Scope::const_iterator insts = scope->find( key ); 145 if ( insts == scope->end() ) continue; 146 // look through instantiations for matches to typeList 147 for ( typename std::vector< Instantiation >::const_iterator inst = insts->second.begin(); inst != insts->second.end(); ++inst ) { 132 Value *lookup( Key *key, const std::list< TypeExpr* >& params ) const { 133 TypeList typeList( params ); 134 135 // scan scopes for matches to the key 136 for ( typename InnerMap::const_iterator insts = instantiations.find( key ); insts != instantiations.end(); insts = instantiations.findNext( insts, key ) ) { 137 for ( typename ValueList::const_reverse_iterator inst = insts->second.rbegin(); inst != insts->second.rend(); ++inst ) { 148 138 if ( inst->first == typeList ) return inst->second; 149 139 } 150 140 } 151 // no matching instantiation found141 // no matching instantiations found 152 142 return 0; 153 143 } … … 155 145 /// Adds a value for a (key, typeList) pair to the current scope 156 146 void insert( Key *key, const std::list< TypeExpr* > ¶ms, Value *value ) { 157 scopes.back()[key].push_back( Instantiation( TypeList( params ), value ) );147 instantiations[ key ].push_back( Instantiation( TypeList( params ), value ) ); 158 148 } 159 149 };
Note: See TracChangeset
for help on using the changeset viewer.