// Copyright 2019 Yan Yan // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef PARAMS_GRID_H_ #define PARAMS_GRID_H_ #include #include namespace detail { template int getTotalSize(std::vector arg) { return arg.size(); } template int getTotalSize(std::vector arg, std::vector... args) { return arg.size() * getTotalSize(args...); } template int getSize(std::vector arg) { return arg.size(); } template void assigner(TT &src, std::vector counter, std::vector &arg) { std::get(src) = arg[counter[Idx]]; } template void assigner(TT &src, std::vector counter, std::vector &arg, std::vector &... args) { std::get(src) = arg[counter[Idx]]; assigner(src, counter, args...); } } // namespace detail template std::vector> paramsGrid(std::vector... args) { int length = detail::getTotalSize(args...); std::vector sizes = {detail::getSize(args)...}; int size = sizes.size(); std::vector> params(length); std::vector counter(size); for (int i = 0; i < length; ++i) { detail::assigner<0>(params[i], counter, args...); counter[size - 1] += 1; for (int c = size - 1; c >= 0; --c) { if (counter[c] == sizes[c] && c > 0) { counter[c - 1] += 1; counter[c] = 0; } } } return params; } #endif