119 lines
2.8 KiB
C++
119 lines
2.8 KiB
C++
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
|
// text_text_wiarchive_impl.ipp:
|
|
|
|
// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
|
|
// Distributed under the Boost Software License, Version 1.0. (See
|
|
// accompanying file LICENSE_1_0.txt or copy at
|
|
// http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
// See http://www.boost.org for updates, documentation, and revision history.
|
|
|
|
#include <cstddef> // size_t, NULL
|
|
|
|
#include <boost/config.hpp>
|
|
#if defined(BOOST_NO_STDC_NAMESPACE)
|
|
namespace std{
|
|
using ::size_t;
|
|
} // namespace std
|
|
#endif
|
|
|
|
#include <boost/detail/workaround.hpp> // fixup for RogueWave
|
|
|
|
#ifndef BOOST_NO_STD_WSTREAMBUF
|
|
#include <boost/archive/basic_text_iprimitive.hpp>
|
|
|
|
namespace boost {
|
|
namespace archive {
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// implementation of wiprimtives functions
|
|
//
|
|
template<class Archive>
|
|
BOOST_WARCHIVE_DECL(void)
|
|
text_wiarchive_impl<Archive>::load(char *s)
|
|
{
|
|
std::size_t size;
|
|
* this->This() >> size;
|
|
// skip separating space
|
|
is.get();
|
|
while(size-- > 0){
|
|
*s++ = is.narrow(is.get(), '\0');
|
|
}
|
|
*s = '\0';
|
|
}
|
|
|
|
template<class Archive>
|
|
BOOST_WARCHIVE_DECL(void)
|
|
text_wiarchive_impl<Archive>::load(std::string &s)
|
|
{
|
|
std::size_t size;
|
|
* this->This() >> size;
|
|
// skip separating space
|
|
is.get();
|
|
#if BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(20101))
|
|
if(NULL != s.data())
|
|
#endif
|
|
s.resize(0);
|
|
s.reserve(size);
|
|
while(size-- > 0){
|
|
int x = is.narrow(is.get(), '\0');
|
|
s += x;
|
|
}
|
|
}
|
|
|
|
#ifndef BOOST_NO_INTRINSIC_WCHAR_T
|
|
template<class Archive>
|
|
BOOST_WARCHIVE_DECL(void)
|
|
text_wiarchive_impl<Archive>::load(wchar_t *s)
|
|
{
|
|
std::size_t size;
|
|
* this->This() >> size;
|
|
// skip separating space
|
|
is.get();
|
|
// Works on all tested platforms
|
|
is.read(s, size);
|
|
s[size] = L'\0';
|
|
}
|
|
#endif
|
|
|
|
#ifndef BOOST_NO_STD_WSTRING
|
|
template<class Archive>
|
|
BOOST_WARCHIVE_DECL(void)
|
|
text_wiarchive_impl<Archive>::load(std::wstring &ws)
|
|
{
|
|
std::size_t size;
|
|
* this->This() >> size;
|
|
// skip separating space
|
|
is.get();
|
|
// borland complains about resize
|
|
// borland de-allocator fixup
|
|
#if BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(20101))
|
|
if(NULL != ws.data())
|
|
#endif
|
|
ws.resize(size);
|
|
// note breaking a rule here - is this a problem on some platform
|
|
is.read(const_cast<wchar_t *>(ws.data()), size);
|
|
}
|
|
#endif
|
|
|
|
template<class Archive>
|
|
BOOST_WARCHIVE_DECL(BOOST_PP_EMPTY())
|
|
text_wiarchive_impl<Archive>::text_wiarchive_impl(
|
|
std::wistream & is,
|
|
unsigned int flags
|
|
) :
|
|
basic_text_iprimitive<std::wistream>(
|
|
is,
|
|
0 != (flags & no_codecvt)
|
|
),
|
|
basic_text_iarchive<Archive>(flags)
|
|
{
|
|
if(0 == (flags & no_header))
|
|
basic_text_iarchive<Archive>::init();
|
|
}
|
|
|
|
} // archive
|
|
} // boost
|
|
|
|
#endif // BOOST_NO_STD_WSTREAMBUF
|