aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2014-04-20 15:46:26 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2014-04-20 15:46:26 +0200
commite7ae21f7282a90b9bda68695af362990d8a63675 (patch)
treefa4a7c7877ca034b5cde31d05513e1c2c40784bf
parentebbf82b02d8b4c0b25e39395a35e899cea0f1cdd (diff)
Add support for fractionDigits in serializer
-rw-r--r--NEWS2
-rw-r--r--doc/cxx/serializer/guide/index.xhtml2
-rw-r--r--libxsde/xsde/cxx/serializer/validating/decimal.cxx10
-rw-r--r--libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.hxx5
-rw-r--r--libxsde/xsde/cxx/serializer/validating/xml-schema-sskel.ixx9
-rw-r--r--tests/cxx/hybrid/facets/driver.cxx6
-rw-r--r--tests/cxx/hybrid/facets/test-000.std2
-rw-r--r--tests/cxx/hybrid/facets/test-000.xml1
-rw-r--r--tests/cxx/hybrid/facets/test.xsd1
-rw-r--r--xsde/cxx/serializer/serializer-inline.cxx15
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:
<tr><td>maxExclusive</td><td>Integer and floating-point types.</td></tr>
<tr><td>maxInclusive</td><td>Integer and floating-point types.</td></tr>
+ <tr><td>fractionDigits</td><td><code>decimal</code></td></tr>
+
<tr><th colspan="2">Datatypes</th></tr>
<tr><td>byte</td><td></td></tr>
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<int> (precision_), value_);
+ int n = snprintf (str, 128, "%.*f", static_cast<int> (p), value_);
#else
- int n = sprintf (str, "%.*f",
- static_cast<int> (precision_), value_);
+ int n = sprintf (str, "%.*f", static_cast<int> (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 @@
<decimal>10.5</decimal>
<decimal>50</decimal>
<decimal>99.5</decimal>
+ <decimal>99.55</decimal>
+ <decimal>50.12</decimal>
<string1>12345</string1>
<string2>12345</string2>
<string2>1234567</string2>
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 @@
<decimal>10.5</decimal>
<decimal>50.0</decimal>
<decimal>99.5</decimal>
+ <decimal>99.55</decimal>
<string1>12345</string1>
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 @@
<restriction base="decimal">
<minInclusive value="10.0"/>
<maxInclusive value="100"/>
+ <fractionDigits value="2"/>
</restriction>
</simpleType>
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<SemanticGraph::Fundamental::Decimal> ())
+ {
+ 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