// file : xsd/cxx/tree/ace-cdr-stream-insertion.hxx // author : Boris Kolpackov // copyright : Copyright (c) 2005-2011 Code Synthesis Tools CC // 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 // std::size_t #include #include #include #include #include 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 inline ostream& operator<< (ostream& s, ostream::as_size x) { if (!s.impl ().write_ulonglong ( static_cast (x.x_))) throw ace_cdr_stream_insertion (); return s; } #else template inline ostream& operator<< (ostream& s, ostream::as_size x) { if (x.x_ > ~(ACE_CDR::ULong (0)) || !s.impl ().write_ulong (static_cast (x.x_))) throw ace_cdr_stream_insertion (); return s; } #endif // 8-bit // template inline ostream& operator<< (ostream& s, ostream::as_int8 x) { ACE_CDR::Octet r (static_cast (x.x_)); if (!s.impl ().write_octet (r)) throw ace_cdr_stream_insertion (); return s; } template inline ostream& operator<< (ostream& s, ostream::as_uint8 x) { ACE_CDR::Octet r (static_cast (x.x_)); if (!s.impl ().write_octet (r)) throw ace_cdr_stream_insertion (); return s; } // 16-bit // template inline ostream& operator<< (ostream& s, ostream::as_int16 x) { if (!s.impl ().write_short (static_cast (x.x_))) throw ace_cdr_stream_insertion (); return s; } template inline ostream& operator<< (ostream& s, ostream::as_uint16 x) { if (!s.impl ().write_ushort (static_cast (x.x_))) throw ace_cdr_stream_insertion (); return s; } // 32-bit // template inline ostream& operator<< (ostream& s, ostream::as_int32 x) { if (!s.impl ().write_long (static_cast (x.x_))) throw ace_cdr_stream_insertion (); return s; } template inline ostream& operator<< (ostream& s, ostream::as_uint32 x) { if (!s.impl ().write_ulong (static_cast (x.x_))) throw ace_cdr_stream_insertion (); return s; } // 64-bit // template inline ostream& operator<< (ostream& s, ostream::as_int64 x) { if (!s.impl ().write_longlong (static_cast (x.x_))) throw ace_cdr_stream_insertion (); return s; } template inline ostream& operator<< (ostream& s, ostream::as_uint64 x) { if (!s.impl ().write_ulonglong ( static_cast (x.x_))) throw ace_cdr_stream_insertion (); return s; } // Boolean // template inline ostream& operator<< (ostream& s, ostream::as_bool x) { if (!s.impl ().write_boolean (static_cast (x.x_))) throw ace_cdr_stream_insertion (); return s; } // Floating-point // template inline ostream& operator<< (ostream& s, ostream::as_float32 x) { if (!s.impl ().write_float (static_cast (x.x_))) throw ace_cdr_stream_insertion (); return s; } template inline ostream& operator<< (ostream& s, ostream::as_float64 x) { if (!s.impl ().write_double (static_cast (x.x_))) throw ace_cdr_stream_insertion (); return s; } // Insertion of std::basic_string. // inline ostream& operator<< (ostream& s, const std::basic_string& 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 (x.length ()), x.c_str ())) throw ace_cdr_stream_insertion (); return s; } #ifdef ACE_HAS_WCHAR inline ostream& operator<< (ostream& s, const std::basic_string& 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 (x.length ()), x.c_str ())) throw ace_cdr_stream_insertion (); return s; } #endif // Insertion of a binary buffer. // template ostream& operator<< (ostream& s, const buffer& 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 (size)) || !s.impl ().write_octet_array ( reinterpret_cast (x.data ()), size)) throw ace_cdr_stream_insertion (); return s; } } } } #endif // XSD_CXX_TREE_ACE_CDR_STREAM_INSERTION_HXX