00001 // Copyright CERN 2012 - Developed in collaboration with GSI 00002 00003 #ifndef DATA_STORE_H_ 00004 #define DATA_STORE_H_ 00005 00006 #include <vector> 00007 #include <string> 00008 00009 #include <stdint.h> 00010 00011 namespace fesa 00012 { 00013 00014 class AbstractField; 00015 class MultiplexingContext; 00016 class DataStoreElement; 00017 class AbstractMutex; 00018 00024 class DataStore 00025 { 00026 public: 00027 00031 DataStore(); 00032 00037 virtual ~DataStore(); 00038 00044 const std::vector<AbstractField*>& getFieldCollection(); 00045 00051 const std::vector<AbstractField*>& getPersistentFieldsCollection(); 00052 00058 AbstractField* getField(const std::string& name); 00059 00064 void synchronizeSettingFields(MultiplexingContext& context); 00065 00070 void synchronizeSettingFields(); 00071 00078 int32_t getMemorySizeToAllocate(); 00079 00087 void mapMemory(char* p, bool initializeFields); 00088 00089 protected: 00090 00096 void initializeFromElement(DataStoreElement& element); 00097 00101 virtual void initialize(); 00102 00108 void restoreFromElement(DataStoreElement& element); 00109 00114 virtual void registerField(AbstractField* pField); 00115 00120 virtual int32_t getSizeOfAdditionalFields(); 00121 00126 virtual void mapAdditionalFields(char* p); 00127 00131 std::vector<AbstractField*> pFieldCol_; 00132 00136 std::vector<AbstractField*> persistentCol_; 00137 00142 AbstractMutex* pMutex_; 00143 00144 00149 uint32_t numberOfSettingFields_; 00150 00151 00152 private: 00153 00154 template<typename GlobalDeviceType, typename DomainStoreType, typename DevInstType> 00155 friend class HeapFactory; 00156 00157 template<typename GlobalDeviceType, typename DomainStoreType, typename DevInstType> 00158 friend class DeviceFactoryImp; 00159 00160 template<typename GlobalDeviceType, typename DomainStoreType, typename DevInstType> 00161 friend class ShmFactory; 00162 00163 friend class AbstractField; 00164 friend class StoreManager; 00165 00170 void createMutex(char* pAddrMemory); 00171 00172 }; 00173 00174 inline const std::vector<AbstractField*>& DataStore::getFieldCollection() 00175 { 00176 return pFieldCol_; 00177 } 00178 00179 inline const std::vector<AbstractField*>& DataStore::getPersistentFieldsCollection() 00180 { 00181 return persistentCol_; 00182 } 00183 00184 } // fesa 00185 00186 #endif // DATA_STORE_H_