ObjectsDeclarators.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #ifndef _ObjectsDeclarators_h_
  2. #define _ObjectsDeclarators_h_
  3. #include "CoreBase.h"
  4. #include "RegistryKeyAccessor.h"
  5. class ObjectsDeclarators
  6. {
  7. public:
  8. class RegList
  9. {
  10. struct RegInfo
  11. {
  12. RegObject * obj;
  13. long prev;
  14. long next;
  15. };
  16. public:
  17. RegList();
  18. //Добавить объект
  19. long Add(RegObject * obj);
  20. //Удалить объект из списка
  21. bool Del(RegObject * obj, long index, long step);
  22. //Удалить объект из списка
  23. void Del();
  24. //Проверить на правильность регистрации
  25. bool Test(RegObject * obj, long index, long step);
  26. //Установить итератор на первый элемент
  27. __forceinline void ToFirst()
  28. {
  29. current = first;
  30. }
  31. //Установить итератор на последний элемент
  32. __forceinline void ToLast()
  33. {
  34. current = last;
  35. }
  36. //Шагнуть на предыдущий элемент
  37. __forceinline void Prev()
  38. {
  39. current = objects[current].prev;
  40. }
  41. //Шагнуть на следующий элемент
  42. __forceinline void Next()
  43. {
  44. current = objects[current].next;
  45. }
  46. //Получить объект
  47. RegObject * Get();
  48. private:
  49. long firstFree; //Первый свободный индекс
  50. long first; //Первый индекс элемента
  51. long last; //Последний индекс элемента
  52. long current; //Текущая позиция итератора
  53. array<RegInfo> objects; //Объекты данного типа
  54. };
  55. private:
  56. struct DeclDesc
  57. {
  58. StormEngine_Declarator * decl; //Декларатор объекта
  59. DeclDesc * next; //Следующий с таким
  60. dword hash; //Хэшьзначение строки
  61. dword index; //Индекс текущего описателя в массиве
  62. RegList objects; //Спсок зарегистрённых объектов
  63. };
  64. struct ServiceInfo
  65. {
  66. StormEngine_Declarator * decl; //Декларатор сервиса
  67. dword creationTime; //Время создания сервиса
  68. };
  69. public:
  70. ObjectsDeclarators();
  71. ~ObjectsDeclarators();
  72. void Release();
  73. void SetAccessor(RegistryKeyAccessor * _accessor);
  74. //-------------------------------------------------------------------------------------------------------
  75. //Работа с менеджером деклараторов
  76. //-------------------------------------------------------------------------------------------------------
  77. public:
  78. //Добавить список деклараторов
  79. void AddDecls(StormEngine_Declarator * first);
  80. //Построить хэшь-таблицу по деклараторам
  81. void BuildHashTable();
  82. //Создать объект по имени
  83. RegObject * CreateObject(const char * name, bool isCreateService);
  84. //Удалить объект из списков
  85. void RemoveObject(RegObject * obj);
  86. //Найти в объекты с заданным типом
  87. RegList * Find(const char * name);
  88. //Получить список всех зарегестрированных объектов
  89. void GetRegistryObjectsList(array<string> & objects);
  90. //Создать все сервисы
  91. bool CreateServices();
  92. //-------------------------------------------------------------------------------------------------------
  93. protected:
  94. RegistryKeyAccessor * accessor;
  95. array<DeclDesc> declDesc;
  96. bool needUpdateHash;
  97. DeclDesc * entryTable[256];
  98. RegList objects;
  99. };
  100. #endif