Advertisement
zamotivator

Untitled

Jul 25th, 2014
275
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.68 KB | None | 0 0
  1. // Данный класс позволяет отобразить типы данных в runtime числовые значения
  2. //
  3. // UniqueTag - это уникальный идентификатор отдельного индекса
  4. //
  5. // Внутри индекс для каждого типа хранится в статической локальной переменной шаблонного метода data<T>()
  6. // Счётчик кодируется так:
  7. //     >=0  зарегистрирован
  8. //     -1   не регистрировался
  9. template<typename UniqueTag> class TypeIndex
  10. {
  11.     typedef TypeIndex<UniqueTag> _Index;
  12. public:
  13.     // индекс типа, -1 если тип не регистрировался или был удалён
  14.     template<typename T> static int get()
  15.     {
  16.         return singleton().data<T>();
  17.     }
  18.     // сообщить регистрировался тип данных в индексе или нет
  19.     template<typename T> static bool valid()
  20.     {
  21.         return singleton().data<T>() != -1;
  22.     }
  23.  
  24.     template<typename T> static int add()
  25.     {
  26.         int& value = singleton().data<T>();
  27.         if (value == -1)
  28.             // не встречался ранее - регистрируем
  29.             value = singleton().m_Total++;
  30.         return value;
  31.     }
  32.  
  33.     static uint32_t size()
  34.     {
  35.         return singleton().m_Total;
  36.     }
  37. private:
  38.     static _Index& singleton()
  39.     {
  40.         static _Index sResult;
  41.         return sResult;
  42.     }
  43.     uint32_t m_Total = 0;
  44.     template<typename T> int& data() const
  45.     {
  46.         static int sResult = -1;
  47.         return sResult;
  48.     }
  49. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement