Ticket #225: convert_fn_fix.diff
| File convert_fn_fix.diff, 2.3 KB (added by rakshasa, 6 years ago) |
|---|
-
rtorrent/rak/functional_fun.h
343 343 return new value_fn0_t<Result>(val); 344 344 } 345 345 346 template <typename A, typename B> 347 struct equal_types_t { 348 typedef A first_type; 349 typedef B second_type; 350 351 const static int result = 0; 352 }; 353 354 template <typename A> 355 struct equal_types_t<A, A> { 356 typedef A first_type; 357 typedef A second_type; 358 359 const static int result = 1; 360 }; 361 346 362 template <typename Result, typename SrcResult> 347 363 inline function_base0<Result>* 348 364 convert_fn(function_base0<SrcResult>* src) { 349 return new convert_fn0_t<Result, SrcResult>(src); 365 if (equal_types_t<function_base0<Result>, function_base0<SrcResult> >::result) 366 // The pointer cast never gets done if the types are different, 367 // but needs to be here to pleasant the compiler. 368 return reinterpret_cast<typename equal_types_t<function_base0<Result>, function_base0<SrcResult> >::first_type*>(src); 369 else 370 return new convert_fn0_t<Result, SrcResult>(src); 350 371 } 351 372 352 // This overload ensures that if we try to convert to the same type,353 // it will optimize away the unneeded layer.354 template <typename Result>355 inline function_base0<Result>*356 convert_fn(function_base0<Result>* src) {357 return src;358 }359 360 373 template <typename Result, typename Arg1, typename SrcResult, typename SrcArg1> 361 374 inline function_base1<Result, Arg1>* 362 375 convert_fn(function_base1<SrcResult, SrcArg1>* src) { 363 return new convert_fn1_t<Result, Arg1, SrcResult, SrcArg1>(src); 376 if (equal_types_t<function_base1<Result, Arg1>, function_base1<SrcResult, SrcArg1> >::result) 377 // The pointer cast never gets done if the types are different, 378 // but needs to be here to pleasant the compiler. 379 return reinterpret_cast<typename equal_types_t<function_base1<Result, Arg1>, function_base1<SrcResult, SrcArg1> >::first_type*>(src); 380 else 381 return new convert_fn1_t<Result, Arg1, SrcResult, SrcArg1>(src); 364 382 } 365 383 366 // This overload ensures that if we try to convert to the same type,367 // it will optimize away the unneeded layer.368 template <typename Result, typename Arg1>369 inline function_base1<Result, Arg1>*370 convert_fn(function_base1<Result, Arg1>* src) {371 return src;372 384 } 373 385 374 }375 376 386 #endif
