// Copyright 2017 The Bazel Authors. All rights reserved. // // 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. package com.google.devtools.build.benchmark.codegenerator; import static java.nio.charset.StandardCharsets.UTF_8; import static java.nio.file.StandardOpenOption.APPEND; import static java.nio.file.StandardOpenOption.CREATE; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; /** Helper class of {@link CppCodeGenerator} */ class CppCodeGeneratorHelper { private static final String CPP_FILE_SUFFIX = ".cc"; private static final String CPP_HEADER_FILE_SUFFIX = ".h"; private static final String BUILD_FILE_NAME = "BUILD"; static void createRandomClass(String className, Path dir) throws IOException { writeLinesToFile(dir.resolve(className + CPP_FILE_SUFFIX), "#include <random>", "#include <iostream>", "#include <ctime>", "using namespace std;", "", "class " + className + " {", "public:", " static void printSth() {", " srand(time(NULL));", " int n = rand();", " cout << \"This is method(printSth) with random number(\" << n << \")\\n\";", " }", "};"); writeLinesToFile(dir.resolve(className + CPP_HEADER_FILE_SUFFIX), "class " + className + " {", "public:", " static void printSth();", "};"); } static void createRandomClassExtra(String className, Path dir) throws IOException { writeLinesToFile(dir.resolve(className + CPP_FILE_SUFFIX), "#include <random>", "#include <iostream>", "#include <ctime>", "using namespace std;", "", "class " + className + " {", "public:", " static void printSth() {", " srand(time(NULL));", " int n = rand();", " cout << \"This is method(printSth) with random number(\" << n << \")\\n\";", " }", " static void printSthElse() {", " srand(time(NULL));", " int n = rand();", " cout << \"This is method(printSthElse) with random number(\" << n << \")\\n\";", " }", "};"); writeLinesToFile(dir.resolve(className + CPP_HEADER_FILE_SUFFIX), "class " + className + " {", "public:", " static void printSth();", " static void printSthElse();", "};"); } static void writeBuildFileWithAllFilesToDir(String targetName, Path dir) throws IOException { writeLinesToFile(dir.resolve(BUILD_FILE_NAME), "cc_library(", " name = '" + targetName + "',", " srcs = glob([ '*" + CPP_FILE_SUFFIX + "', '*" + CPP_HEADER_FILE_SUFFIX + "' ]),", ")"); } static void createClassAndBuildFileWithDepsNext(int index, Path dir) throws IOException { writeLinesToFile(dir.resolve("Deps" + index + CPP_HEADER_FILE_SUFFIX), "class Deps" + index + " {", "public:", " static void printSth();", " static void callNext();", "};"); writeLinesToFile(dir.resolve("Deps" + index + CPP_FILE_SUFFIX), "#include <random>", "#include <iostream>", "#include <ctime>", "#include \"Deps" + (index + 1) + ".h\"", "using namespace std;", "", "class Deps" + index + " {", "public:", " static void printSth() {", " srand(time(NULL));", " int n = rand();", " cout << \"This is method(printSth) with random number(\" << n << \")\\n\";", " }", " static void callNext() {", " Deps" + (index + 1) + "::printSth();", " }", "};"); appendLinesToFile(dir.resolve(BUILD_FILE_NAME), "cc_library(", " name = 'Deps" + index + "',", " srcs = [ 'Deps" + index + ".cc', 'Deps" + index + ".h' ],", " deps = [ ':Deps" + (index + 1) + "' ],", ")"); } static void createClassWithDepsNextExtra(int index, Path dir) throws IOException { writeLinesToFile(dir.resolve("Deps" + index + CPP_HEADER_FILE_SUFFIX), "class Deps" + index + " {", "public:", " static void printSth();", " static void printSthElse();", " static void callNext();", "};"); writeLinesToFile(dir.resolve("Deps" + index + CPP_FILE_SUFFIX), "#include <random>", "#include <iostream>", "#include <ctime>", "#include \"Deps" + (index + 1) + ".h\"", "using namespace std;", "", "class Deps" + index + " {", "public:", " static void printSth() {", " srand(time(NULL));", " int n = rand();", " cout << \"This is method(printSth) with random number(\" << n << \")\\n\";", " }", " static void printSthElse() {", " srand(time(NULL));", " int n = rand();", " cout << \"This is method(printSthElse) with random number(\" << n << \")\\n\";", " }", " static void callNext() {", " Deps" + (index + 1) + "::printSth();", " }", "};"); } static void appendTargetToBuildFile(String targetName, Path dir) throws IOException { appendLinesToFile(dir.resolve(BUILD_FILE_NAME), "cc_library(", " name = '" + targetName + "',", " srcs = [ '" + targetName + ".cc', '" + targetName + ".h' ],", ")"); } static void createMainClassAndBuildFileWithDeps(String targetName, String deps, Path dir) throws IOException { writeLinesToFile(dir.resolve("Main" + CPP_FILE_SUFFIX), "int main() {", " return 0;", "}"); appendLinesToFile(dir.resolve(BUILD_FILE_NAME), "cc_binary(", " name = '" + targetName + "',", " srcs = [ 'Main.cc' ],", deps, ")"); } private static void appendLinesToFile(Path filePath, String... lines) throws IOException { writeOrAppendLinesToFile(true, filePath, lines); } private static void writeLinesToFile(Path filePath, String... lines) throws IOException { writeOrAppendLinesToFile(false, filePath, lines); } private static void writeOrAppendLinesToFile(boolean append, Path filePath, String... lines) throws IOException { File file = filePath.toFile(); if (!file.exists() && !file.createNewFile()) { return; } PrintWriter printWriter = new PrintWriter( Files.newBufferedWriter( file.toPath(), UTF_8, append ? new StandardOpenOption[] {CREATE, APPEND} : new StandardOpenOption[] {CREATE})); for (String line : lines) { printWriter.println(line); } printWriter.close(); } }