This is Unofficial EPICS BASE Doxygen Site
epics::pvData::SerializeHelper Class Reference

Serialization helper. More...

#include "serializeHelper.h"

Static Public Member Functions

static void writeSize (std::size_t s, ByteBuffer *buffer, SerializableControl *flusher)
 
static std::size_t readSize (ByteBuffer *buffer, DeserializableControl *control)
 
static void serializeString (const std::string &value, ByteBuffer *buffer, SerializableControl *flusher)
 
static void serializeSubstring (const std::string &value, std::size_t offset, std::size_t count, ByteBuffer *buffer, SerializableControl *flusher)
 
static std::string deserializeString (ByteBuffer *buffer, DeserializableControl *control)
 

Detailed Description

Serialization helper.

Definition at line 29 of file serializeHelper.h.

Member Function Documentation

string epics::pvData::SerializeHelper::deserializeString ( ByteBuffer buffer,
DeserializableControl control 
)
static

std::string deserialization helper method. TODO This method cannot return "null", but Java implementation could have serialized "null" value as well. We need to decide how to deserialize "null".

Parameters
[in]bufferdeserialization buffer
[in]controlcontrol
Returns
deserialized string
Todo:
This method cannot return "null", but Java implementation could have serialized "null" value as well. We need to decide how to deserialize "null".

Definition at line 102 of file serializeHelper.cpp.

103  {
104 
105  std::size_t size = SerializeHelper::readSize(buffer, control);
106  if(size!=(size_t)-1) // TODO null strings check, to be removed in the future
107  {
108  if (buffer->getRemaining()>=size)
109  {
110  // entire string is in buffer, simply create a string out of it (copy)
111  std::size_t pos = buffer->getPosition();
112  string str(buffer->getBuffer()+pos, size);
113  buffer->setPosition(pos+size);
114  return str;
115  }
116  else
117  {
118  string str;
119  str.reserve(size);
120  try {
121  std::size_t i = 0;
122  while(true) {
123  std::size_t toRead = min(size-i, buffer->getRemaining());
124  std::size_t pos = buffer->getPosition();
125  str.append(buffer->getBuffer()+pos, toRead);
126  buffer->setPosition(pos+toRead);
127  i += toRead;
128  if(i<size)
129  control->ensureData(1); // at least one
130  else
131  break;
132  }
133  return str;
134  } catch(...) {
135  throw;
136  }
137  }
138  }
139  else
140  return std::string();
141  }
int i
Definition: scan.c:967
const char * getBuffer() const
Definition: byteBuffer.h:294
#define min(x, y)
Definition: flexdef.h:78
static std::size_t readSize(ByteBuffer *buffer, DeserializableControl *control)
#define str(v)
std::size_t getPosition() const
Definition: byteBuffer.h:346
void setPosition(std::size_t pos)
Definition: byteBuffer.h:357
std::size_t getRemaining() const
Definition: byteBuffer.h:391
virtual void ensureData(std::size_t size)=0
std::size_t epics::pvData::SerializeHelper::readSize ( ByteBuffer buffer,
DeserializableControl control 
)
static

Deserialize array size. The specified DeserializableControl ensures sufficient bytes are available.

Parameters
[in]bufferdeserialization buffer.
[in]controlthe DeserializableControl.
Returns
array size.

Definition at line 46 of file serializeHelper.cpp.

47  {
48  control->ensureData(1);
49  int8 b = buffer->getByte();
50  if(b==-1)
51  return -1;
52  else if(b==-2) {
53  control->ensureData(sizeof(int32));
54  int32 s = buffer->getInt();
55  if(s<0) THROW_BASE_EXCEPTION("negative size");
56  return s;
57  }
58  else
59  return (std::size_t)(b<0 ? b+256 : b);
60  }
int8_t int8
Definition: pvType.h:75
EPICS_ALWAYS_INLINE int8 getByte()
Definition: byteBuffer.h:617
EPICS_ALWAYS_INLINE int32 getInt()
Definition: byteBuffer.h:629
#define THROW_BASE_EXCEPTION(msg)
virtual void ensureData(std::size_t size)=0
int32_t int32
Definition: pvType.h:83
void epics::pvData::SerializeHelper::serializeString ( const std::string &  value,
ByteBuffer buffer,
SerializableControl flusher 
)
static

std::string serialization helper method.

Parameters
[in]valuestd::string to serialize
[in]bufferserialization buffer
[in]flusherflusher

Definition at line 62 of file serializeHelper.cpp.

63  {
64  std::size_t len = value.length();
65  SerializeHelper::writeSize(len, buffer, flusher);
66  if (len<=0) return;
67  std::size_t i = 0;
68  while(true) {
69  std::size_t maxToWrite = min(len-i, buffer->getRemaining());
70  buffer->put(value.data(), i, maxToWrite); // ASCII
71  i += maxToWrite;
72  if(i<len)
73  flusher->flushSerializeBuffer();
74  else
75  break;
76  }
77  }
Definition: link.h:174
int i
Definition: scan.c:967
#define min(x, y)
Definition: flexdef.h:78
static void writeSize(std::size_t s, ByteBuffer *buffer, SerializableControl *flusher)
std::size_t getRemaining() const
Definition: byteBuffer.h:391
void epics::pvData::SerializeHelper::serializeSubstring ( const std::string &  value,
std::size_t  offset,
std::size_t  count,
ByteBuffer buffer,
SerializableControl flusher 
)
static

std::string serialization helper method.

Parameters
[in]valuestd::string to serialize
[in]offsetstart of the substring in value
[in]countthe number of characters to write
[in]bufferserialization buffer
[in]flusherflusher

Definition at line 79 of file serializeHelper.cpp.

81  {
82  /*if(offset<0)
83  offset = 0;
84  else*/ if(offset>value.length()) offset = value.length();
85 
86  if(offset+count>value.length()) count = value.length()-offset;
87 
88  SerializeHelper::writeSize(count, buffer, flusher);
89  /*if (count<=0)*/ return;
90  std::size_t i = 0;
91  while(true) {
92  std::size_t maxToWrite = min(count-i, buffer->getRemaining());
93  buffer->put(value.data(), offset+i, maxToWrite); // ASCII
94  i += maxToWrite;
95  if(i<count)
96  flusher->flushSerializeBuffer();
97  else
98  break;
99  }
100  }
Definition: link.h:174
int i
Definition: scan.c:967
#define min(x, y)
Definition: flexdef.h:78
static void writeSize(std::size_t s, ByteBuffer *buffer, SerializableControl *flusher)
std::size_t getRemaining() const
Definition: byteBuffer.h:391
void epics::pvData::SerializeHelper::writeSize ( std::size_t  s,
ByteBuffer buffer,
SerializableControl flusher 
)
static

Serialize the specified array size into the specified buffer, flushing when necessary. The specified SerializableControl manages any flushing required.

Parameters
[in]ssize to encode
[in]bufferserialization buffer
[in]flusherSerializableControl to manage the flushing

Definition at line 28 of file serializeHelper.cpp.

29  {
30  flusher->ensureBuffer(sizeof(int64)+1);
31  SerializeHelper::writeSize(s, buffer);
32  }
static void writeSize(std::size_t s, ByteBuffer *buffer, SerializableControl *flusher)
int64_t int64
Definition: pvType.h:87
virtual void ensureBuffer(std::size_t size)=0

The documentation for this class was generated from the following files: