Advertisement
JoshDreamland

C++ String Switch v2

Dec 14th, 2014
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.82 KB | None | 0 0
  1. while (sscanf(remainder, "%s%n", buf, &consumed) == 1) {
  2.   string value;
  3.   string flag = buf;
  4.   size_t eqAt = flag.find('=');
  5.   if (eqAt != string::npos) {
  6.     value = flag.substr(eqAt + 1);
  7.     flag.erase(eqAt);
  8.   }
  9.   switch (hash(flag)) {
  10.     case str_case(flag, "Blends") {
  11.       tileProp.blends = true;
  12.       break;
  13.     }
  14.     case str_case(flag, "Framed") {
  15.       tileProp.isFramed = true;
  16.       break;
  17.     }
  18.     case str_case(flag, "UnFramed") {
  19.       break;
  20.     }
  21.     case str_case(flag, "Solid") {
  22.       tileProp.isSolid = true;
  23.       break;
  24.     }
  25.     case str_case(flag, "SolidTop") {
  26.       tileProp.topIsSolid = true;
  27.       break;
  28.     }
  29.     case str_case(flag, "Platform") {
  30.       tileProp.isPlatform = true;
  31.       break;
  32.     }
  33.     case str_case(flag, "Merge") {
  34.       tileProp.blendWith = atol(value.c_str());
  35.       break;
  36.     }
  37.     case str_case(flag, "Stone") {
  38.       tileProp.isStone = true;
  39.       break;
  40.     }
  41.     case str_case(flag, "Grass") {
  42.       tileProp.isGrass = true;
  43.       break;
  44.     }
  45.     case str_case(flag, "OnCeil") {
  46.       tileProp.placement = TilePlacement::ON_CEILING;
  47.       break;
  48.     }
  49.     case str_case(flag, "OnFaces") {
  50.       tileProp.placement = TilePlacement::ON_FACES;
  51.       break;
  52.     }
  53.     case str_case(flag, "OnFloorSurf") {
  54.       tileProp.placement = TilePlacement::ON_FACES;
  55.       break;
  56.     }
  57.     case str_case(flag, "OnFloor") {
  58.       tileProp.placement = TilePlacement::ON_FLOOR;
  59.       break;
  60.     }
  61.     case str_case(flag, "OnSurf") {
  62.       tileProp.placement = TilePlacement::ON_SURFACES;
  63.       break;
  64.     }
  65.     case str_case(flag, "OnTorch") {
  66.       tileProp.placement = TilePlacement::ON_TORCH_PTS;
  67.       break;
  68.     }
  69.     case str_case(flag, "OnWall") {
  70.       tileProp.placement = TilePlacement::ON_WALLS;
  71.       break;
  72.     }
  73.     case str_case(flag, "AsDoor") {
  74.       tileProp.placement = TilePlacement::AS_DOOR;
  75.       break;
  76.     }
  77.     case str_case(flag, "Light") {
  78.       tileProp.isLightSource = true;
  79.       break;
  80.     }
  81.     case str_case(flag, "TX") {
  82.       tileProp.tX = atol(value.c_str());
  83.       break;
  84.     }
  85.     case str_case(flag, "TY") {
  86.       tileProp.tY = atol(value.c_str());
  87.       break;
  88.     }
  89.     default:
  90.       fprintf(stderr, "Unknown flag %s\n", flag.c_str());
  91.       return 2;
  92.   }
  93.   remainder += consumed;
  94. }
  95.  
  96. // The magic
  97. constexpr int filthyHash(const char *x, int y, int z, int res) {
  98.   return z < y
  99.       ? filthyHash(x, y, z + 1, (int)((long)res * 31 + x[z]))
  100.       : res;
  101. }
  102. constexpr int cleanHash(const char* x, int y) {
  103.   return filthyHash(x, y, 0, 0) << 4 | (y & ((1 << 4) - 1));
  104. }
  105. template<size_t N> constexpr int dirtyHash(const char (&x)[N]) {
  106.   return cleanHash(x, N - 1);
  107. }
  108. int hash(string x) {
  109.   return cleanHash(x.c_str(), x.length());
  110. }
  111. #define str_case(key, x) dirtyHash(x): if ((key) == (x))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement