1. C++ / Говнокод #27781

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    uint16_t Mnemonic::describeMnemonics(void) const
    {
    	uint16_t result = 0;
    	size_t i = 0;
    	for (auto&& m : mnemonics)
    		result += m.index() << i++ * 4;
    
    	return result;
    }
    ...
    switch(mnemonic.describeMnemonics())
    {
    	case constructDescription(REGISTER, REGISTER):
    	{
    ...
    	}
    	break;
    
    	case constructDescription(REGISTER, CONSTANT):
    	{
    ...
    	}
    	break;
    
    	case constructDescription(REGISTER, LABEL):
    	{
    ...
    	}
    	break;
    
    	case constructDescription(REGISTER, INDIRECT_ADDRESS):
    	{
    ...
    	}
    	break;
    
    	case constructDescription(INDIRECT_ADDRESS, REGISTER):
    	{
    ...
    	}
    	break;
    
    	default:
    		break;
    
    }

    спасибо папочка за паттерн матчинг

    Запостил: digitalEugene, 01 Ноября 2021

    Комментарии (9) RSS

    • template<typename... Args>
      constexpr uint16_t constructDescription(Args... args)
      {
      	uint16_t result = 0;
      	size_t i = 0;
      	for(auto&& c : {args...})
      		result += c << i++ * 4;
      	return result;
      }
      Ответить
      • кстати std::accumulate умеет в constexpr? хочу тянсверточку
        Ответить
        • Начиная с «C++20».
          https://en.cppreference.com/w/cpp/algorithm/accumulate
          Ответить
          • заебись.
            Ответить
            • Modern C++
              template<typename... Args>
              constexpr uint16_t constructDescription(Args... args)
              {
              	size_t i = 0;
              	auto&& r = { args... };
              	return std::accumulate(r.begin(), r.end(), static_cast<uint16_t>(0), [&i]<typename T0>(T0 a, auto b) -> T0
              	{
              		return std::move(a) + static_cast<uint16_t>(b << i++ * 4);
              	});
              }
              Ответить
    • > uint16_t
      Чтобы компилятор в OOM не выпал?
      Ответить

    Добавить комментарий