package wcet.mrtc; /** * Search in a multi-dimensional array. Test of deeply nested loops and non-local exits. * * WCET aspect: Return from the middle of a loop nest, deep loop nesting (4 levels). * * Ported from C code written by Jan Gustafsson for the <a * href="http://www.mrtc.mdh.se/projects/wcet/benchmarks.html">Maelardalen WCET * Benchmarks</a>. */ public class NestedSearch { // Array of keys, 4-dimensional just for the fun of it. private static final int[][][][] keys = { // [0] { // [0][0] { {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0} }, // [0][1] { {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0} }, // [0][2] { {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0} }, // [0][3] { {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0} }, // [0][4] { {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0} } }, // [1] { // [1][0] { {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1} }, // [1][1] { {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1} }, // [1][2] { {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1} }, // [1][3] { {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1} }, // [1][4] { {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1} } }, // [2] { // [2][0] { {2, 2, 2, 2, 2}, {2, 2, 2, 2, 2}, {2, 2, 2, 2, 2}, {2, 2, 2, 2, 2}, {2, 2, 2, 2, 2} }, // [2][1] { {2, 2, 2, 2, 2}, {2, 2, 2, 2, 2}, {2, 2, 2, 2, 2}, {2, 2, 2, 2, 2}, {2, 2, 2, 2, 2} }, // [2][2] { {2, 2, 2, 2, 2}, {2, 2, 2, 2, 2}, {2, 2, 2, 2, 2}, {2, 2, 2, 2, 2}, {2, 2, 2, 2, 2} }, // [2][3] { {2, 2, 2, 2, 2}, {2, 2, 2, 2, 2}, {2, 2, 2, 2, 2}, {2, 2, 2, 2, 2}, {2, 2, 2, 2, 2} }, // [2][4] { {2, 2, 2, 2, 2}, {2, 2, 2, 2, 2}, {2, 2, 2, 2, 2}, {2, 2, 2, 2, 2}, {2, 2, 2, 2, 2} } }, // [3] { // [3][0] { {3, 3, 3, 3, 3}, {3, 3, 3, 3, 3}, {3, 3, 3, 3, 3}, {3, 3, 3, 3, 3}, {3, 3, 3, 3, 3} }, // [3][1] { {3, 3, 3, 3, 3}, {3, 3, 3, 3, 3}, {3, 3, 3, 3, 3}, {3, 3, 3, 3, 3}, {3, 3, 3, 3, 3} }, // [3][2] { {3, 3, 3, 3, 3}, {3, 3, 3, 3, 3}, {3, 3, 3, 3, 3}, {3, 3, 3, 3, 3}, {3, 3, 3, 3, 3} }, // [3][3] { {3, 3, 3, 3, 3}, {3, 3, 3, 3, 3}, {3, 3, 3, 3, 3}, {3, 3, 3, 3, 3}, {3, 3, 3, 3, 3} }, // [3][4] { {3, 3, 3, 3, 3}, {3, 3, 3, 3, 3}, {3, 3, 3, 3, 3}, {3, 3, 3, 3, 3}, {3, 3, 3, 3, 3} } }, // [4] { // [4][0] { {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4} }, // [4][1] { {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4} }, // [4][2] { {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4} }, // [4][3] { {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4} }, // [4][4] { {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 4}, {4, 4, 4, 4, 401} // not found } } }; // Array of values, 4-dimensional just for the fun of it. private static final int[][][][] answer = { // [0] { // [0][0] { {123, 123, 123, 123, 123}, {123, 123, 123, 123, 123}, {123, 123, 123, 123, 123}, {123, 123, 123, 123, 123}, {123, 123, 123, 123, 123} }, // [0][1] { {123, 123, 123, 123, 123}, {123, 123, 123, 123, 123}, {123, 123, 123, 123, 123}, {123, 123, 123, 123, 123}, {123, 123, 123, 123, 123} }, // [0][2] { {123, 123, 123, 123, 123}, {123, 123, 123, 123, 123}, {123, 123, 123, 123, 123}, {123, 123, 123, 123, 123}, {123, 123, 123, 123, 123} }, // [0][3] { {123, 123, 123, 123, 123}, {123, 123, 123, 123, 123}, {123, 123, 123, 123, 123}, {123, 123, 123, 123, 123}, {123, 123, 123, 123, 123} }, // [0][4] { {123, 123, 123, 123, 123}, {123, 123, 123, 123, 123}, {123, 123, 123, 123, 123}, {123, 123, 123, 123, 123}, {123, 123, 123, 123, 123} } }, // [1] { // [1][0] { {234, 234, 234, 234, 234}, {234, 234, 234, 234, 234}, {234, 234, 234, 234, 234}, {234, 234, 234, 234, 234}, {234, 234, 234, 234, 234} }, // [1][1] { {234, 234, 234, 234, 234}, {234, 234, 234, 234, 234}, {234, 234, 234, 234, 234}, {234, 234, 234, 234, 234}, {234, 234, 234, 234, 234} }, // [1][2] { {234, 234, 234, 234, 234}, {234, 234, 234, 234, 234}, {234, 234, 234, 234, 234}, {234, 234, 234, 234, 234}, {234, 234, 234, 234, 234} }, // [1][3] { {234, 234, 234, 234, 234}, {234, 234, 234, 234, 234}, {234, 234, 234, 234, 234}, {234, 234, 234, 234, 234}, {234, 234, 234, 234, 234} }, // [1][4] { {234, 234, 234, 234, 234}, {234, 234, 234, 234, 234}, {234, 234, 234, 234, 234}, {234, 234, 234, 234, 234}, {234, 234, 234, 234, 234} } }, // [2] { // [2][0] { {345, 345, 345, 345}, {345, 345, 345, 345}, {345, 345, 345, 345}, {345, 345, 345, 345}, {345, 345, 345, 345} }, // [2][1] { {345, 345, 345, 345}, {345, 345, 345, 345}, {345, 345, 345, 345}, {345, 345, 345, 345}, {345, 345, 345, 345} }, // [2][2] { {345, 345, 345, 345}, {345, 345, 345, 345}, {345, 345, 345, 345}, {345, 345, 345, 345}, {345, 345, 345, 345} }, // [2][3] { {345, 345, 345, 345}, {345, 345, 345, 345}, {345, 345, 345, 345}, {345, 345, 345, 345}, {345, 345, 345, 345} }, // [2][4] { {345, 345, 345, 345}, {345, 345, 345, 345}, {345, 345, 345, 345}, {345, 345, 345, 345}, {345, 345, 345, 345} } }, // [3] { // [3][0] { {456, 456, 456, 456, 456}, {456, 456, 456, 456, 456}, {456, 456, 456, 456, 456}, {456, 456, 456, 456, 456}, {456, 456, 456, 456, 456} }, // [3][1] { {456, 456, 456, 456, 456}, {456, 456, 456, 456, 456}, {456, 456, 456, 456, 456}, {456, 456, 456, 456, 456}, {456, 456, 456, 456, 456} }, // [3][2] { {456, 456, 456, 456, 456}, {456, 456, 456, 456, 456}, {456, 456, 456, 456, 456}, {456, 456, 456, 456, 456}, {456, 456, 456, 456, 456} }, // [3][3] { {456, 456, 456, 456, 456}, {456, 456, 456, 456, 456}, {456, 456, 456, 456, 456}, {456, 456, 456, 456, 456}, {456, 456, 456, 456, 456} }, // [3][4] { {456, 456, 456, 456, 456}, {456, 456, 456, 456, 456}, {456, 456, 456, 456, 456}, {456, 456, 456, 456, 456}, {456, 456, 456, 456, 456} } }, // [4] { // [4][0] { {567, 567, 567, 567, 567}, {567, 567, 567, 567, 567}, {567, 567, 567, 567, 567}, {567, 567, 567, 567, 567}, {567, 567, 567, 567, 567} }, // [4][1] { {567, 567, 567, 567, 567}, {567, 567, 567, 567, 567}, {567, 567, 567, 567, 567}, {567, 567, 567, 567, 567}, {567, 567, 567, 567, 567} }, // [4][2] { {567, 567, 567, 567, 567}, {567, 567, 567, 567, 567}, {567, 567, 567, 567, 567}, {567, 567, 567, 567, 567}, {567, 567, 567, 567, 567} }, // [4][3] { {567, 567, 567, 567, 567}, {567, 567, 567, 567, 567}, {567, 567, 567, 567, 567}, {567, 567, 567, 567, 567}, {567, 567, 567, 567, 567} }, // [4][4] { {567, 567, 567, 567, 567}, {567, 567, 567, 567, 567}, {567, 567, 567, 567, 567}, {567, 567, 567, 567, 567}, {567, 567, 567, 567, 1111} } } }; public int foo(int x) { for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { for (int k = 0; k < 5; k++) { for (int l = 0; l < 5; l++) { if (keys[i][j][k][l] == x) { return answer[i][j][k][l] + keys[i][j][k][l]; } } } } } return -1; } public static void main(String[] args) { NestedSearch n = new NestedSearch(); n.foo(400); } }