From e7ae21f7282a90b9bda68695af362990d8a63675 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Sun, 20 Apr 2014 15:46:26 +0200 Subject: Add support for fractionDigits in serializer --- NEWS | 2 ++ doc/cxx/serializer/guide/index.xhtml | 2 ++ libxsde/xsde/cxx/serializer/validating/decimal.cxx | 10 ++++++---- .../xsde/cxx/serializer/validating/xml-schema-sskel.hxx | 5 +++++ .../xsde/cxx/serializer/validating/xml-schema-sskel.ixx | 9 +++++++++ tests/cxx/hybrid/facets/driver.cxx | 6 ++++++ tests/cxx/hybrid/facets/test-000.std | 2 ++ tests/cxx/hybrid/facets/test-000.xml | 1 + tests/cxx/hybrid/facets/test.xsd | 1 + xsde/cxx/serializer/serializer-inline.cxx | 15 +++++++++++++++ 10 files changed, 49 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 3a81dc6..6ae571e 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,8 @@ Version 3.3.0 C++/Serializer + * Support for the fractionDigits facet for the decimal data type. + * New functions, format() and precision(), allow changing of the output notation and precision for the float, double, and decimal type serializers. diff --git a/doc/cxx/serializer/guide/index.xhtml b/doc/cxx/serializer/guide/index.xhtml index 43de074..2a03c4c 100644 --- a/doc/cxx/serializer/guide/index.xhtml +++ b/doc/cxx/serializer/guide/index.xhtml @@ -6481,6 +6481,8 @@ private: maxExclusiveInteger and floating-point types. maxInclusiveInteger and floating-point types. + fractionDigitsdecimal + Datatypes byte diff --git a/libxsde/xsde/cxx/serializer/validating/decimal.cxx b/libxsde/xsde/cxx/serializer/validating/decimal.cxx index d4408af..a01cbc2 100644 --- a/libxsde/xsde/cxx/serializer/validating/decimal.cxx +++ b/libxsde/xsde/cxx/serializer/validating/decimal.cxx @@ -45,12 +45,14 @@ namespace xsde // char str[128]; + unsigned int p (f.fraction_digits_set_ + ? f.fraction_digits_ + : precision_); + #ifdef XSDE_SNPRINTF - int n = snprintf (str, 128, "%.*f", - static_cast (precision_), value_); + int n = snprintf (str, 128, "%.*f", static_cast (p), value_); #else - int n = sprintf (str, "%.*f", - static_cast (precision_), value_); + int n = sprintf (str, "%.*f", static_cast (p), value_); #endif if (n > 0 && n < 128) { diff --git a/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.hxx b/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.hxx index b757ca9..a11693a 100644 --- a/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.hxx +++ b/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.hxx @@ -980,16 +980,21 @@ namespace xsde void _min_facet (double, bool inclusive); + void + _fraction_digits_facet (unsigned int); + protected: struct facets { double min_; double max_; + unsigned int fraction_digits_; unsigned int min_set_ : 1; unsigned int min_inc_ : 1; unsigned int max_set_ : 1; unsigned int max_inc_ : 1; + unsigned int fraction_digits_set_ : 1; }; const facets& diff --git a/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.ixx b/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.ixx index 1798404..c8289d9 100644 --- a/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.ixx +++ b/libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.ixx @@ -817,6 +817,7 @@ namespace xsde #endif facets_.min_set_ = 0; facets_.max_set_ = 0; + facets_.fraction_digits_set_ = 0; } #ifdef XSDE_REUSE_STYLE_TIEIN @@ -826,6 +827,7 @@ namespace xsde { facets_.min_set_ = 0; facets_.max_set_ = 0; + facets_.fraction_digits_set_ = 0; } #endif inline void decimal_sskel:: @@ -844,6 +846,13 @@ namespace xsde facets_.min_inc_ = inc; } + inline void decimal_sskel:: + _fraction_digits_facet (unsigned int v) + { + facets_.fraction_digits_ = v; + facets_.fraction_digits_set_ = 1; + } + inline const decimal_sskel::facets& decimal_sskel:: _facets () const { diff --git a/tests/cxx/hybrid/facets/driver.cxx b/tests/cxx/hybrid/facets/driver.cxx index 9bdfec4..bb2f258 100644 --- a/tests/cxx/hybrid/facets/driver.cxx +++ b/tests/cxx/hybrid/facets/driver.cxx @@ -36,6 +36,12 @@ main (int argc, char* argv[]) doc_p.parse (argv[1]); type* r = root_p.post (); + // Test fractionDigit. + // + decimal d; + d.base_value (50.123); + r->decimal ().push_back (d); + // Serialize. // root_saggr root_s; diff --git a/tests/cxx/hybrid/facets/test-000.std b/tests/cxx/hybrid/facets/test-000.std index e777433..3f94b6c 100644 --- a/tests/cxx/hybrid/facets/test-000.std +++ b/tests/cxx/hybrid/facets/test-000.std @@ -47,6 +47,8 @@ 10.5 50 99.5 + 99.55 + 50.12 12345 12345 1234567 diff --git a/tests/cxx/hybrid/facets/test-000.xml b/tests/cxx/hybrid/facets/test-000.xml index 814be66..6430ff1 100644 --- a/tests/cxx/hybrid/facets/test-000.xml +++ b/tests/cxx/hybrid/facets/test-000.xml @@ -63,6 +63,7 @@ 10.5 50.0 99.5 + 99.55 12345 diff --git a/tests/cxx/hybrid/facets/test.xsd b/tests/cxx/hybrid/facets/test.xsd index 86c9776..7a45dfe 100644 --- a/tests/cxx/hybrid/facets/test.xsd +++ b/tests/cxx/hybrid/facets/test.xsd @@ -110,6 +110,7 @@ + diff --git a/xsde/cxx/serializer/serializer-inline.cxx b/xsde/cxx/serializer/serializer-inline.cxx index 1545c4a..e35e0f3 100644 --- a/xsde/cxx/serializer/serializer-inline.cxx +++ b/xsde/cxx/serializer/serializer-inline.cxx @@ -98,6 +98,21 @@ namespace CXX } } } + + if (ub.is_a ()) + { + for (Restricts::FacetIterator i (r.facet_begin ()); + i != r.facet_end (); ++i) + { + if (!ctx.validation) + continue; + + if (i->first == L"fractionDigits") + { + os << "this->_fraction_digits_facet (" << i->second << ");"; + } + } + } } struct Enumeration: Traversal::Enumeration, Context -- cgit v1.1