vaults_bank.h 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #ifndef __VAULTS_BANK
  2. #define __VAULTS_BANK
  3. #include <string>
  4. #include <unordered_map>
  5. struct VaultsBank {
  6. std::unordered_map<tag_t,Vault> bank;
  7. counters::Counts fixed_counts;
  8. counters::Counts semirandom_counts;
  9. counters::Counts random_counts;
  10. void copy(const Vault& s) {
  11. if (bank.count(s.tag) != 0) {
  12. throw std::runtime_error("Duplicate vaults tag");
  13. }
  14. bank[s.tag] = s;
  15. switch (s.type) {
  16. case Vault::type_t::FIXED:
  17. fixed_counts.init(s.tag, s.level, s.count);
  18. break;
  19. case Vault::type_t::SEMIRANDOM:
  20. semirandom_counts.init(s.tag, s.level, s.count);
  21. break;
  22. case Vault::type_t::RANDOM:
  23. random_counts.init(s.tag, s.level, s.count);
  24. break;
  25. }
  26. }
  27. const Vault& get(tag_t tag) const {
  28. auto i = bank.find(tag);
  29. if (i == bank.end()) {
  30. throw std::runtime_error("Invalid vaults tag");
  31. }
  32. return i->second;
  33. }
  34. };
  35. inline VaultsBank& __vaults__() {
  36. static VaultsBank ret;
  37. return ret;
  38. }
  39. inline const VaultsBank& vaults() {
  40. return __vaults__();
  41. }
  42. inline void init_vault_copy(const Vault& s) {
  43. __vaults__().copy(s);
  44. }
  45. #endif