На основе диапазона для не оптимизирован - PullRequest
2 голосов
/ 28 мая 2020

Функция f() ниже использует синтаксис, аналогичный std::views, и должна быть оптимизирована и векторизована так же, как g(). Любые идеи? Я не могу заставить его работать. См .: https://godbolt.org/z/HkFzXw

Кроме того, R должно быть правильным, если основанное на диапазоне l oop заменяется в соответствии с его определением, но clang, похоже, использует неправильное end() позиция. Почему?

template< typename C, typename F >
struct R : C::const_iterator {
  using it = typename C::const_iterator;
  R( C &pc, F && pf ) : it( pc.begin() ), c( pc ), f( pf ) {}
  C &c; F f;
  inline bool operator!=( it ) {
    for( ; __builtin_expect( static_cast< it >( *this ) != c.end(), 1 ); it::operator++() )
      if( __builtin_expect( f( it::operator*() ) , 1 ) ) return true;
    return false;
  }
  inline decltype( auto ) begin() { return *this; }
  inline decltype( auto ) end() { return c.end(); }
};

template< typename C, typename F >
inline decltype( auto ) operator | ( C &c, F &&f )
 { return R< C, F >( c, f ); }

int f( std::vector< int > const& v ) {
  int k = 0;
  for( auto e : v | []( auto x ){ return x > 10; } )
    k += e;
  return k;
}

int g( std::vector< int > const& v ) {
  int k = 0;
  for( auto e : v )
    if( e > 10 ) k += e;
  return k;
}
...