19 #ifndef INCLUDE_SF_STRING_HPP 20 #define INCLUDE_SF_STRING_HPP 24 #include <type_traits> 26 #include <RCF/Tools.hpp> 27 #include <SF/Archive.hpp> 28 #include <SF/Stream.hpp> 33 template<
typename C,
typename T,
typename A>
34 inline void serializeString(
SF::Archive & ar, std::basic_string<C,T,A> & s)
38 std::uint32_t count = 0;
45 std::size_t minSerializedLength =
sizeof(C);
46 if (ar.verifyAgainstArchiveSize(count*minSerializedLength))
48 if (count > s.capacity())
54 std::uint32_t charsRemaining = count;
55 const std::uint32_t BufferSize = 512;
57 while (charsRemaining)
59 std::uint32_t charsToRead = RCF_MIN(BufferSize, charsRemaining);
60 std::uint32_t bytesToRead = charsToRead*
sizeof(C);
62 if ( is.read((
char *)buffer, bytesToRead) != bytesToRead )
68 s.append(buffer, charsToRead);
69 charsRemaining -= charsToRead;
74 std::uint32_t count =
static_cast<std::uint32_t
>(s.length());
76 ar.getOstream()->writeRaw(
83 RCF_EXPORT
bool getCurrentNativeWstringSerialization();
85 template<
typename C,
typename T,
typename A>
86 inline void serializeEncodedString(
SF::Archive & ar, std::basic_string<C,T,A> & ws)
90 serializeString(ar, ws);
100 if (encodingType == 8)
105 ws = RCF::stringToWstring(s);
111 if ( encodingType !=
sizeof(
wchar_t) )
113 RCF::Exception e(RCF::RcfError_WcharSizeMismatch,
sizeof(
wchar_t), encodingType);
117 serializeString(ar, ws);
126 int encodingType = 8;
127 bool useNativeWstringSerialization = getCurrentNativeWstringSerialization();
128 if ( useNativeWstringSerialization )
130 encodingType =
sizeof(wchar_t);
135 if (encodingType == 8)
138 std::string s = RCF::wstringToString(ws);
145 if ( encodingType !=
sizeof(
wchar_t) )
147 RCF::Exception e(RCF::RcfError_WcharSizeMismatch,
sizeof(
wchar_t), encodingType);
151 serializeString(ar, ws);
156 template<
typename C,
typename T,
typename A>
157 inline void serializeEncodedStringOrNot(
SF::Archive & ar, std::basic_string<C, T, A> & t, std::true_type *)
159 serializeEncodedString(ar, t);
162 template<
typename C,
typename T,
typename A>
163 inline void serializeEncodedStringOrNot(
SF::Archive & ar, std::basic_string<C, T, A> & t, std::false_type *)
165 serializeString(ar, t);
169 template<
typename C,
typename T,
typename A>
170 inline void serialize_vc6(
SF::Archive & ar, std::basic_string<C,T,A> & t,
const unsigned int)
172 typedef typename std::is_same<C, wchar_t>::type type;
173 serializeEncodedStringOrNot(ar, t, (type *) NULL);
178 #endif // ! INCLUDE_SF_STRING_HPP Represents an archive, in which serialized objects are stored.
Definition: Archive.hpp:32
int getRuntimeVersion()
Gets the RCF runtime version associated with this archive.
Base class for all RCF exceptions.
Definition: Exception.hpp:64
Definition: ByteBuffer.hpp:189
bool isWrite() const
Returns true if this archive is being written to.
bool isRead() const
Returns true if this archive is being read from.
Base class for input streams using SF serialization. Use operator >>() to deserialize objects from th...
Definition: Stream.hpp:138