From 2615896faa646e5830abf2c269150e1165c66515 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Fri, 18 Dec 2020 18:48:46 +0300 Subject: Switch to build2 --- libxsd/libxsd/cxx/tree/ostream.hxx | 290 +++++++++++++++++++++++++++++++++++++ 1 file changed, 290 insertions(+) create mode 100644 libxsd/libxsd/cxx/tree/ostream.hxx (limited to 'libxsd/libxsd/cxx/tree/ostream.hxx') diff --git a/libxsd/libxsd/cxx/tree/ostream.hxx b/libxsd/libxsd/cxx/tree/ostream.hxx new file mode 100644 index 0000000..e646212 --- /dev/null +++ b/libxsd/libxsd/cxx/tree/ostream.hxx @@ -0,0 +1,290 @@ +// file : libxsd/cxx/tree/ostream.hxx +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#ifndef LIBXSD_CXX_TREE_OSTREAM_HXX +#define LIBXSD_CXX_TREE_OSTREAM_HXX + +#include +#include +#include // std::auto_ptr/unique_ptr +#include // std::size_t + +#include // XSD_AUTO_PTR + +namespace xsd +{ + namespace cxx + { + namespace tree + { + class ostream_common + { + public: + template + struct as_size + { + explicit as_size (T x) : x_ (x) {} + T x_; + }; + + + // 8-bit + // + template + struct as_int8 + { + explicit as_int8 (T x) : x_ (x) {} + T x_; + }; + + template + struct as_uint8 + { + explicit as_uint8 (T x) : x_ (x) {} + T x_; + }; + + + // 16-bit + // + template + struct as_int16 + { + explicit as_int16 (T x) : x_ (x) {} + T x_; + }; + + template + struct as_uint16 + { + explicit as_uint16 (T x) : x_ (x) {} + T x_; + }; + + + // 32-bit + // + template + struct as_int32 + { + explicit as_int32 (T x) : x_ (x) {} + T x_; + }; + + template + struct as_uint32 + { + explicit as_uint32 (T x) : x_ (x) {} + T x_; + }; + + + // 64-bit + // + template + struct as_int64 + { + explicit as_int64 (T x) : x_ (x) {} + T x_; + }; + + template + struct as_uint64 + { + explicit as_uint64 (T x) : x_ (x) {} + T x_; + }; + + + // Boolean + // + template + struct as_bool + { + explicit as_bool (T x) : x_ (x) {} + T x_; + }; + + + // Floating-point + // + template + struct as_float32 + { + explicit as_float32 (T x) : x_ (x) {} + T x_; + }; + + template + struct as_float64 + { + explicit as_float64 (T x) : x_ (x) {} + T x_; + }; + }; + + template + class ostream: public ostream_common + { + public: + explicit + ostream (S& s) + : s_ (s), seq_ (1) + { + } + + S& + impl () + { + return s_; + } + + // If the string is not in the pool, add it and return 0. Otherwise + // return the string's pool id. In the former case the application + // should serialize the original string. + // + // The returned ids are sequential and start with 1. 0 is reserved + // as a special marker to be used by the application for the first + // encounter of the string. + // + template + std::size_t + pool_string (const std::basic_string& s) + { + typedef pool_impl pool_type; + + if (pool_.get () == 0) + pool_.reset (new pool_type); + + pool_type& p (*static_cast (pool_.get ())); + + std::pair r ( + p.insert (std::pair, std::size_t> (s, seq_))); + + if (!r.second) + return r.first->second; + + seq_++; + return 0; + } + + private: + ostream (const ostream&); + ostream& + operator= (const ostream&); + + private: + struct pool + { + virtual + ~pool () {} + }; + + template + struct pool_impl: pool, std::map, std::size_t> + { + }; + + S& s_; + std::size_t seq_; + XSD_AUTO_PTR pool_; + }; + + + // 8-bit + // + template + inline ostream& + operator<< (ostream& s, signed char x) + { + return s << ostream_common::as_int8 (x); + } + + template + inline ostream& + operator<< (ostream& s, unsigned char x) + { + return s << ostream_common::as_uint8 (x); + } + + + // 16-bit + // + template + inline ostream& + operator<< (ostream& s, short x) + { + return s << ostream_common::as_int16 (x); + } + + template + inline ostream& + operator<< (ostream& s, unsigned short x) + { + return s << ostream_common::as_uint16 (x); + } + + + // 32-bit + // + template + inline ostream& + operator<< (ostream& s, int x) + { + return s << ostream_common::as_int32 (x); + } + + template + inline ostream& + operator<< (ostream& s, unsigned int x) + { + return s << ostream_common::as_uint32 (x); + } + + + // 64-bit + // + template + inline ostream& + operator<< (ostream& s, long long x) + { + return s << ostream_common::as_int64 (x); + } + + template + inline ostream& + operator<< (ostream& s, unsigned long long x) + { + return s << ostream_common::as_uint64 (x); + } + + // Boolean + // + template + inline ostream& + operator<< (ostream& s, bool x) + { + return s << ostream_common::as_bool (x); + } + + + // Floating-point + // + template + inline ostream& + operator<< (ostream& s, float x) + { + return s << ostream_common::as_float32 (x); + } + + template + inline ostream& + operator<< (ostream& s, double x) + { + return s << ostream_common::as_float64 (x); + } + } + } +} + +#endif // LIBXSD_CXX_TREE_OSTREAM_HXX -- cgit v1.1