16 #define epicsExportSharedSymbols 28 void SerializeHelper::writeSize(std::size_t s,
ByteBuffer* buffer,
31 SerializeHelper::writeSize(s, buffer);
34 void SerializeHelper::writeSize(std::size_t s,
ByteBuffer* buffer) {
35 if(s==(std::size_t)-1)
38 buffer->
putByte(static_cast<int8>(s));
42 buffer->
putInt(static_cast<uint32>(s));
46 std::size_t SerializeHelper::readSize(
ByteBuffer* buffer,
59 return (std::size_t)(b<0 ? b+256 : b);
62 void SerializeHelper::serializeString(
const string&
value,
64 std::size_t len = value.length();
65 SerializeHelper::writeSize(len, buffer, flusher);
70 buffer->
put(value.data(),
i, maxToWrite);
79 void SerializeHelper::serializeSubstring(
const string&
value,
80 std::size_t offset, std::size_t count,
ByteBuffer* buffer,
84 if(offset>value.length()) offset = value.length();
86 if(offset+count>value.length()) count = value.length()-offset;
88 SerializeHelper::writeSize(count, buffer, flusher);
93 buffer->
put(value.data(), offset+
i, maxToWrite);
102 string SerializeHelper::deserializeString(
ByteBuffer* buffer,
105 std::size_t size = SerializeHelper::readSize(buffer, control);
125 str.append(buffer->
getBuffer()+pos, toRead);
140 return std::string();
150 typedef std::vector<epicsUInt8> buf_type;
158 ,bufwrap((
char*)&buf[0], buf.size(), byteOrder)
161 virtual void flushSerializeBuffer()
163 size_t N = out.size();
171 virtual void ensureBuffer(std::size_t size)
173 flushSerializeBuffer();
177 virtual void alignBuffer(std::size_t alignment)
180 flushSerializeBuffer();
182 bufwrap.
align(alignment);
185 virtual bool directSerialize(
187 const char* toSerialize,
188 std::size_t elementCount,
194 virtual void cachedSerialize(
195 std::tr1::shared_ptr<const Field>
const & field,
198 field->serialize(buffer,
this);
208 std::vector<epicsUInt8>& out)
210 ToString TS(out, byteOrder);
212 TS.flushSerializeBuffer();
213 assert(TS.bufwrap.getPosition()==0);
229 virtual void ensureData(std::size_t size)
231 if(size>buf.getRemaining())
232 throw std::logic_error(
"Incomplete buffer");
235 virtual void alignData(std::size_t alignment)
237 size_t pos = buf.getPosition(), k = alignment-1;
239 std::size_t npad = alignment-(pos&k);
241 buf.align(alignment);
245 virtual bool directDeserialize(
248 std::size_t elementCount,
253 virtual std::tr1::shared_ptr<const Field> cachedDeserialize(
256 return create->deserialize(buffer,
this);
#define assert(exp)
Declare that a condition should be true.
virtual void serialize(ByteBuffer *buffer, SerializableControl *flusher) const =0
size_t elementSize(ScalarType id)
gives sizeof(T) where T depends on the scalar type id.
EPICS_ALWAYS_INLINE int8 getByte()
EPICS_ALWAYS_INLINE void putInt(int32 value)
const char * getBuffer() const
Base class for serialization.
void epicsShareFunc deserializeFromBuffer(Serializable *S, ByteBuffer &in)
deserializeFromBuffer Deserialize into S from provided vector
TODO only here because of the Lockable.
Callback class for deserialization.
void align(std::size_t size, char fill='\0')
std::size_t getPosition() const
void copy(PVValueArray< T > &pvFrom, size_t fromOffset, size_t fromStride, PVValueArray< T > &pvTo, size_t toOffset, size_t toStride, size_t count)
Copy a subarray from one scalar array to another.
EPICS_ALWAYS_INLINE int32 getInt()
void setPosition(std::size_t pos)
virtual void flushSerializeBuffer()=0
EPICS_ALWAYS_INLINE void putByte(int8 value)
This class implements a Bytebuffer that is like the java.nio.ByteBuffer.
std::size_t getRemaining() const
FORCE_INLINE const FieldCreatePtr & getFieldCreate()
#define THROW_BASE_EXCEPTION(msg)
std::tr1::shared_ptr< FieldCreate > FieldCreatePtr
virtual void deserialize(ByteBuffer *buffer, DeserializableControl *flusher)=0
virtual void ensureBuffer(std::size_t size)=0
Callback class for serialization.
virtual void ensureData(std::size_t size)=0
void epicsShareFunc serializeToVector(const Serializable *S, int byteOrder, std::vector< epicsUInt8 > &out)
Push serialize and append to the provided byte vector. No caching is done. Only complete serializatio...