blob: 5514ef6f9238d782e8d0fcc2bb644fa932b1aede [file] [edit]
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include <executorch/runtime/platform/compiler.h>
// 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: ForcedUnroll<4>{}(f); is equivalent to f(0); f(1); f(2); f(3);
namespace executorch {
namespace utils {
template <int n>
struct ForcedUnroll {
template <typename Func>
ET_INLINE void operator()(const Func& f) const {
ForcedUnroll<n - 1>{}(f);
f(n - 1);
}
};
template <>
struct ForcedUnroll<1> {
template <typename Func>
ET_INLINE void operator()(const Func& f) const {
f(0);
}
};
} // namespace utils
} // namespace executorch