source: XIOS/dev/dev_ym/XIOS_COUPLING/src/object_factory_impl.hpp @ 2230

Last change on this file since 2230 was 2183, checked in by ymipsl, 3 years ago

Change object undef id for better output in netcdf file :
#context::#object_undef_id_#num -> #context#object_undef_id#num
ex :
atm::axis_undef_id_10 -> atmaxis_undef_id_10

YM

  • Property copyright set to
    Software name : XIOS (Xml I/O Server)
    http://forge.ipsl.jussieu.fr/ioserver
    Creation date : January 2009
    Licence : CeCCIL version2
    see license file in root directory : Licence_CeCILL_V2-en.txt
    or http://www.cecill.info/licences/Licence_CeCILL_V2-en.html
    Holder : CEA/LSCE (Laboratoire des Sciences du CLimat et de l'Environnement)
    CNRS/IPSL (Institut Pierre Simon Laplace)
    Project Manager : Yann Meurdesoif
    yann.meurdesoif@cea.fr
File size: 5.9 KB
RevLine 
[591]1#ifndef __XIOS_CObjectFactory_impl__
2#define __XIOS_CObjectFactory_impl__
[219]3
[352]4#include "object_factory.hpp"
5
[335]6namespace 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>
[1869]115   std::shared_ptr<U> CObjectFactory::CreateAlias(const StdString& id, const StdString& alias)
116   {
117      if (CurrContext.empty())
118         ERROR("CObjectFactory::CreateAlias(const StdString& id, const StdString& alias)",
119               << "[ id = " << id << " alias = "<<alias<<" ] please define current context id !");
120
121      if (CObjectFactory::HasObject<U>(alias))
122      {
123         return CObjectFactory::GetObject<U>(alias);
124      }
125      else
126      {
127        if (! CObjectFactory::HasObject<U>(id))
128        {
129            ERROR("CObjectFactory::CreateAlias(const StdString& id, const StdString& alias)",
130               << "[ id = " << id << " alias = "<<alias<<" ] object id doesn't exist"); 
131        }
132        else 
133        {
134          std::shared_ptr<U> value = CObjectFactory::GetObject<U>(id); 
135          U::AllMapObj[CObjectFactory::CurrContext].insert(std::make_pair(alias, value));
136          return value;
137         }
138      }
139   }
140
141   template <typename U>
[1542]142      const std::vector<std::shared_ptr<U> > &
[219]143         CObjectFactory::GetObjectVector(const StdString & context)
144   {
145      return (U::AllVectObj[context]);
146   }
[769]147
148   template <typename U>
149   const StdString& CObjectFactory::GetUIdBase(void)
150   {
[2124]151      static StdString base ; 
[2183]152//      base = "__"+CObjectFactory::CurrContext + "::" + U::GetName() + "_undef_id_";
153      base = CObjectFactory::CurrContext + "__" + U::GetName() + "_undef_id_";
[769]154      return base;
155   }
156
157   template <typename U>
158   StdString CObjectFactory::GenUId(void)
159   {
160      StdOStringStream oss;
161      oss << GetUIdBase<U>() << U::GenId[CObjectFactory::CurrContext]++;
162      return oss.str();
163   }
164
165   template <typename U>
166   bool CObjectFactory::IsGenUId(const StdString& id)
167   {
168      const StdString& base = GetUIdBase<U>();
169      return (id.size() > base.size() && id.compare(0, base.size(), base) == 0);
170   }
171
[335]172} // namespace xios
[219]173
[591]174#endif // __XIOS_CObjectFactory_impl__
Note: See TracBrowser for help on using the repository browser.