[591] | 1 | #ifndef __XIOS_CObjectFactory_impl__ |
---|
| 2 | #define __XIOS_CObjectFactory_impl__ |
---|
[219] | 3 | |
---|
[352] | 4 | #include "object_factory.hpp" |
---|
| 5 | |
---|
[335] | 6 | namespace xios |
---|
[219] | 7 | { |
---|
| 8 | /// ////////////////////// Définitions ////////////////////// /// |
---|
| 9 | template <typename U> |
---|
| 10 | int CObjectFactory::GetObjectNum(void) |
---|
| 11 | { |
---|
| 12 | if (CurrContext.size() == 0) |
---|
| 13 | ERROR("CObjectFactory::GetObjectNum(void)", |
---|
| 14 | << "please define current context id !"); |
---|
| 15 | return (U::AllVectObj[CObjectFactory::CurrContext].size()); |
---|
| 16 | } |
---|
| 17 | |
---|
| 18 | template <typename U> |
---|
| 19 | int CObjectFactory::GetObjectIdNum(void) |
---|
| 20 | { |
---|
| 21 | if (CurrContext.size() == 0) |
---|
| 22 | ERROR("CObjectFactory::GetObjectIdNum(void)", |
---|
| 23 | << "please define current context id !"); |
---|
| 24 | return (U::AllMapObj[CObjectFactory::CurrContext].size()); |
---|
| 25 | } |
---|
| 26 | |
---|
| 27 | template <typename U> |
---|
| 28 | bool CObjectFactory::HasObject(const StdString & id) |
---|
| 29 | { |
---|
| 30 | if (CurrContext.size() == 0) |
---|
| 31 | ERROR("CObjectFactory::HasObject(const StdString & id)", |
---|
| 32 | << "[ id = " << id << " ] please define current context id !"); |
---|
| 33 | return (U::AllMapObj[CObjectFactory::CurrContext].find(id) != |
---|
| 34 | U::AllMapObj[CObjectFactory::CurrContext].end()); |
---|
| 35 | } |
---|
| 36 | |
---|
| 37 | template <typename U> |
---|
[286] | 38 | bool CObjectFactory::HasObject(const StdString & context, const StdString & id) |
---|
| 39 | { |
---|
| 40 | if (U::AllMapObj.find(context) == U::AllMapObj.end()) return false ; |
---|
| 41 | else return (U::AllMapObj[context].find(id) != U::AllMapObj[context].end()); |
---|
| 42 | } |
---|
| 43 | |
---|
| 44 | template <typename U> |
---|
[1542] | 45 | std::shared_ptr<U> CObjectFactory::GetObject(const U * const object) |
---|
[219] | 46 | { |
---|
| 47 | if (CurrContext.size() == 0) |
---|
| 48 | ERROR("CObjectFactory::GetObject(const U * const object)", |
---|
| 49 | << "please define current context id !"); |
---|
[1542] | 50 | std::vector<std::shared_ptr<U> > & vect = |
---|
[219] | 51 | U::AllVectObj[CObjectFactory::CurrContext]; |
---|
[769] | 52 | |
---|
[1542] | 53 | typename std::vector<std::shared_ptr<U> >::const_iterator |
---|
[219] | 54 | it = vect.begin(), end = vect.end(); |
---|
[769] | 55 | |
---|
[219] | 56 | for (; it != end; it++) |
---|
| 57 | { |
---|
[1542] | 58 | std::shared_ptr<U> ptr = *it; |
---|
[219] | 59 | if (ptr.get() == object) |
---|
| 60 | return (ptr); |
---|
| 61 | } |
---|
[769] | 62 | |
---|
[219] | 63 | ERROR("CObjectFactory::GetObject(const U * const object)", |
---|
[680] | 64 | << "[type = " << U::GetName() << ", adress = " << object << "] " |
---|
| 65 | << "object was not found."); |
---|
[1542] | 66 | return (std::shared_ptr<U>()); // jamais atteint |
---|
[219] | 67 | } |
---|
| 68 | |
---|
| 69 | template <typename U> |
---|
[1542] | 70 | std::shared_ptr<U> CObjectFactory::GetObject(const StdString & id) |
---|
[219] | 71 | { |
---|
| 72 | if (CurrContext.size() == 0) |
---|
| 73 | ERROR("CObjectFactory::GetObject(const StdString & id)", |
---|
| 74 | << "[ id = " << id << " ] please define current context id !"); |
---|
| 75 | if (!CObjectFactory::HasObject<U>(id)) |
---|
| 76 | ERROR("CObjectFactory::GetObject(const StdString & id)", |
---|
| 77 | << "[ id = " << id << ", U = " << U::GetName() << " ] " |
---|
[680] | 78 | << "object was not found."); |
---|
[219] | 79 | return (U::AllMapObj[CObjectFactory::CurrContext][id]); |
---|
| 80 | } |
---|
| 81 | |
---|
| 82 | template <typename U> |
---|
[1542] | 83 | std::shared_ptr<U> CObjectFactory::GetObject(const StdString & context, const StdString & id) |
---|
[286] | 84 | { |
---|
| 85 | if (!CObjectFactory::HasObject<U>(context,id)) |
---|
| 86 | ERROR("CObjectFactory::GetObject(const StdString & id)", |
---|
| 87 | << "[ id = " << id << ", U = " << U::GetName() <<", context = "<<context<< " ] " |
---|
[680] | 88 | << "object was not found."); |
---|
[300] | 89 | return (U::AllMapObj[context][id]); |
---|
[286] | 90 | } |
---|
| 91 | |
---|
| 92 | template <typename U> |
---|
[1542] | 93 | std::shared_ptr<U> CObjectFactory::CreateObject(const StdString& id) |
---|
[219] | 94 | { |
---|
[769] | 95 | if (CurrContext.empty()) |
---|
| 96 | ERROR("CObjectFactory::CreateObject(const StdString& id)", |
---|
[219] | 97 | << "[ id = " << id << " ] please define current context id !"); |
---|
[769] | 98 | |
---|
| 99 | if (CObjectFactory::HasObject<U>(id)) |
---|
[219] | 100 | { |
---|
[769] | 101 | return CObjectFactory::GetObject<U>(id); |
---|
[219] | 102 | } |
---|
| 103 | else |
---|
| 104 | { |
---|
[1542] | 105 | std::shared_ptr<U> value(new U(id.empty() ? CObjectFactory::GenUId<U>() : id)); |
---|
[769] | 106 | |
---|
| 107 | U::AllVectObj[CObjectFactory::CurrContext].insert(U::AllVectObj[CObjectFactory::CurrContext].end(), value); |
---|
| 108 | U::AllMapObj[CObjectFactory::CurrContext].insert(std::make_pair(value->getId(), value)); |
---|
| 109 | |
---|
| 110 | return value; |
---|
[219] | 111 | } |
---|
| 112 | } |
---|
| 113 | |
---|
| 114 | template <typename U> |
---|
[1542] | 115 | const std::vector<std::shared_ptr<U> > & |
---|
[219] | 116 | CObjectFactory::GetObjectVector(const StdString & context) |
---|
| 117 | { |
---|
| 118 | return (U::AllVectObj[context]); |
---|
| 119 | } |
---|
[769] | 120 | |
---|
| 121 | template <typename U> |
---|
| 122 | const StdString& CObjectFactory::GetUIdBase(void) |
---|
| 123 | { |
---|
| 124 | static const StdString base = "__" + U::GetName() + "_undef_id_"; |
---|
| 125 | return base; |
---|
| 126 | } |
---|
| 127 | |
---|
| 128 | template <typename U> |
---|
| 129 | StdString CObjectFactory::GenUId(void) |
---|
| 130 | { |
---|
| 131 | StdOStringStream oss; |
---|
| 132 | oss << GetUIdBase<U>() << U::GenId[CObjectFactory::CurrContext]++; |
---|
| 133 | return oss.str(); |
---|
| 134 | } |
---|
| 135 | |
---|
| 136 | template <typename U> |
---|
| 137 | bool CObjectFactory::IsGenUId(const StdString& id) |
---|
| 138 | { |
---|
| 139 | const StdString& base = GetUIdBase<U>(); |
---|
| 140 | return (id.size() > base.size() && id.compare(0, base.size(), base) == 0); |
---|
| 141 | } |
---|
| 142 | |
---|
[335] | 143 | } // namespace xios |
---|
[219] | 144 | |
---|
[591] | 145 | #endif // __XIOS_CObjectFactory_impl__ |
---|