#pragma once #include #include // Utility to guarantee 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 struct ForcedUnroll { template C10_ALWAYS_INLINE void operator()(const Func& f, Args... args) const { ForcedUnroll{}(f, args...); f(std::integral_constant{}, args...); } }; template <> struct ForcedUnroll<1> { template C10_ALWAYS_INLINE void operator()(const Func& f, Args... args) const { f(std::integral_constant{}, args...); } }; } // namespace c10