Ticket #225: convert_fn_fix.diff

File convert_fn_fix.diff, 2.3 KB (added by rakshasa, 6 years ago)

Fix for the error

  • rtorrent/rak/functional_fun.h

     
    343343  return new value_fn0_t<Result>(val); 
    344344} 
    345345 
     346template <typename A, typename B> 
     347struct equal_types_t { 
     348  typedef A first_type; 
     349  typedef B second_type; 
     350 
     351  const static int result = 0; 
     352}; 
     353 
     354template <typename A> 
     355struct equal_types_t<A, A> { 
     356  typedef A first_type; 
     357  typedef A second_type; 
     358 
     359  const static int result = 1; 
     360}; 
     361 
    346362template <typename Result, typename SrcResult> 
    347363inline function_base0<Result>* 
    348364convert_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); 
    350371} 
    351372 
    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  
    360373template <typename Result, typename Arg1, typename SrcResult, typename SrcArg1> 
    361374inline function_base1<Result, Arg1>* 
    362375convert_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); 
    364382} 
    365383 
    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; 
    372384} 
    373385 
    374 } 
    375  
    376386#endif