Changes in / [0bbe172:dd37afa]
- File:
-
- 1 edited
-
src/AST/Pass.proto.hpp (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Pass.proto.hpp
r0bbe172 rdd37afa 226 226 // Now the original containers should still have the unchanged values 227 227 // but also contain the new values. 228 } 229 }; 230 231 /// Used by previsit implementation 232 /// We need to reassign the result to 'node', unless the function 233 /// returns void, then we just leave 'node' unchanged 234 template<bool is_void> 235 struct __assign; 236 237 template<> 238 struct __assign<true> { 239 template<typename core_t, typename node_t> 240 static inline void result( core_t & core, const node_t * & node ) { 241 core.previsit( node ); 242 } 243 }; 244 245 template<> 246 struct __assign<false> { 247 template<typename core_t, typename node_t> 248 static inline void result( core_t & core, const node_t * & node ) { 249 node = core.previsit( node ); 250 assertf(node, "Previsit must not return NULL"); 251 } 252 }; 253 254 /// Used by postvisit implementation 255 /// We need to return the result unless the function 256 /// returns void, then we just return the original node 257 template<bool is_void> 258 struct __return; 259 260 template<> 261 struct __return<true> { 262 template<typename core_t, typename node_t> 263 static inline const node_t * result( core_t & core, const node_t * & node ) { 264 core.postvisit( node ); 265 return node; 266 } 267 }; 268 269 template<> 270 struct __return<false> { 271 template<typename core_t, typename node_t> 272 static inline auto result( core_t & core, const node_t * & node ) { 273 return core.postvisit( node ); 228 274 } 229 275 }; … … 251 297 ); 252 298 253 // We need to reassign the result to 'node', unless the function 254 // returns void, then we just leave 'node' unchanged 255 if constexpr ( std::is_void_v<decltype( core.previsit( node ) )> ) { 256 core.previsit( node ); 257 } else { 258 node = core.previsit( node ); 259 assertf(node, "Previsit must not return NULL"); 260 } 299 __assign< 300 std::is_void< 301 decltype( core.previsit( node ) ) 302 >::value 303 >::result( core, node ); 261 304 } 262 305 … … 269 312 decltype( core.postvisit( node ), node->accept( *(Visitor*)nullptr ) ) 270 313 { 271 // We need to return the result unless the function 272 // returns void, then we just return the original node 273 if constexpr ( std::is_void_v<decltype( core.postvisit( node ) )> ) { 274 core.postvisit( node ); 275 return node; 276 } else { 277 return core.postvisit( node ); 278 } 314 return __return< 315 std::is_void< 316 decltype( core.postvisit( node ) ) 317 >::value 318 >::result( core, node ); 279 319 } 280 320
Note:
See TracChangeset
for help on using the changeset viewer.