// Utility to guaruntee complete unrolling of a loop where the bounds are known | |
// at compile time. Various pragmas achieve similar effects, but are not as | |
// portable across compilers. | |
// Example: c10::ForcedUnroll<4>{}(f); is equivalent to f(0); f(1); f(2); f(3); | |
namespace c10 { | |
template <int n> | |
struct ForcedUnroll { | |
template <typename Func> | |
C10_ALWAYS_INLINE void operator()(const Func& f) const { | |
ForcedUnroll<n - 1>{}(f); | |
f(n - 1); | |
} | |
}; | |
template <> | |
struct ForcedUnroll<1> { | |
template <typename Func> | |
C10_ALWAYS_INLINE void operator()(const Func& f) const { | |
f(0); | |
} | |
}; | |
} // namespace c10 | |