Guest User

make.cpp

a guest
Aug 31st, 2016
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.46 KB | None | 0 0
  1. // Returns the maximum level the tasks of the specified vector have.
  2. unsigned short level_max (vector<item> & task) {
  3.     unsigned short level = 1;
  4.     for (unsigned int j(task.size());j-- > 0;) {
  5.         if (task[j].level > level)
  6.             level = task[j].level;
  7.     }
  8.     return level;
  9. }
  10.  
  11. bool sort_levels (item & a, item & b) {
  12.     return a.level < b.level;
  13. }
  14.  
  15. bool sort_nice (item & a, item & b) {
  16.     return a.nice() > b.nice();
  17. }
  18.  
  19. // Returns index of the first, the first that has depends != "none", or the last element with specified level.
  20. unsigned int level_range (vector<item> & task, const unsigned short level, string type) {
  21.         if (type == "begin") {
  22.             for (unsigned int j(0); j < task.size(); j++) {
  23.                 if (task[j].level == level)
  24.                     return j;
  25.                 }
  26.             }
  27.         if (type == "begin_depends") {
  28.             for (unsigned int j(0); j < task.size(); j++) {
  29.                 if (task[j].level == level && task[j].depends != "none")
  30.                     return j;
  31.                 }
  32.             }
  33.         if (type == "end") {
  34.             for (unsigned int j(task.size()); j-- > 0;) {
  35.                 if (task[j].level == level)
  36.                     return j;
  37.                 }
  38.             }      
  39. }
  40.  
  41.  
  42. // Another implementation of pushing dependent task to the task it depends on created for debug.
  43. void rotate_to_dep(vector<item> & task, int num) {
  44.     for (int j(num); j >= number(task, task[num].depends); j--) {
  45.         if (task[number(task, task[j].depends)-1].level == task[j].level)
  46.             swap(task[j],task[j-1]);
  47.     }
  48. }
  49.  
  50. void sort_nice_depends (vector<item> & task, const unsigned short level) {
  51.     unsigned int begin = level_range(task, level, "begin");
  52.     unsigned int end = level_range(task, level, "end");
  53.     unsigned int begin_depends = level_range(task, level, "begin_depends");
  54.     // Move all the "dependent" tasks to the bottom of the level.
  55.     for (unsigned int j(begin); j <= end; j++) {
  56.         if (task[j].depends != "none") {
  57.             rotate(&task[j], &task[j+1], &task[end+1]);
  58.         }
  59.     }
  60.     // Sort "independent" tasks by their nice() level in descending order.
  61.     sort (&task[begin], &task[begin_depends], sort_nice);
  62.     // Sort "dependent" tasks by their nice() level in descending order.
  63.     sort (&task[begin_depends], &task[end+1], sort_nice);
  64.     // Move "dependent" tasks below the tasks they depend on.
  65.     for (int j(begin_depends); j <= end; j++) {
  66.         if (task[number(task, task[j].depends)-1].level == task[j].level)
  67.             rotate (&task[j], &task[j-1], &task[number(task, task[j].depends)-1]);
  68.             //rotate_to_dep(task, j);
  69.            
  70.     }
  71. }
  72.  
  73. // Outputs function for tasks with level > 1.
  74. void output (vector<item> sorted, const unsigned short level, string depends) {
  75.  
  76.  
  77. }
  78.  
  79. // Outputs function for tasks with level 1.
  80. void output (vector<item> sorted) {
  81.  
  82.  
  83. }
  84.  
  85. // Puts it all together.
  86. void make (vector<item> & task) {
  87.     // First, sort all the tasks by their level form lower to higher.
  88.     sort (task.begin(), task.end(), sort_levels);
  89.    
  90.     vector <thread> sort_thread;
  91.     for (unsigned short j(1); j <= level_max(task); j++) {
  92.            sort_thread.push_back(thread(sort_nice_depends, ref(task), j));
  93.            //sort_nice_depends(task, 1);
  94.     }
  95.     for (auto j(0); j < sort_thread.size(); j++) {
  96.         if (sort_thread[j].joinable())
  97.             sort_thread[j].join();
  98.     }
  99. }
Advertisement
Add Comment
Please, Sign In to add comment