source: XIOS/dev/dev_ym/XIOS_COUPLING/src/object_template_impl.hpp @ 1787

Last change on this file since 1787 was 1784, checked in by ymipsl, 4 years ago
  • Preparing coupling functionalities.
  • Make some cleaner things

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: 15.6 KB
Line 
1#ifndef __XIOS_CObjectTemplate_impl__
2#define __XIOS_CObjectTemplate_impl__
3
4#include "xios_spl.hpp"
5#include "context_client.hpp"
6#include "object_factory.hpp"
7#include "context.hpp"
8#include "buffer_in.hpp"
9#include "attribute.hpp"
10#include "event_client.hpp"
11#include "object_template.hpp"
12#include "context_client.hpp"
13#include "indent.hpp"
14#include "type_util.hpp"
15#include "message.hpp"
16#include "type.hpp"
17#include "type_util.hpp"
18#include "group_template.hpp"
19
20namespace xios
21{
22   /// ////////////////////// Définitions ////////////////////// ///
23   template <class T>
24      xios_map<StdString,
25      xios_map<StdString,
26      std::shared_ptr<T> > > CObjectTemplate<T>::AllMapObj;
27
28   template <class T>
29      xios_map<StdString,
30      std::vector<std::shared_ptr<T> > > CObjectTemplate<T>::AllVectObj;
31
32   template <class T>
33      xios_map<StdString,long int> CObjectTemplate<T>::GenId;
34
35   template <class T>
36      CObjectTemplate<T>::CObjectTemplate(void)
37         : CAttributeMap()
38         , CObject()
39   { /* Ne rien faire de plus */ }
40
41   template <class T>
42      CObjectTemplate<T>::CObjectTemplate(const StdString & id)
43         : CAttributeMap()
44         , CObject(id, CObjectFactory::IsGenUId<T>(id))
45   { /* Ne rien faire de plus */ }
46
47   template <class T>
48      CObjectTemplate<T>::CObjectTemplate
49         (const CObjectTemplate<T> & object, bool withAttrList, bool withId)
50         : CAttributeMap()
51         , CObject()
52   {
53      if (object.hasId() && withId)
54         this->setId(object.getId(), object.hasAutoGeneratedId());
55      ERROR("CObjectTemplate<T> construtor 3", << "Not completly implemented yet !");
56   }
57
58   template <class T>
59      CObjectTemplate<T>::~CObjectTemplate(void)
60   { /* Ne rien faire de plus */ }
61
62   ///--------------------------------------------------------------
63
64   template <class T>
65      std::vector<std::shared_ptr<T> > &
66         CObjectTemplate<T>::GetAllVectobject(const StdString & contextId)
67   {
68      return (CObjectTemplate<T>::AllVectObj[contextId]);
69   }
70
71   //---------------------------------------------------------------
72
73   template <class T>
74      StdString CObjectTemplate<T>::toString(void) const
75   {
76      StdOStringStream oss;
77      oss << "<" << T::GetName();
78      if (this->hasId())
79         oss << " id=\"" << this->getId() << "\"";
80      oss << " " << SuperClassMap::toString() << "/>";
81      return (oss.str());
82   }
83
84   template <class T>
85      void CObjectTemplate<T>::fromString(const StdString & str)
86   {
87      ERROR("CObjectTemplate<T>::fromString(str)",
88            << "[ str = " << str << "] Not implemented yet !");
89   }
90
91   //---------------------------------------------------------------
92
93/*
94   template <class T>
95      void CObjectTemplate<T>::toBinary(StdOStream & os) const
96   {
97      SuperClassMap::toBinary(os);
98   }
99
100   template <class T>
101      void CObjectTemplate<T>::fromBinary(StdIStream & is)
102   {
103      SuperClassMap::fromBinary(is);
104   }
105*/
106
107   //---------------------------------------------------------------
108
109   template <class T>
110      void CObjectTemplate<T>::parse(xml::CXMLNode & node)
111   TRY
112   {
113      xml::THashAttributes attributes = node.getAttributes();
114      CAttributeMap::setAttributes(attributes);
115   }
116   CATCH
117
118   //---------------------------------------------------------------
119
120   template <class T>
121      ENodeType CObjectTemplate<T>::getType(void) const
122   {
123      return (T::GetType());
124   }
125
126   template <class T>
127   string CObjectTemplate<T>::getName(void) const
128   {
129      return (T::GetName());
130   }
131
132   //---------------------------------------------------------------
133
134   template <class T>
135      bool CObjectTemplate<T>::hasChild(void) const
136   {
137      return (false);
138   }
139
140   /*!
141     Compare two object of same type
142   */
143   template <class T>
144   bool CObjectTemplate<T>::isEqual(const string& id, const vector<StdString>& excludedAttrs)
145   {
146      T* obj = CObjectTemplate<T>::get(id);
147      return this->isEqual(obj, excludedAttrs);
148   }
149
150   template <class T>
151   bool CObjectTemplate<T>::isEqual(T* obj, const vector<StdString>& excludedAttrs)
152   {
153
154      CAttributeMap& attrMapThis = *this;
155      CAttributeMap& attrMapObj  = *obj;
156      return (attrMapThis.isEqual(attrMapObj, excludedAttrs));
157   }
158
159   //---------------------------------------------------------------
160
161   template <class T>
162      void CObjectTemplate<T>::solveDescInheritance(bool apply, const CAttributeMap * const parent)
163   {
164      if (parent != NULL)
165         SuperClassMap::setAttributes(parent, apply);
166   }
167
168   //---------------------------------------------------------------
169
170   template <class T>
171      void CObjectTemplate<T>::ClearAllAttributes(void)
172   {
173      vector<T*> avect = CObjectTemplate<T>::getAll();
174      typename vector<T*>::iterator
175            it = avect.begin(), end = avect.end();
176
177      for (;it != end; it++)
178      {
179         CAttributeMap & amap = **it;
180         amap.clearAllAttributes();
181      }
182   }
183
184   template<typename T>
185   std::map<int, size_t> CObjectTemplate<T>::getMinimumBufferSizeForAttributes(CContextClient* client)
186   {
187     std::map<int, size_t> minimumSizes;
188
189     if (client->isServerLeader())
190     {
191       size_t minimumSize = 0;
192       CAttributeMap& attrMap = *this;
193       CAttributeMap::const_iterator it = attrMap.begin(), itE = attrMap.end();
194       for (; it != itE; ++it)
195       {
196         if (!it->second->isEmpty())
197         {
198           size_t size = it->second->getName().size() + sizeof(size_t) + it->second->size();
199           if (size > minimumSize)
200             minimumSize = size;
201         }
202       }
203
204       if (minimumSize)
205       {
206         // Account for extra header info
207         minimumSize += CEventClient::headerSize + getIdServer().size() + sizeof(size_t);
208
209         const std::list<int>& ranks = client->getRanksServerLeader();
210         for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank)
211           minimumSizes.insert(std::make_pair(*itRank, minimumSize));
212       }
213     }
214     return minimumSizes;
215   }
216
217   template<typename T>
218   void CObjectTemplate<T>::sendAllAttributesToServer(CContextClient* client)
219   {
220     CAttributeMap& attrMap = *this;
221     CAttributeMap::const_iterator it = attrMap.begin(), itE = attrMap.end();
222     for (; it != itE; ++it)
223     {
224       if (it->second->doSend() && !(it->second)->isEmpty()) sendAttributToServer(*(it->second), client);
225     }
226   }
227
228   template <class T>
229   void CObjectTemplate<T>::sendAttributToServer(const string& id, CContextClient* client)
230   {
231      CAttributeMap & attrMap = *this;
232      CAttribute* attr=attrMap[id];
233      sendAttributToServer(*attr, client);
234   }
235
236  template <class T>
237  void CObjectTemplate<T>::sendAttributToServer(CAttribute& attr, CContextClient* client)
238  {
239    CEventClient event(getType(),EVENT_ID_SEND_ATTRIBUTE);
240    if (client->isServerLeader())
241    {
242      CMessage msg;
243      msg<<this->getIdServer(); // pb with context attribute -> to check : for now seem to be never used for context...
244      msg << attr.getName();
245      msg << attr;
246      const std::list<int>& ranks = client->getRanksServerLeader();
247      for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank)
248        event.push(*itRank,1,msg);
249      client->sendEvent(event);
250    }
251    else client->sendEvent(event);
252  }
253
254  /*!
255    This generic funtion only provides instance for sending, for receving, each
256    child class must define itself.
257    \param [in] id Id of added item
258    \param [in] itemType type of added item
259  */
260
261  template<class T>
262  void CObjectTemplate<T>::sendAddItem(const StdString& id, int itemType, CContextClient* client)
263  {
264    typedef typename T::EEventId ItemType;
265     CEventClient event(this->getType(),ItemType(itemType));
266     if (client->isServerLeader())
267     {
268       CMessage msg;
269       msg << this->getId();
270       msg << id;
271       const std::list<int>& ranks = client->getRanksServerLeader();
272       for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank)
273         event.push(*itRank,1,msg);
274       client->sendEvent(event);
275     }
276     else client->sendEvent(event);
277  }
278
279  template <class T>
280  void CObjectTemplate<T>::recvAttributFromClient(CEventServer& event)
281  {
282
283    CBufferIn* buffer=event.subEvents.begin()->buffer;
284    string id,attrId;
285    *buffer>>id;
286    CAttributeMap & attrMap = *get(id);
287    *buffer>>attrId;
288    CAttribute* attr=attrMap[attrId];
289    info(50) << "attribut recu " << attrId << "  ";
290    if (attr->isEmpty()) info(50) << "--> empty" << endl;
291    else info(50) /*<attr->getValue()*/ << endl;
292    *buffer>>*attr;
293     info(50) << "attribut recu " << attrId << "  ";
294    if (attr->isEmpty()) info(50) << "--> empty" << endl;
295    else info(50) /*attr->getValue()*/ << endl;
296  }
297
298   template <class T>
299   bool CObjectTemplate<T>::dispatchEvent(CEventServer& event)
300   {
301      switch(event.type)
302      {
303         case EVENT_ID_SEND_ATTRIBUTE :
304           recvAttributFromClient(event);
305           return true;
306           break;
307
308         default :
309         return false;
310//           ERROR("void CObjectTemplate<T>::recvEvent(CEventServer& event)", << "Unknown Event");
311      }
312   }
313
314   template <typename T>
315   bool CObjectTemplate<T>::has(const string & id)
316   {
317     return CObjectFactory::HasObject<T>(id);
318   }
319
320   template <typename T>
321   bool CObjectTemplate<T>::has(const string& contextId, const string & id)
322   {
323     return CObjectFactory::HasObject<T>(contextId,id);
324   }
325
326   template <typename T>
327   T* CObjectTemplate<T>::get(const string & id)
328   {
329     return CObjectFactory::GetObject<T>(id).get();
330   }
331
332   template <typename T>
333   T* CObjectTemplate<T>::get(const T* ptr)
334   {
335     return CObjectFactory::GetObject<T>(ptr).get();
336   }
337
338   template <typename T>
339   std::shared_ptr<T> CObjectTemplate<T>::getShared(const T* ptr)
340   {
341     return CObjectFactory::GetObject<T>(ptr);
342   }
343
344   template <typename T>
345   std::shared_ptr<T> CObjectTemplate<T>::getShared(void)
346   {
347     return CObjectFactory::GetObject<T>((T*)this);
348   }
349
350   template <typename T>
351   const vector<T*> CObjectTemplate<T>::getAll()
352   {
353     const vector< std::shared_ptr<T> >& shared_vect= CObjectFactory::GetObjectVector<T>();
354     vector<T*> vect;
355
356     typename vector<std::shared_ptr<T> >::const_iterator it;
357     for(it=shared_vect.begin();it!=shared_vect.end();++it) vect.push_back(it->get());
358     return vect;
359   }
360
361   template <typename T>
362   const vector<T*> CObjectTemplate<T>::getAll(const string & id)
363   {
364     const vector< std::shared_ptr<T> >& shared_vect= CObjectFactory::GetObjectVector<T>(id);
365     vector<T*> vect;
366
367     typename vector<std::shared_ptr<T> >::const_iterator it;
368     for(it=shared_vect.begin();it!=shared_vect.end();++it) vect.push_back(it->get());
369     return vect;
370   }
371
372   template <typename T>
373   T* CObjectTemplate<T>::get(const string& contextId, const string & id)
374   {
375     return CObjectFactory::GetObject<T>(contextId,id).get();
376   }
377
378   template <typename T>
379   T* CObjectTemplate<T>::create(const string & id)
380   {
381     return CObjectFactory::CreateObject<T>(id).get();
382   }   ///--------------------------------------------------------------
383
384  template <typename T>
385  T* CObjectTemplate<T>::get(void)
386  {
387    return CObjectFactory::GetObject<T>((T*)this).get();
388  }
389
390   template <typename T>
391   void CObjectTemplate<T>::generateCInterface(ostream& oss)
392   {
393     string className=getName();
394     int found=className.rfind("_group");
395     if (found!=string::npos) className.replace(found,1,0,'x');
396
397     oss << "/* ************************************************************************** *" << iendl;
398     oss << " *               Interface auto generated - do not modify                     *" << iendl;
399     oss << " * ************************************************************************** */" << iendl;
400     oss << iendl;
401     oss << "#include <boost/multi_array.hpp>" << iendl;
402     oss << "#include \"xios.hpp\"" << iendl;
403     oss << "#include \"attribute_template.hpp\"" << iendl;
404     oss << "#include \"object_template.hpp\"" << iendl;
405     oss << "#include \"group_template.hpp\"" << iendl;
406     oss << "#include \"icutil.hpp\"" << iendl;
407     oss << "#include \"icdate.hpp\"" << iendl;
408     oss << "#include \"timer.hpp\"" << iendl;
409     oss << "#include \"node_type.hpp\"" << iendl;
410     oss << iendl;
411     oss << "extern \"C\"" << iendl;
412     oss << "{" << iendl++;
413     oss << "typedef xios::" << getStrType<T>() << "* " << className << "_Ptr;";
414     SuperClassMap::generateCInterface(oss,className);
415     oss << "}" << iendl--;
416   }
417
418   template <typename T>
419   void CObjectTemplate<T>::generateFortran2003Interface(ostream& oss)
420   {
421     string className=getName();
422     int found=className.rfind("_group");
423     if (found!=string::npos) className.replace(found,1,0,'x');
424
425     oss << "! * ************************************************************************** *" << iendl;
426     oss << "! *               Interface auto generated - do not modify                     *" << iendl;
427     oss << "! * ************************************************************************** *" << iendl;
428     oss << "#include \"../fortran/xios_fortran_prefix.hpp\"" << iendl;
429     oss << iendl;
430     oss << "MODULE " << className << "_interface_attr" << iendl++;
431     oss << "USE, INTRINSIC :: ISO_C_BINDING" << std::endl;
432     oss << iendl;
433     oss << "INTERFACE" << iendl++;
434     oss << "! Do not call directly / interface FORTRAN 2003 <-> C99";
435     SuperClassMap::generateFortran2003Interface(oss, className);
436     oss << iendl--;
437     oss << "END INTERFACE" << iendl--;
438     oss << iendl;
439     oss << "END MODULE " << className << "_interface_attr" << iendl;
440   }
441
442   template <typename T>
443   void CObjectTemplate<T>::generateFortranInterface(ostream& oss)
444   {
445     string className=getName();
446     int found=className.rfind("_group");
447     if (found!=string::npos) className.erase(found,1);
448     string superClassName=getName();
449     found=superClassName.find("_group");
450     if (found!=string::npos) superClassName.erase(found,6);
451
452     oss << "! * ************************************************************************** *" << iendl;
453     oss << "! *               Interface auto generated - do not modify                     *" << iendl;
454     oss << "! * ************************************************************************** *" << iendl;
455     oss << "#include \"xios_fortran_prefix.hpp\"" << iendl;
456     oss << iendl;
457     oss << "MODULE i" << className << "_attr" << iendl++;
458     oss << "USE, INTRINSIC :: ISO_C_BINDING" << iendl;
459     oss << "USE i" << superClassName << iendl;
460     oss << "USE " << className << "_interface_attr" << iendl--;
461//   oss << "TYPE txios(" << className << ")" << iendl;
462//   oss << "  INTEGER(kind = C_INTPTR_T) :: daddr" << iendl;
463//   oss << "END TYPE txios(" << className << ")" << iendl;
464     oss << iendl;
465     oss << "CONTAINS" << iendl;
466     oss << iendl++;
467     SuperClassMap::generateFortranInterface_id(oss,className);
468     oss << iendl;
469     SuperClassMap::generateFortranInterface_hdl(oss,className);
470     oss << iendl;
471     SuperClassMap::generateFortranInterface_hdl_(oss,className);
472     oss << iendl;
473     SuperClassMap::generateFortranInterfaceGet_id(oss,className);
474     oss << iendl;
475     SuperClassMap::generateFortranInterfaceGet_hdl(oss,className);
476     oss << iendl;
477     SuperClassMap::generateFortranInterfaceGet_hdl_(oss,className);
478     oss << iendl;
479     SuperClassMap::generateFortranInterfaceIsDefined_id(oss,className);
480     oss << iendl;
481     SuperClassMap::generateFortranInterfaceIsDefined_hdl(oss,className);
482     oss << iendl;
483     SuperClassMap::generateFortranInterfaceIsDefined_hdl_(oss,className);
484     oss << iendl--;
485     oss << "END MODULE i" << className << "_attr" << iendl;
486   }
487} // namespace xios
488
489#endif // __XIOS_CObjectTemplate_impl__
Note: See TracBrowser for help on using the repository browser.