aboutsummaryrefslogtreecommitdiff
path: root/examples/cxx/hybrid/binary/custom/irawstream.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'examples/cxx/hybrid/binary/custom/irawstream.cxx')
-rw-r--r--examples/cxx/hybrid/binary/custom/irawstream.cxx296
1 files changed, 296 insertions, 0 deletions
diff --git a/examples/cxx/hybrid/binary/custom/irawstream.cxx b/examples/cxx/hybrid/binary/custom/irawstream.cxx
new file mode 100644
index 0000000..d3d6aae
--- /dev/null
+++ b/examples/cxx/hybrid/binary/custom/irawstream.cxx
@@ -0,0 +1,296 @@
+// file : examples/cxx/hybrid/binary/custom/irawstream.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : not copyrighted - public domain
+
+#include <string.h> // memcpy
+
+#include "irawstream.hxx"
+
+using namespace xml_schema;
+
+const char* irawstream::
+align (size_t a, size_t n)
+{
+ size_t r = pos_ % a;
+
+ if (r)
+ n += a - r;
+
+ if (buf_.size () - pos_ < n)
+ throw raw_exception ();
+
+ const char* p = buf_.data () + pos_;
+
+ if (r)
+ p += a - r;
+
+ pos_ += n;
+ return p;
+}
+
+void irawstream::
+operator>> (std::string& x)
+{
+ size_t n = *reinterpret_cast<const size_t*> (
+ align (sizeof (size_t), sizeof (size_t)));
+
+ x.clear ();
+
+ if (n != 0)
+ {
+ x.resize (n);
+ memcpy (const_cast<char*> (x.c_str ()), align (1, n), n);
+ }
+}
+
+void irawstream::
+operator>> (buffer& x)
+{
+ size_t n = *reinterpret_cast<const size_t*> (
+ align (sizeof (size_t), sizeof (size_t)));
+
+ x.size (n);
+
+ if (n != 0)
+ memcpy (x.data (), align (1, n), n);
+}
+
+void
+operator>> (irawstream& s, str_seq& x)
+{
+ size_t n;
+ irawstream::as_size as_size (n);
+ s >> as_size;
+
+ x.clear ();
+
+ if (n > 0)
+ {
+ x.reserve (n);
+ std::string i;
+
+ while (n--)
+ {
+ s >> i;
+ x.push_back (i);
+ }
+ }
+}
+
+void
+operator>> (irawstream& s, qname& x)
+{
+ std::string p, n;
+
+ s >> p;
+ s >> n;
+
+ x.prefix (p);
+ x.name (n);
+}
+
+void
+operator>> (irawstream& s, time_zone& x)
+{
+ short h, m;
+ s >> h;
+ s >> m;
+
+ x.zone_hours (h);
+ x.zone_minutes (m);
+}
+
+void
+operator>> (irawstream& s, date& x)
+{
+ int y;
+ unsigned short m, d;
+ bool zp;
+
+ s >> y;
+ s >> m;
+ s >> d;
+ s >> zp;
+
+ x.year (y);
+ x.month (m);
+ x.day (d);
+
+ if (zp)
+ {
+ time_zone& z = x;
+ s >> z;
+ }
+}
+
+void
+operator>> (irawstream& s, date_time& x)
+{
+ int y;
+ unsigned short m, d, h, mi;
+ double se;
+ bool zp;
+
+ s >> y;
+ s >> m;
+ s >> d;
+ s >> h;
+ s >> mi;
+ s >> se;
+ s >> zp;
+
+ x.year (y);
+ x.month (m);
+ x.day (d);
+ x.hours (h);
+ x.minutes (mi);
+ x.seconds (se);
+
+ if (zp)
+ {
+ time_zone& z = x;
+ s >> z;
+ }
+}
+
+void
+operator>> (irawstream& s, duration& x)
+{
+ bool n;
+ unsigned int y, m, d, h, mi;
+ double se;
+
+ s >> n;
+ s >> y;
+ s >> m;
+ s >> d;
+ s >> h;
+ s >> mi;
+ s >> se;
+
+ x.negative (n);
+ x.years (y);
+ x.months (m);
+ x.days (d);
+ x.hours (h);
+ x.minutes (mi);
+ x.seconds (se);
+}
+
+void
+operator>> (irawstream& s, gday& x)
+{
+ unsigned short d;
+ bool zp;
+
+ s >> d;
+ s >> zp;
+
+ x.day (d);
+
+ if (zp)
+ {
+ time_zone& z = x;
+ s >> z;
+ }
+}
+
+void
+operator>> (irawstream& s, gmonth& x)
+{
+ unsigned short m;
+ bool zp;
+
+ s >> m;
+ s >> zp;
+
+ x.month (m);
+
+ if (zp)
+ {
+ time_zone& z = x;
+ s >> z;
+ }
+}
+
+void
+operator>> (irawstream& s, gmonth_day& x)
+{
+ unsigned short d, m;
+ bool zp;
+
+ s >> d;
+ s >> m;
+ s >> zp;
+
+ x.day (d);
+ x.month (m);
+
+ if (zp)
+ {
+ time_zone& z = x;
+ s >> z;
+ }
+}
+
+void
+operator>> (irawstream& s, gyear& x)
+{
+ int y;
+ bool zp;
+
+ s >> y;
+ s >> zp;
+
+ x.year (y);
+
+ if (zp)
+ {
+ time_zone& z = x;
+ s >> z;
+ }
+}
+
+void
+operator>> (irawstream& s, gyear_month& x)
+{
+ int y;
+ unsigned short m;
+ bool zp;
+
+ s >> y;
+ s >> m;
+ s >> zp;
+
+ x.year (y);
+ x.month (m);
+
+ if (zp)
+ {
+ time_zone& z = x;
+ s >> z;
+ }
+}
+
+void
+operator>> (irawstream& s, xml_schema::time& x)
+{
+ unsigned short h, m;
+ double se;
+ bool zp;
+
+ s >> h;
+ s >> m;
+ s >> se;
+ s >> zp;
+
+ x.hours (h);
+ x.minutes (m);
+ x.seconds (se);
+
+ if (zp)
+ {
+ time_zone& z = x;
+ s >> z;
+ }
+}