Advertisement
sciencefyll

std::map and custom compare parameter

Apr 3rd, 2016
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. void initiateMenu()
  2. {
  3.     std::string selection;
  4.  
  5.     /**
  6.      * Entry data content
  7.      */
  8.     struct entry {
  9.         std::string state;
  10.         std::string description;
  11.         int minAuth;
  12.         int maxAuth;
  13.         void (*fptr)();
  14.         bool active = false;
  15.     };
  16.  
  17.     /**
  18.      * Menu list
  19.      */
  20.     std::map<std::string, entry> entries;
  21.  
  22.     /**
  23.      * add menu entries!
  24.      */
  25.     entries["KR"] = {"/",       "Customer registration",                    GUEST,      ADMIN, registerCustomer};
  26.     entries["KL"] = {"/",       "Customer login",                           GUEST,      GUEST, loginCustomer};
  27.     entries["KU"] = {"/",       "Customer logout",                          CUSTOMER,   ADMIN, logoutCustomer};
  28.     entries["KS"] = {"/",       "Display my items",                         CUSTOMER,   ADMIN, displayCustomerItems};
  29.     entries["KE"] = {"/",       "Update customers authorization access",    ADMIN,      ADMIN, setAuthorityLevel};
  30.  
  31.     /**
  32.      * Start the program loop.
  33.      */
  34.     do {
  35.         bool authenticated = customers->authenticated();
  36.         int authorization  = authenticated ? customers->session()->returnAuth() : GUEST;
  37.  
  38.         /**
  39.          * Display that a customer is logged in
  40.          *  if his / her session is successfully set.
  41.          */
  42.         if (customers->authenticated()) {
  43.             std::cout
  44.                 << "Logged in as: "
  45.                 << customers->session()->username()
  46.                 << std::endl;
  47.         }
  48.  
  49.         /**
  50.          * Print the menu, with command options.
  51.          *
  52.          * ROOT_STATE == /
  53.          */
  54.         std::cout << "------------------ MENU ------------------" << std::endl;
  55.         for (auto & i : entries) {
  56.             i.second.active = false;
  57.  
  58.             std::string state   = i.second.state;
  59.             int minAuth         = i.second.minAuth;
  60.             int maxAuth         = i.second.maxAuth;
  61.  
  62.             /**
  63.              * If the current entry does not follow the rules for being displayed,
  64.              *  we ignore the rest of the round and go to the next entry.
  65.              */
  66.             if (state != "*") {
  67.                 if (authenticated && state != customers->state()) {
  68.                     continue;
  69.                 }
  70.  
  71.                 if (!authenticated && minAuth > GUEST) {
  72.                     continue;
  73.                 }
  74.  
  75.                 if (authenticated && minAuth > authorization) {
  76.                     continue;
  77.                 }
  78.  
  79.                 if (authenticated && maxAuth < authorization) {
  80.                     continue;
  81.                 }
  82.  
  83.                 if (!authenticated && state != ROOT_STATE) {
  84.                     continue;
  85.                 }
  86.             }
  87.  
  88.             /**
  89.              * prints out the menu entry: COMMAND - description
  90.              */
  91.             std::cout
  92.                 << i.first
  93.                 << " - "
  94.                 << i.second.description
  95.                 << std::endl;
  96.  
  97.             /**
  98.              * let the program know which commands were displayed.
  99.              */
  100.             i.second.active = true;
  101.         }
  102.  
  103.         /**
  104.          * Retrieves the selected option as a string by the customer.
  105.          *  The string is then converted to an enum, and
  106.          */
  107.         selection = getInput("Menu choice", 1, 2, true);   // Get command from user. Lengths; min: 1, max: 2. Uppercase.
  108.  
  109.         /**
  110.          * When the returned position isn't set to the end()[index value]
  111.          *  there was a match.
  112.          */
  113.         if (entries.find(selection) != entries.end()) {
  114.             //set user state
  115.             //TODO: add this after function pointer, and add a way for categories to use their ID in stead.
  116.             customers->updateState(selection);
  117.  
  118.             // call function stored in entry
  119.             (*entries.at(selection).fptr)(); //TODO: do i need to add a * in front of entries. ?
  120.         }
  121.  
  122.     } while ( !(selection == "Q" && customers->state() == "/") );
  123. }
  124.  
  125. /* OUTPUT
  126. ------------------ MENU ------------------
  127. Q  - Quit current task / program
  128. KL - Customer login
  129. KR - Customer registration
  130. Menu choice:
  131. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement