#include "inmemoryserializer.h"
+#include "config.h"
+
#include <algorithm>
#include <vector>
return endianessSwappedValue.value_;
}
+//! \brief Change the host-dependent endian settings to either Swap or DoNotSwap.
+//
+// \param endianSwapBehavior input swap behavior, might depend on host.
+//
+// \return Host-independent setting, either Swap or DoNotSwap.
+EndianSwapBehavior setEndianSwapBehaviorFromHost(EndianSwapBehavior endianSwapBehavior)
+{
+ if (endianSwapBehavior == EndianSwapBehavior::SwapIfHostIsBigEndian)
+ {
+ return GMX_INTEGER_BIG_ENDIAN ? EndianSwapBehavior::Swap : EndianSwapBehavior::DoNotSwap;
+ }
+ else if (endianSwapBehavior == EndianSwapBehavior::SwapIfHostIsLittleEndian)
+ {
+ return GMX_INTEGER_BIG_ENDIAN ? EndianSwapBehavior::DoNotSwap : EndianSwapBehavior::Swap;
+ }
+ else
+ {
+ return endianSwapBehavior;
+ }
+}
+
} // namespace
/********************************************************************
class InMemorySerializer::Impl
{
public:
- Impl(EndianSwapBehavior endianSwapBehavior) : endianSwapBehavior_(endianSwapBehavior) {}
+ Impl(EndianSwapBehavior endianSwapBehavior) :
+ endianSwapBehavior_(setEndianSwapBehaviorFromHost(endianSwapBehavior))
+ {
+ }
+
template<typename T>
void doValue(T value)
{
- if (endianSwapBehavior_ == EndianSwapBehavior::DoSwap)
+ if (endianSwapBehavior_ == EndianSwapBehavior::Swap)
{
CharBuffer<T>(swapEndian(value)).appendTo(&buffer_);
}
doValue<uint64_t>(value.size());
buffer_.insert(buffer_.end(), value.begin(), value.end());
}
+ void doOpaque(const char* data, std::size_t size)
+ {
+ buffer_.insert(buffer_.end(), data, data + size);
+ }
std::vector<char> buffer_;
EndianSwapBehavior endianSwapBehavior_;
impl_->doString(*value);
}
+void InMemorySerializer::doOpaque(char* data, std::size_t size)
+{
+ impl_->doOpaque(data, size);
+}
+
/********************************************************************
* InMemoryDeserializer
*/
buffer_(buffer),
sourceIsDouble_(sourceIsDouble),
pos_(0),
- endianSwapBehavior_(endianSwapBehavior)
+ endianSwapBehavior_(setEndianSwapBehaviorFromHost(endianSwapBehavior))
{
}
template<typename T>
void doValue(T* value)
{
- if (endianSwapBehavior_ == EndianSwapBehavior::DoSwap)
+ if (endianSwapBehavior_ == EndianSwapBehavior::Swap)
{
*value = swapEndian(CharBuffer<T>(&buffer_[pos_]).value());
}
*value = std::string(&buffer_[pos_], size);
pos_ += size;
}
+ void doOpaque(char* data, std::size_t size)
+ {
+ std::copy(&buffer_[pos_], &buffer_[pos_ + size], data);
+ pos_ += size;
+ }
ArrayRef<const char> buffer_;
bool sourceIsDouble_;
impl_->doString(value);
}
+void InMemoryDeserializer::doOpaque(char* data, std::size_t size)
+{
+ impl_->doOpaque(data, size);
+}
+
} // namespace gmx