1#ifndef BACKENDS_P4TOOLS_COMMON_LIB_UTIL_H_
2#define BACKENDS_P4TOOLS_COMMON_LIB_UTIL_H_
13#include <boost/format.hpp>
14#include <boost/random/mersenne_twister.hpp>
17#include "lib/big_int_util.h"
18#include "lib/cstring.h"
24inline std::string
logHelper(boost::format &f) {
return f.str(); }
27template <
class T,
class... Args>
28std::string
logHelper(boost::format &f, T &&t, Args &&...args) {
29 return logHelper(f % std::forward<T>(t), std::forward<Args>(args)...);
35template <
typename... Arguments>
36void printFeature(
const std::string &label,
int level,
const std::string &fmt,
37 Arguments &&...args) {
40 auto result =
logHelper(f, std::forward<Arguments>(args)...);
42 LOG_FEATURE(label.c_str(), level, result);
52 static boost::random::mt19937 rng;
55 static std::optional<uint32_t> currentSeed;
65 static void setRandomSeed(
int seed);
91 cstring methodName,
const std::vector<const IR::Expression *> &argVector,
92 const IR::Type *returnType = IR::Type_Void::get(),
93 const IR::ParameterList *paramList =
new IR::ParameterList());
98 std::shuffle(inp->begin(), inp->end(), rng);
102 template <
typename Iter>
104 int random =
getRandInt(std::distance(start, end) - 1);
105 std::advance(start, random);
111 template <
typename ContainerType>
113 std::stringstream stringStream;
116 auto val = container.cbegin();
117 if (val != container.cend()) {
118 stringStream << *val++;
119 while (val != container.cend()) {
120 stringStream <<
", " << *val++;
124 return stringStream.str();
135const IR::IDeclaration *
findProgramDecl(
const IR::IGeneralNamespace *ns,
const IR::Path *path);
138const IR::IDeclaration *
findProgramDecl(
const IR::IGeneralNamespace *ns,
139 const IR::PathExpression *pathExpr);
143 const IR::Type_Name *type);
Definition externInstance.h:33