COMPASSi/trunk/code/inc/DataManager/XmlSerialization/xsd/cxx/tree/ace-cdr-stream-insertion.hxx

248 lines
6.8 KiB
C++

// file : xsd/cxx/tree/ace-cdr-stream-insertion.hxx
// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
#ifndef XSD_CXX_TREE_ACE_CDR_STREAM_INSERTION_HXX
#define XSD_CXX_TREE_ACE_CDR_STREAM_INSERTION_HXX
#include <cstddef> // std::size_t
#include <string>
#include <ace/CDR_Stream.h>
#include <xsd/cxx/tree/buffer.hxx>
#include <xsd/cxx/tree/ostream.hxx>
#include <xsd/cxx/tree/ace-cdr-stream-common.hxx>
namespace xsd
{
namespace cxx
{
namespace tree
{
struct ace_cdr_stream_insertion: ace_cdr_stream_operation
{
virtual const char*
what () const throw ()
{
return "ACE CDR stream insertion operation failed";
}
};
// as_size
//
#ifdef XSD_CXX_TREE_USE_64_BIT_SIZE
template <typename T>
inline ostream<ACE_OutputCDR>&
operator<< (ostream<ACE_OutputCDR>& s,
ostream<ACE_OutputCDR>::as_size<T> x)
{
if (!s.impl ().write_ulonglong (
static_cast<ACE_CDR::ULongLong> (x.x_)))
throw ace_cdr_stream_insertion ();
return s;
}
#else
template <typename T>
inline ostream<ACE_OutputCDR>&
operator<< (ostream<ACE_OutputCDR>& s,
ostream<ACE_OutputCDR>::as_size<T> x)
{
if (x.x_ > ~(ACE_CDR::ULong (0)) ||
!s.impl ().write_ulong (static_cast<ACE_CDR::ULong> (x.x_)))
throw ace_cdr_stream_insertion ();
return s;
}
#endif
// 8-bit
//
template <typename T>
inline ostream<ACE_OutputCDR>&
operator<< (ostream<ACE_OutputCDR>& s,
ostream<ACE_OutputCDR>::as_int8<T> x)
{
ACE_CDR::Octet r (static_cast<ACE_CDR::Octet> (x.x_));
if (!s.impl ().write_octet (r))
throw ace_cdr_stream_insertion ();
return s;
}
template <typename T>
inline ostream<ACE_OutputCDR>&
operator<< (ostream<ACE_OutputCDR>& s,
ostream<ACE_OutputCDR>::as_uint8<T> x)
{
ACE_CDR::Octet r (static_cast<ACE_CDR::Octet> (x.x_));
if (!s.impl ().write_octet (r))
throw ace_cdr_stream_insertion ();
return s;
}
// 16-bit
//
template <typename T>
inline ostream<ACE_OutputCDR>&
operator<< (ostream<ACE_OutputCDR>& s,
ostream<ACE_OutputCDR>::as_int16<T> x)
{
if (!s.impl ().write_short (static_cast<ACE_CDR::Short> (x.x_)))
throw ace_cdr_stream_insertion ();
return s;
}
template <typename T>
inline ostream<ACE_OutputCDR>&
operator<< (ostream<ACE_OutputCDR>& s,
ostream<ACE_OutputCDR>::as_uint16<T> x)
{
if (!s.impl ().write_ushort (static_cast<ACE_CDR::UShort> (x.x_)))
throw ace_cdr_stream_insertion ();
return s;
}
// 32-bit
//
template <typename T>
inline ostream<ACE_OutputCDR>&
operator<< (ostream<ACE_OutputCDR>& s,
ostream<ACE_OutputCDR>::as_int32<T> x)
{
if (!s.impl ().write_long (static_cast<ACE_CDR::Long> (x.x_)))
throw ace_cdr_stream_insertion ();
return s;
}
template <typename T>
inline ostream<ACE_OutputCDR>&
operator<< (ostream<ACE_OutputCDR>& s,
ostream<ACE_OutputCDR>::as_uint32<T> x)
{
if (!s.impl ().write_ulong (static_cast<ACE_CDR::ULong> (x.x_)))
throw ace_cdr_stream_insertion ();
return s;
}
// 64-bit
//
template <typename T>
inline ostream<ACE_OutputCDR>&
operator<< (ostream<ACE_OutputCDR>& s,
ostream<ACE_OutputCDR>::as_int64<T> x)
{
if (!s.impl ().write_longlong (static_cast<ACE_CDR::LongLong> (x.x_)))
throw ace_cdr_stream_insertion ();
return s;
}
template <typename T>
inline ostream<ACE_OutputCDR>&
operator<< (ostream<ACE_OutputCDR>& s,
ostream<ACE_OutputCDR>::as_uint64<T> x)
{
if (!s.impl ().write_ulonglong (
static_cast<ACE_CDR::ULongLong> (x.x_)))
throw ace_cdr_stream_insertion ();
return s;
}
// Boolean
//
template <typename T>
inline ostream<ACE_OutputCDR>&
operator<< (ostream<ACE_OutputCDR>& s,
ostream<ACE_OutputCDR>::as_bool<T> x)
{
if (!s.impl ().write_boolean (static_cast<ACE_CDR::Boolean> (x.x_)))
throw ace_cdr_stream_insertion ();
return s;
}
// Floating-point
//
template <typename T>
inline ostream<ACE_OutputCDR>&
operator<< (ostream<ACE_OutputCDR>& s,
ostream<ACE_OutputCDR>::as_float32<T> x)
{
if (!s.impl ().write_float (static_cast<ACE_CDR::Float> (x.x_)))
throw ace_cdr_stream_insertion ();
return s;
}
template <typename T>
inline ostream<ACE_OutputCDR>&
operator<< (ostream<ACE_OutputCDR>& s,
ostream<ACE_OutputCDR>::as_float64<T> x)
{
if (!s.impl ().write_double (static_cast<ACE_CDR::Double> (x.x_)))
throw ace_cdr_stream_insertion ();
return s;
}
// Insertion of std::basic_string.
//
inline ostream<ACE_OutputCDR>&
operator<< (ostream<ACE_OutputCDR>& s, const std::basic_string<char>& x)
{
// ACE CDR strings are hard-wired with a 32 bit length.
//
if (x.length () > ~(ACE_CDR::ULong (0)) ||
!s.impl ().write_string (
static_cast<ACE_CDR::ULong> (x.length ()), x.c_str ()))
throw ace_cdr_stream_insertion ();
return s;
}
#ifdef ACE_HAS_WCHAR
inline ostream<ACE_OutputCDR>&
operator<< (ostream<ACE_OutputCDR>& s,
const std::basic_string<wchar_t>& x)
{
// ACE CDR strings are hard-wired with a 32 bit length.
//
if (x.length () > ~(ACE_CDR::ULong (0)) ||
!s.impl ().write_wstring (
static_cast<ACE_CDR::ULong> (x.length ()), x.c_str ()))
throw ace_cdr_stream_insertion ();
return s;
}
#endif
// Insertion of a binary buffer.
//
template <typename C>
ostream<ACE_OutputCDR>&
operator<< (ostream<ACE_OutputCDR>& s, const buffer<C>& x)
{
std::size_t size (x.size ());
// It is not possible to write an array with a 64-bit size.
//
if (size > ~(ACE_CDR::ULong (0)) ||
!s.impl ().write_ulong (static_cast<ACE_CDR::ULong> (size)) ||
!s.impl ().write_octet_array (
reinterpret_cast<const ACE_CDR::Octet*> (x.data ()), size))
throw ace_cdr_stream_insertion ();
return s;
}
}
}
}
#endif // XSD_CXX_TREE_ACE_CDR_STREAM_INSERTION_HXX