source: vendor/nemo/current/NEMOGCM/EXTERNAL/XIOS/src/type/message.cpp @ 44

Last change on this file since 44 was 44, checked in by cholod, 12 years ago

Load NEMO_TMP into vendor/nemo/current.

File size: 2.3 KB
Line 
1#include "xmlioserver_spl.hpp"
2#include "message.hpp"
3#include "base_type.hpp"
4#include "buffer_in.hpp"
5#include "buffer_out.hpp"
6
7namespace xios
8{
9
10   CMessage::CMessage(void) {}
11   
12   CMessage& CMessage::push(const CBaseType& type)
13   {
14     typeList.push_back(type.duplicate());
15     return *this ;
16   }
17   
18    CMessage& CMessage::push(CBaseType& type)
19   {
20     typeList.push_back(&type);
21     return *this ;
22   }
23   
24   size_t CMessage::size(void) const
25   {
26     list<CBaseType*>::const_iterator it; 
27     size_t retSize=0 ;
28     
29     for(it=typeList.begin();it!=typeList.end();it++) retSize+=(*it)->size() ;
30     return retSize ;
31   }
32   
33    bool CMessage::fromBuffer(CBufferIn& buffer) const
34    {
35      list<CBaseType*>::const_iterator it; 
36     
37      if (buffer.remain()>=size())
38      {
39        for(it=typeList.begin();it!=typeList.end();it++) (*it)->fromBuffer(buffer) ;
40        return true ;
41      }
42      else
43      {
44        return false ;
45      }
46    }
47   
48
49    bool CMessage::toBuffer(CBufferOut& buffer) const
50    {
51      list<CBaseType*>::const_iterator it; 
52      if (buffer.remain()>=size())
53      {
54        for(it=typeList.begin();it!=typeList.end();it++) (*it)->toBuffer(buffer) ;
55        return true ;
56      }
57      else
58      {
59        return false ;
60      }
61
62    }
63
64   
65    void CMessage::clear()
66    {
67      list<CBaseType*>::iterator it; 
68      for(it=typeList.begin();it!=typeList.end();it++) (*it)->destroy() ;
69      typeList.clear() ;
70    }
71
72    CMessage::~CMessage()
73    {
74      clear() ;
75    }
76   
77
78    CBufferOut& operator<<(CBufferOut& buffer, CMessage& msg)
79    {
80      if (!msg.toBuffer(buffer)) ERROR("CBufferOut& operator<<(CBufferOut& buffer, CMessage& msg)",
81                                             <<"Buffer remain size is to low for size type") ;
82      return buffer ;
83    }
84
85 
86    CBufferIn& operator>>(CBufferIn& buffer, CMessage& msg)
87    {
88      if (!msg.fromBuffer(buffer)) ERROR("CBufferIn& operator>>(CBufferIn& buffer, CMessage& msg)",
89                                           <<"Buffer remain size is to low for size type") ;
90      return buffer ;
91    }
92
93  CMessage& operator<<(CMessage& msg,CBaseType& type)
94 {
95    msg.push(type) ;
96    return msg ;
97  }
98
99  CMessage& operator<<(CMessage& msg, const CBaseType&  type)
100  {
101    msg.push(*type.duplicate()) ;
102    return msg ;
103  } 
104 
105}
Note: See TracBrowser for help on using the repository browser.