You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
173 lines
5.4 KiB
173 lines
5.4 KiB
#ifndef BOOST_ARCHIVE_BASIC_TEXT_OPRIMITIVE_HPP |
|
#define BOOST_ARCHIVE_BASIC_TEXT_OPRIMITIVE_HPP |
|
|
|
// MS compatible compilers support #pragma once |
|
#if defined(_MSC_VER) && (_MSC_VER >= 1020) |
|
# pragma once |
|
#endif |
|
|
|
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 |
|
// basic_text_oprimitive.hpp |
|
|
|
// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . |
|
// Use, modification and distribution is subject to 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. |
|
|
|
// archives stored as text - note these ar templated on the basic |
|
// stream templates to accommodate wide (and other?) kind of characters |
|
// |
|
// note the fact that on libraries without wide characters, ostream is |
|
// is not a specialization of basic_ostream which in fact is not defined |
|
// in such cases. So we can't use basic_ostream<OStream::char_type> but rather |
|
// use two template parameters |
|
|
|
#include <iomanip> |
|
#include <locale> |
|
#include <boost/config/no_tr1/cmath.hpp> // isnan |
|
#include <boost/assert.hpp> |
|
#include <cstddef> // size_t |
|
|
|
#include <boost/config.hpp> |
|
#include <boost/static_assert.hpp> |
|
#include <boost/detail/workaround.hpp> |
|
#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1) |
|
#include <boost/archive/dinkumware.hpp> |
|
#endif |
|
|
|
#if defined(BOOST_NO_STDC_NAMESPACE) |
|
namespace std{ |
|
using ::size_t; |
|
#if ! defined(BOOST_DINKUMWARE_STDLIB) && ! defined(__SGI_STL_PORT) |
|
using ::locale; |
|
#endif |
|
} // namespace std |
|
#endif |
|
|
|
#include <boost/limits.hpp> |
|
#include <boost/integer.hpp> |
|
#include <boost/io/ios_state.hpp> |
|
#include <boost/scoped_ptr.hpp> |
|
#include <boost/serialization/throw_exception.hpp> |
|
#include <boost/archive/archive_exception.hpp> |
|
#include <boost/archive/basic_streambuf_locale_saver.hpp> |
|
#include <boost/archive/detail/abi_prefix.hpp> // must be the last header |
|
|
|
namespace boost { |
|
namespace archive { |
|
|
|
class save_access; |
|
|
|
///////////////////////////////////////////////////////////////////////// |
|
// class basic_text_oprimitive - output of prmitives to stream |
|
template<class OStream> |
|
class basic_text_oprimitive |
|
{ |
|
#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS |
|
protected: |
|
#else |
|
public: |
|
#endif |
|
OStream &os; |
|
io::ios_flags_saver flags_saver; |
|
io::ios_precision_saver precision_saver; |
|
|
|
#ifndef BOOST_NO_STD_LOCALE |
|
boost::scoped_ptr<std::locale> archive_locale; |
|
basic_streambuf_locale_saver< |
|
BOOST_DEDUCED_TYPENAME OStream::char_type, |
|
BOOST_DEDUCED_TYPENAME OStream::traits_type |
|
> locale_saver; |
|
#endif |
|
|
|
// default saving of primitives. |
|
template<class T> |
|
void save(const T &t){ |
|
if(os.fail()) |
|
boost::serialization::throw_exception( |
|
archive_exception(archive_exception::output_stream_error) |
|
); |
|
os << t; |
|
} |
|
|
|
///////////////////////////////////////////////////////// |
|
// fundamental types that need special treatment |
|
void save(const bool t){ |
|
// trap usage of invalid uninitialized boolean which would |
|
// otherwise crash on load. |
|
BOOST_ASSERT(0 == static_cast<int>(t) || 1 == static_cast<int>(t)); |
|
if(os.fail()) |
|
boost::serialization::throw_exception( |
|
archive_exception(archive_exception::output_stream_error) |
|
); |
|
os << t; |
|
} |
|
void save(const signed char t) |
|
{ |
|
save(static_cast<short int>(t)); |
|
} |
|
void save(const unsigned char t) |
|
{ |
|
save(static_cast<short unsigned int>(t)); |
|
} |
|
void save(const char t) |
|
{ |
|
save(static_cast<short int>(t)); |
|
} |
|
#ifndef BOOST_NO_INTRINSIC_WCHAR_T |
|
void save(const wchar_t t) |
|
{ |
|
BOOST_STATIC_ASSERT(sizeof(wchar_t) <= sizeof(int)); |
|
save(static_cast<int>(t)); |
|
} |
|
#endif |
|
void save(const float t) |
|
{ |
|
// must be a user mistake - can't serialize un-initialized data |
|
if(os.fail()) |
|
boost::serialization::throw_exception( |
|
archive_exception(archive_exception::output_stream_error) |
|
); |
|
os << std::setprecision(std::numeric_limits<float>::digits10 + 2); |
|
os << t; |
|
} |
|
void save(const double t) |
|
{ |
|
// must be a user mistake - can't serialize un-initialized data |
|
if(os.fail()) |
|
boost::serialization::throw_exception( |
|
archive_exception(archive_exception::output_stream_error) |
|
); |
|
os << std::setprecision(std::numeric_limits<double>::digits10 + 2); |
|
os << t; |
|
} |
|
BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) |
|
basic_text_oprimitive(OStream & os, bool no_codecvt); |
|
BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) |
|
~basic_text_oprimitive(); |
|
public: |
|
// unformatted append of one character |
|
void put(BOOST_DEDUCED_TYPENAME OStream::char_type c){ |
|
if(os.fail()) |
|
boost::serialization::throw_exception( |
|
archive_exception(archive_exception::output_stream_error) |
|
); |
|
os.put(c); |
|
} |
|
// unformatted append of null terminated string |
|
void put(const char * s){ |
|
while('\0' != *s) |
|
os.put(*s++); |
|
} |
|
BOOST_ARCHIVE_OR_WARCHIVE_DECL(void) |
|
save_binary(const void *address, std::size_t count); |
|
}; |
|
|
|
} //namespace boost |
|
} //namespace archive |
|
|
|
#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas |
|
|
|
#endif // BOOST_ARCHIVE_BASIC_TEXT_OPRIMITIVE_HPP
|
|
|