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

    +153

    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
    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, 31 Января 2012

    Комментарии (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 круче хотя бы из-за автодополнения, заодно исключает очепятки во время компиляции. Но нет! Мы же умные, мы сами создадим себе трудности и героически их преодолеем. ИМХО Пиздец.
      Ответить
    • Я парень, 24 года. Хочу отсосать у кавказца. Пиши желательно с фото на [email protected], вышлю в ответ
      Ответить

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