#ifndef UBASEPROPCREATOR_H #define UBASEPROPCREATOR_H #include "UBasePropCreatorTempl.h" namespace RDK { // Отвечает за создание функции для формирования базовых свойств class UBasePropCreator: public UBasePropCreatorTempl { public: // Основная функция создания свойств всех возможных типов (добавляется в Storage) static bool BaseCrPropMock(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet); // Функция вызывает необходимые фукнции в зависимости от типа (строка) свойства template class PropType, unsigned int TypeInt> static void CreateProperty(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet, unsigned int ptype); // Проверяет тип на встроенные типы данных и создает, если это так template class PropType, unsigned int TypeInt> static bool CreateSimpleTypeProperty(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet, unsigned int ptype); // Функция для создания свойства типа list template class PropType, unsigned int TypeInt> static void CreatePropertyList(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet, unsigned int ptype); // Функция для создания свойства типа std::pair template class PropType, unsigned int TypeInt> static void CreatePropertyPair(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet, unsigned int ptype); // Функция для создания свойства типа std::map template class PropType, unsigned int TypeInt> static void CreatePropertyMap(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet, unsigned int ptype); }; // Функция вызывает необходимые фукнции в зависимости от типа (строка) свойства template class PropType, unsigned int TypeInt> void UBasePropCreator::CreateProperty(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet, unsigned int ptype) { std::string type = serstorage->GetNodeAttribute("Type"); // Проверка на встроенный ли тип данных у свойства // Если да - создание и выход if(CreateSimpleTypeProperty(serstorage,mock_unet, ptype)) return; // Строка if(type == "std::string") { CreatorProperty::CreatePropertyByType(serstorage,mock_unet, ptype); return; } // Для list if(type == "std::list") { CreatePropertyList(serstorage,mock_unet, ptype); return; } // Для pair if(type == "std::pair") { CreatePropertyPair(serstorage,mock_unet, ptype); return; } // Для map if(type == "std::map") { CreatePropertyMap(serstorage,mock_unet, ptype); return; } //UBMColorModel if(type == "UBMColorModel") { CreatorProperty::CreatePropertyByType(serstorage,mock_unet, ptype); return; } // UColorT if(type == "UColorT") { CreatorProperty::CreatePropertyByType(serstorage,mock_unet, ptype); return; } // UBitmap if(type == "UBitmap") { CreatorProperty::CreatePropertyByType(serstorage,mock_unet, ptype); return; } // UBRect if(type == "UBRect") { CreatorProperty::CreatePropertyByType(serstorage,mock_unet, ptype); return; } // UBPoint if(type == "UBPoint") { CreatorProperty::CreatePropertyByType(serstorage,mock_unet, ptype); return; } // pointer if(type == "pointer") { CreatorProperty::CreatePropertyByType(serstorage, mock_unet, ptype); return; } } // Проверяет тип на встроенные типы данных и создает, если это так template class PropType, unsigned int TypeInt> bool UBasePropCreator::CreateSimpleTypeProperty(RDK::USerStorageXML* serstorage, RDK::UMockUNet * mock_unet, unsigned int ptype) { std::string type = serstorage->GetNodeAttribute("Type"); std::string prop_name = serstorage->GetNodeName(); // Встроенные типы if(type == typeid(bool).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet, ptype); return true; } if(type == typeid(char).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet, ptype); return true; } if(type == typeid(unsigned char).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet, ptype); return true; } if(type == typeid(short).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet, ptype); return true; } if(type == typeid(unsigned short).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet, ptype); return true; } if(type == typeid(int).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet, ptype); return true; } if(type == typeid(unsigned int).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet, ptype); return true; } if(type == typeid(long).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet, ptype); return true; } if(type == typeid(unsigned long).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet, ptype); return true; } if(type == typeid(long long).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet, ptype); return true; } if(type == typeid(unsigned long long).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet, ptype); return true; } if(type == typeid(float).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet, ptype); return true; } if(type == typeid(double).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet, ptype); return true; } if(type == typeid(long double).name()) { CreatorProperty::CreatePropertyByType(serstorage, mock_unet, ptype); return true; } //throw ParseException("can't handle simple type: " + type); return false; } // Функция для создания свойства типа list template class PropType, unsigned int TypeInt> void UBasePropCreator::CreatePropertyList(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet, unsigned int ptype) { std::string prop_name = serstorage->GetNodeName(); int size=serstorage->GetNumNodes(); // если вектор пуст берем тип - elemType // если есть элементы берем тип элементов std::string type; if(size == 0) { type = serstorage->GetNodeAttribute("elemType"); } else { serstorage->SelectNode("elem",size-1); type = serstorage->GetNodeAttribute("elemType"); serstorage->SelectUp(); } if(type == typeid(bool).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } if(type == typeid(char).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } if(type == typeid(unsigned char).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } if(type == typeid(short).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } if(type == typeid(unsigned short).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } if(type == typeid(int).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } if(type == typeid(unsigned int).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } if(type == typeid(long).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } if(type == typeid(unsigned long).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } if(type == typeid(long long).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } if(type == typeid(unsigned long long).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } if(type == typeid(float).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } if(type == typeid(double).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } if(type == typeid(long double).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } } // Функция для создания свойства типа std::pair template class PropType, unsigned int TypeInt> void UBasePropCreator::CreatePropertyPair(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet, unsigned int ptype) { std::string prop_name = serstorage->GetNodeName(); int size=serstorage->GetNumNodes(); if(size!=2) return; std::string first_type; std::string second_type; serstorage->SelectNode("first"); first_type = serstorage->GetNodeAttribute("Type"); serstorage->SelectUp(); serstorage->SelectNode("second"); second_type = serstorage->GetNodeAttribute("Type"); serstorage->SelectUp(); if(first_type == "std::string") { if(second_type == "std::string") { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } if(second_type == typeid(int).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } if(second_type == typeid(bool).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } } if(second_type == "std::string") { if(first_type == typeid(int).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } } if(first_type == typeid(int).name()) { if(second_type == "UColorT") { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } } if(first_type == typeid(double).name()) { if(second_type == typeid(int).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } } } // Функция для создания свойства типа std::map template class PropType, unsigned int TypeInt> void UBasePropCreator::CreatePropertyMap(RDK::USerStorageXML* serstorage, RDK::UMockUNet* mock_unet, unsigned int ptype) { std::string prop_name = serstorage->GetNodeName(); std::string first_type; std::string second_type; int size=serstorage->GetNumNodes(); //Если есть элементы if(serstorage->SelectNode("elem",size-1)) { size=serstorage->GetNumNodes(); if(size!=2) { serstorage->SelectUp(); return; } serstorage->SelectNode("first"); first_type = serstorage->GetNodeAttribute("Type"); serstorage->SelectUp(); serstorage->SelectNode("second"); second_type = serstorage->GetNodeAttribute("Type"); serstorage->SelectUp(); serstorage->SelectUp(); } else { first_type = serstorage->GetNodeAttribute("firstType"); second_type = serstorage->GetNodeAttribute("secondType"); } if(first_type == "std::string") { if(second_type == "std::string") { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } if(second_type == typeid(int).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } if(second_type == typeid(bool).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } if(second_type.find("MDVector",0) == 0) { // Удаление слова MDVector size_t pos = second_type.find("MDVector"); if (pos != std::string::npos) { second_type.erase(pos, std::string("MDVector").length()); } // Удаление символов '<' и '>' second_type.erase(std::remove(second_type.begin(), second_type.end(), '>'), second_type.end()); second_type.erase(std::remove(second_type.begin(), second_type.end(), '<'), second_type.end()); std::string matrix_type = second_type; if(matrix_type == typeid(int).name()) { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } } } if(first_type == typeid(int).name()) { if(second_type == "UColorT") { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } if(second_type == "std::string") { CreatorProperty >::CreatePropertyByType(serstorage, mock_unet, ptype); return; } } } } #endif // UBASEPROPCREATOR_H