/*
-Copyright (c) 2006, John Hurst
+Copyright (c) 2006-2011, John Hurst
All rights reserved.
Redistribution and use in source and binary forms, with or without
#define _KM_MEMIO_H_
#include <KM_platform.h>
-#include <string.h>
+#include <string>
+#include <cstring>
namespace Kumu
{
inline void Reset() { m_size = 0; }
inline byte_t* Data() { return m_p; }
+ inline const byte_t* RoData() const { return m_p; }
inline byte_t* CurrentData() { return m_p + m_size; }
- inline ui32_t Length() { return m_size; }
- inline ui32_t Remainder() { return m_capacity - m_size; }
+ inline ui32_t Length() const { return m_size; }
+ inline ui32_t Remainder() const { return m_capacity - m_size; }
inline bool AddOffset(ui32_t offset) {
if ( ( m_size + offset ) > m_capacity )
m_size += sizeof(ui64_t);
return true;
}
- };
+
+ inline bool WriteString(const std::string& str) {
+ ui32_t len = static_cast<ui32_t>(str.length());
+ if ( ! WriteUi32BE(len) ) return false;
+ if ( ! WriteRaw((const byte_t*)str.c_str(), len) ) return false;
+ return true;
+ }
+ };
//
class MemIOReader
~MemIOReader() {}
inline void Reset() { m_size = 0; }
- inline const byte_t* Data() { return m_p; }
- inline const byte_t* CurrentData() { return m_p + m_size; }
- inline ui32_t Offset() { return m_size; }
- inline ui32_t Remainder() { return m_capacity - m_size; }
+ inline const byte_t* Data() const { return m_p; }
+ inline const byte_t* CurrentData() const { return m_p + m_size; }
+ inline ui32_t Offset() const { return m_size; }
+ inline ui32_t Remainder() const { return m_capacity - m_size; }
inline bool SkipOffset(ui32_t offset) {
if ( ( m_size + offset ) > m_capacity )
m_size += sizeof(ui64_t);
return true;
}
+
+ inline bool ReadString(std::string& str)
+ {
+ ui32_t str_length = 0;
+ if ( ! ReadUi32BE(&str_length) ) return false;
+
+ if ( str_length > 0 )
+ {
+ if ( ( m_size + str_length ) > m_capacity ) return false;
+ str.assign((const char*)CurrentData(), str_length);
+ if ( ! SkipOffset(str_length) ) return false;
+ }
+
+ return true;
+ }
};
+ //
+ inline bool
+ UnarchiveString(MemIOReader& Reader, std::string& str) {
+ return Reader.ReadString(str);
+ }
+
+ //
+ inline bool
+ ArchiveString(MemIOWriter& Writer, const std::string& str)
+ {
+ return Writer.WriteString(str);
+ }
+
+
} // namespace Kumu
#endif // _KM_MEMIO_H_