OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
Formatter.cpp
Go to the documentation of this file.
1 #include "Message/Formatter.h"
2 
4 {
5  items = msg->size();
6  size = 0;
7 
8  format_array.resize(2*items);
9  for (unsigned int i=0; i<items; ++i)
10  {
11  Message::MsgItem &msgitem = msg->item(i);
12  format_array[2*i+0] = msgitem.numElems();
13  format_array[2*i+1] = msgitem.numBytes();
14  size += format_array[2*i+1];
15  }
16 }
17 
19 {
20  std::cout << "size: " << size << std::endl;
21  for (unsigned int i=0; i<items; ++i)
22  {
23  std::cout << "entry " << i << ": " << format_array[2*i+0]
24  << " elements " << format_array[2*i+1] << " bytes\n";
25  }
26 }
27 
28 MsgBuffer::MsgBuffer(Format *f, int count, int offset)
29  : format(f), writepos(0), readpos(0)
30 {
31  datasize = count*format->getSize();
32  data.resize(datasize+offset);
33 }
34 
35 
36 MsgBuffer::MsgBuffer(Format *f, char *buf, int size)
37  : format(f), writepos(0), readpos(0)
38 {
39  datasize = size;
40  data.resize(datasize);
41  std::copy(buf, buf+size, data.begin());
42  delete[] buf;
43 }
44 
46 {
47 }
48 
50 {
51  unsigned int items = msg->size();
52 
53  //check for full storage or message size mismatch
54  if (writepos == datasize || items != format->getItemCount())
55  return false;
56 
57  int pos = writepos;
58  for (unsigned int i=0; i<items; ++i)
59  {
60  Message::MsgItem &msgitem = msg->item(i);
61 
62  //check for format mismatch
63  if (format->getItemElems(i) != msgitem.numElems() ||
64  format->getItemBytes(i) != msgitem.numBytes())
65  return false;
66 
67  //actually copy to buffer
68  std::memcpy(data.data()+pos, msgitem.data(), format->getItemBytes(i));
69  pos += format->getItemBytes(i);
70  }
71 
72  writepos = pos;
73  return true;
74 }
75 
77 {
78  if (readpos > datasize - format->getSize())
79  return 0;
80 
81  unsigned int items = format->getItemCount();
82  Message *msg = new Message(items);
83 
84  //get all the items according to format and add them to the message
85  for (unsigned int j = 0; j < items; j++)
86  {
87  unsigned int bytesize = format->getItemBytes(j);
88  unsigned int elements = format->getItemElems(j);
89 
90  msg->setCopy(false);
91  msg->setDelete(false);
92  msg->putmsg(data.data()+readpos, bytesize/elements, elements);
93  readpos += bytesize;
94  }
95 
96  return msg;
97 }
unsigned int getSize()
Definition: Formatter.h:32
elements
Definition: IndexMap.cpp:141
Format(Message *)
Definition: Formatter.cpp:3
unsigned int items
Definition: Formatter.h:52
std::vector< char > data
Definition: Formatter.h:96
unsigned int numBytes() const
Definition: Message.h:226
MsgItem & item(size_t n)
Definition: Message.h:316
unsigned int size
Definition: Formatter.h:52
std::vector< unsigned int > format_array
Definition: Formatter.h:53
size_t size() const
Definition: Message.h:300
unsigned int getItemCount()
Definition: Formatter.h:28
unsigned int readpos
Definition: Formatter.h:95
void print()
Definition: Formatter.cpp:18
Message * get()
Definition: Formatter.cpp:76
Message & putmsg(void *, int, int=0)
unsigned int numElems() const
Definition: Message.h:230
unsigned int getItemBytes(int i)
Definition: Formatter.h:44
Format * format
Definition: Formatter.h:94
unsigned int writepos
Definition: Formatter.h:95
unsigned int datasize
Definition: Formatter.h:95
unsigned int getItemElems(int i)
Definition: Formatter.h:40
MsgBuffer(Format *f, int count, int offset=0)
Definition: Formatter.cpp:28
Message & setDelete(const bool c)
Definition: Message.h:339
Message & setCopy(const bool c)
Definition: Message.h:327
bool add(Message *)
Definition: Formatter.cpp:49
void * data()
Definition: Message.h:252
Inform & endl(Inform &inf)
Definition: Inform.cpp:42