Кресты / Говнокод #9276 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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
  47. 47
  48. 48
  49. 49
// static_lit.h
#ifndef __STATIC_LIT__
#define __STATIC_LIT__

namespace
{ 
  namespace Toast
  { 
    namespace Detail
    {  
      template<int UNIT_LOCAL_UID> 
      struct TUnitUniqueId
      { 
          static int sGloballyUniqueVar; 
      }; 
 
      template<int UNIT_LOCAL_UID> 
      int TUnitUniqueId<UNIT_LOCAL_UID>::sGloballyUniqueVar = 0;
    } 
  } 
} 
 
#define GEN_UID_IMPL(line) &Toast::Detail::TUnitUniqueId<line>::sGloballyUniqueVar
//#define GEN_UID GEN_UID_IMPL(__LINE__)
#define GEN_UID GEN_UID_IMPL(__COUNTER__)
// В оригинале тут было __LINE__, однако в $тудии, сконфигурированной
// под билд в неком специфическом сдк, __LINE__ почему-то не опознавалось
// в качестве константы и не принималось в шаблон. Пришлось заменить её
// на менее портабельный, но работоспособный и, кстати, более уместный
// в этом качестве __COUNTER__.

template<class T,int* UID> 
struct StaticLit
{
  static T &Get (const char *str)
  {
    static T instance (str); // простейший случай для примера,
    // вы без труда адаптируете его к использованию синглтонов
    // и прочих премудростей
    return instance;
  }
};
  
#define SLTR_IMPL2(T,unique_id) StaticLit<T,unique_id>
#define SLTR_IMPL(T) SLTR_IMPL2(T,GEN_UID)

#define SLTR(T,str) (SLTR_IMPL(T)::Get (str))

#endif // __STATIC_LIT__

Настоящий Статический Литерал на С++
http://www.gamedev.ru/flame/forum/?id=158006
извените за игрострой

Запостил: TarasB TarasB, (Updated )

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

  • зачем это здесь?
    автор этим костылём решил проблему "а что если я не буду заводить на каждый строковый литерал отдельную переменную, а буду in-place создавать новый инстанс", сэкономил ручное кодирование, несколько замедлил по сравнению с переменной итоговую производительность/эффективность по памяти, но серьезно ускорил по сравнению с передачей ключа в виде голой строки
    Ответить
    • правда я так и не вдуплил зачем ему первая половина вон того всего, с созданием sGloballyUniqueVar
      достаточно было нечто
      struct lit_ids { 
          size_t get_or_create_id(std::string const & s);
          static lit_ids & instance() { static lit_ids instance; return instance; }
      private:
      // size_t last_id_; shared_mutex + unordered_map<std::string, size_t> for reading/writing hash set
      };
      
      template <size_t Dummy>
      struct id_instance {
          size_t get_id(std::string const & s) { 
              static size_t id = lit_ids::instance().get_or_create_id(s); 
              return id; 
          }
      };
      
      // в компиляторах, не умеющих __COUNTER__, юзать __LINE__ и не применять более одного макроса per line
      #define ID_FOR_LIT(lit)    id_instance<__COUNTER__>::get_id(lit)
      Ответить
      • Да меня тоже удивляет, зачемтак сложно всё сделан.
        Ответить
    • >Тараса укусило Гумно?
      Хех. Похоже на то.

      >Смотря какое. Тут разные есть.
      В сортах Гумна не разбираюсь.
      Ответить
  • enum круче хотя бы из-за автодополнения, заодно исключает очепятки во время компиляции. Но нет! Мы же умные, мы сами создадим себе трудности и героически их преодолеем. ИМХО Пиздец.
    Ответить

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8