summaryrefslogtreecommitdiff
path: root/xsd/libxsd/xsd/cxx/tree/istream.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'xsd/libxsd/xsd/cxx/tree/istream.hxx')
-rw-r--r--xsd/libxsd/xsd/cxx/tree/istream.hxx200
1 files changed, 198 insertions, 2 deletions
diff --git a/xsd/libxsd/xsd/cxx/tree/istream.hxx b/xsd/libxsd/xsd/cxx/tree/istream.hxx
index 2f8f8cb..45e334b 100644
--- a/xsd/libxsd/xsd/cxx/tree/istream.hxx
+++ b/xsd/libxsd/xsd/cxx/tree/istream.hxx
@@ -1,13 +1,17 @@
// file : xsd/cxx/tree/istream.hxx
-// author : Boris Kolpackov <boris@codesynthesis.com>
-// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC
+// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC
// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
#ifndef XSD_CXX_TREE_ISTREAM_HXX
#define XSD_CXX_TREE_ISTREAM_HXX
+#include <map>
+#include <string>
+#include <memory> // std::auto_ptr/unique_ptr
#include <cstddef> // std::size_t
+#include <xsd/cxx/config.hxx> // XSD_AUTO_PTR
+
#include <xsd/cxx/tree/istream-fwd.hxx>
namespace xsd
@@ -138,13 +142,102 @@ namespace xsd
return s_;
}
+ // Add string to the pool. The application should add every
+ // potentially pooled string to correctly re-create the pool
+ // constructed during insertion.
+ //
+ template <typename C>
+ void
+ pool_add (const std::basic_string<C>& s)
+ {
+ typedef pool_impl<C> pool_type;
+
+ if (pool_.get () == 0)
+ pool_.reset (new pool_type);
+
+ pool_type& p (*static_cast<pool_type*> (pool_.get ()));
+ p.push_back (s);
+ }
+
+ // Get string from pool id. We return the result via an argument
+ // instead of as a return type to avoid difficulties some compilers
+ // (e.g., GCC) experience with calls like istream<S>::pool_string<C>.
+ //
+ template <typename C>
+ void
+ pool_string (std::size_t id, std::basic_string<C>& out)
+ {
+ typedef pool_impl<C> pool_type;
+ pool_type& p (*static_cast<pool_type*> (pool_.get ()));
+ out = p[id - 1];
+ }
+
+ public:
+ // 8-bit
+ //
+ signed char
+ read_char ();
+
+ unsigned char
+ read_uchar ();
+
+ // 16-bit
+ //
+ unsigned short
+ read_short ();
+
+ unsigned short
+ read_ushort ();
+
+ // 32-bit
+ //
+ unsigned int
+ read_int ();
+
+ unsigned int
+ read_uint ();
+
+ // 64-bit
+ //
+ unsigned long long
+ read_ulonglong ();
+
+ unsigned long long
+ read_longlong ();
+
+ // Boolean
+ //
+ bool
+ read_bool ();
+
+ // Floating-point
+ //
+ float
+ read_float ();
+
+ double
+ read_double ();
+
private:
istream (const istream&);
istream&
operator= (const istream&);
private:
+ struct pool
+ {
+ virtual
+ ~pool () {}
+ };
+
+ template <typename C>
+ struct pool_impl: pool, std::vector<std::basic_string<C> >
+ {
+ };
+
S& s_;
+ std::size_t seq_;
+ XSD_AUTO_PTR<pool> pool_;
};
@@ -251,6 +344,109 @@ namespace xsd
istream_common::as_float64<double> as_float64 (x);
return s >> as_float64;
}
+
+ //
+ // read_* functions.
+ //
+
+ template <typename S>
+ inline signed char istream<S>::
+ read_char ()
+ {
+ signed char r;
+ *this >> r;
+ return r;
+ }
+
+ template <typename S>
+ inline unsigned char istream<S>::
+ read_uchar ()
+ {
+ unsigned char r;
+ *this >> r;
+ return r;
+ }
+
+ template <typename S>
+ inline unsigned short istream<S>::
+ read_short ()
+ {
+ short r;
+ *this >> r;
+ return r;
+ }
+
+ template <typename S>
+ inline unsigned short istream<S>::
+ read_ushort ()
+ {
+ unsigned short r;
+ *this >> r;
+ return r;
+ }
+
+ template <typename S>
+ inline unsigned int istream<S>::
+ read_int ()
+ {
+ int r;
+ *this >> r;
+ return r;
+ }
+
+ template <typename S>
+ inline unsigned int istream<S>::
+ read_uint ()
+ {
+ unsigned int r;
+ *this >> r;
+ return r;
+ }
+
+ template <typename S>
+ inline unsigned long long istream<S>::
+ read_ulonglong ()
+ {
+ long long r;
+ *this >> r;
+ return r;
+ }
+
+ template <typename S>
+ inline unsigned long long istream<S>::
+ read_longlong ()
+ {
+ unsigned long long r;
+ *this >> r;
+ return r;
+ }
+
+ template <typename S>
+ inline bool istream<S>::
+ read_bool ()
+ {
+ bool r;
+ *this >> r;
+ return r;
+ }
+
+ template <typename S>
+ inline float istream<S>::
+ read_float ()
+ {
+ float r;
+ *this >> r;
+ return r;
+ }
+
+ template <typename S>
+ inline double istream<S>::
+ read_double ()
+ {
+ double r;
+ *this >> r;
+ return r;
+ }
}
}
}