source: XIOS/dev/dev_ym/XIOS_COUPLING/src/type/message.cpp @ 2338

Last change on this file since 2338 was 1918, checked in by ymipsl, 4 years ago

Big update on on going work related to data distribution and transfer between clients and servers.

  • move all related file into distribution directorie
  • implement the concept of data "View"
  • implement the concept of "connector" which make the data transfer between 2 differents "Views"

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
  • Property svn:eol-style set to native
File size: 2.5 KB
Line 
1#include "xios_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(const CMessage& msg) 
13   {
14     for(auto type : msg.typeList) push(*type) ;
15   }
16
17   
18   CMessage& CMessage::push(const CBaseType& type)
19   {
20     typeList.push_back(type.clone());
21     return *this ;
22   }
23   
24//    CMessage& CMessage::push(CBaseType& type)
25//   {
26//     typeList.push_back(&type);
27//     return *this ;
28//   }
29   
30   size_t CMessage::size(void) const
31   {
32     list<CBaseType*>::const_iterator it; 
33     size_t retSize=0 ;
34     
35     for(it=typeList.begin();it!=typeList.end();it++) retSize+=(*it)->size() ;
36     return retSize ;
37   }
38   
39    bool CMessage::fromBuffer(CBufferIn& buffer) const
40    {
41      list<CBaseType*>::const_iterator it; 
42     
43      if (buffer.remain()>=size())
44      {
45        for(it=typeList.begin();it!=typeList.end();it++) (*it)->fromBuffer(buffer) ;
46        return true ;
47      }
48      else
49      {
50        return false ;
51      }
52    }
53   
54
55    bool CMessage::toBuffer(CBufferOut& buffer) const
56    {
57      list<CBaseType*>::const_iterator it; 
58      if (buffer.remain()>=size())
59      {
60        for(it=typeList.begin();it!=typeList.end();it++) (*it)->toBuffer(buffer) ;
61        return true ;
62      }
63      else
64      {
65        return false ;
66      }
67
68    }
69
70   
71    void CMessage::clear()
72    {
73      list<CBaseType*>::iterator it; 
74      for(it=typeList.begin();it!=typeList.end();it++) delete *it ;
75      typeList.clear() ;
76    }
77
78    CMessage::~CMessage()
79    {
80      clear() ;
81    }
82   
83
84    CBufferOut& operator<<(CBufferOut& buffer, CMessage& msg)
85    {
86      if (!msg.toBuffer(buffer)) ERROR("CBufferOut& operator<<(CBufferOut& buffer, CMessage& msg)",
87                                       << "Not enough free space in buffer to queue the message.");
88    return buffer ;
89      return buffer ;
90    }
91
92 
93    CBufferIn& operator>>(CBufferIn& buffer, CMessage& msg)
94    {
95      if (!msg.fromBuffer(buffer)) ERROR("CBufferIn& operator>>(CBufferIn& buffer, CMessage& msg)",
96                                         << "Not enough data in buffer to unqueue the message.");
97    return buffer ;
98      return buffer ;
99    }
100
101  CMessage& operator<<(CMessage& msg,const CBaseType& type)
102 {
103    msg.push(type) ;
104    return msg ;
105  }
106
107//  CMessage& operator<<(CMessage& msg, const CBaseType&  type)
108//  {
109//    msg.push(*type.clone()) ;
110//    return msg ;
111//  }
112 
113}
Note: See TracBrowser for help on using the repository browser.