Skip to content

Commit 8df3ba9

Browse files
authored
Fix: short form serialization of non-finite doubles (#357)
1 parent bd2643d commit 8df3ba9

2 files changed

Lines changed: 15 additions & 3 deletions

File tree

src/rdf4cpp/Literal.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -724,8 +724,10 @@ bool Literal::serialize(writer::BufWriterParts const writer, NodeSerializationOp
724724
RDF4CPP_DETAIL_TRY_WRITE_STR("@");
725725
RDF4CPP_DETAIL_TRY_WRITE_STR(value.language_tag);
726726
return true;
727-
} else if (opts.use_short_form && (this->datatype_eq<datatypes::xsd::Integer>() || this->datatype_eq<datatypes::xsd::Double>()
728-
|| this->datatype_eq<datatypes::xsd::Decimal>() || this->datatype_eq<datatypes::xsd::Boolean>())) {
727+
} else if (opts.use_short_form && (this->datatype_eq<datatypes::xsd::Integer>()
728+
|| this->datatype_eq<datatypes::xsd::Decimal>()
729+
|| this->datatype_eq<datatypes::xsd::Boolean>()
730+
|| (this->datatype_eq<datatypes::xsd::Double>() && std::isfinite(this->value<datatypes::xsd::Double>())))) {
729731

730732
return this->serialize_lexical_form(writer);
731733
} else if (this->is_inlined()) {

tests/serializer/tests_Serialization.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
#include <rdf4cpp.hpp>
44
#include <rdf4cpp/storage/reference_node_storage/UnsyncReferenceNodeStorage.hpp>
55

6+
#include <cmath>
7+
68
enum struct OutputFormat {
79
NTriples,
810
Turtle,
@@ -29,14 +31,22 @@ TEST_CASE("Literal short form and prefixed") {
2931
writer::write_str(",", ser);
3032
Literal::make_typed<datatypes::xsd::Double>("4").serialize(ser, NodeSerializationOpts::prefixed_and_short_form());
3133
writer::write_str(",", ser);
34+
Literal::make_typed<datatypes::xsd::Double>("INF").serialize(ser, NodeSerializationOpts::prefixed_and_short_form());
35+
writer::write_str(",", ser);
36+
Literal::make_typed<datatypes::xsd::Double>("-INF").serialize(ser, NodeSerializationOpts::prefixed_and_short_form());
37+
writer::write_str(",", ser);
38+
Literal::make_typed<datatypes::xsd::Double>("NaN").serialize(ser, NodeSerializationOpts::prefixed_and_short_form());
39+
writer::write_str(",", ser);
40+
Literal::make_typed_from_value<datatypes::xsd::Double>(HUGE_VAL).serialize(ser, NodeSerializationOpts::prefixed_and_short_form());
41+
writer::write_str(",", ser);
3242
Literal::make_typed<datatypes::xsd::Float>("4").serialize(ser, NodeSerializationOpts::prefixed_and_short_form());
3343
writer::write_str(",", ser);
3444
Literal::make_typed<datatypes::xsd::UnsignedByte>("4").serialize(ser, NodeSerializationOpts::prefixed_and_short_form());
3545
writer::write_str(",", ser);
3646
Literal::make_typed<datatypes::xsd::Integer>("4").serialize(ser, NodeSerializationOpts::prefixed_and_short_form());
3747
ser.finalize();
3848

39-
CHECK_EQ(buf, R"("2042-05-04"^^xsd:date,true,4.0,4.0E0,"4.0E0"^^xsd:float,"4"^^xsd:unsignedByte,4)");
49+
CHECK_EQ(buf, R"("2042-05-04"^^xsd:date,true,4.0,4.0E0,"INF"^^xsd:double,"-INF"^^xsd:double,"NaN"^^xsd:double,"INF"^^xsd:double,"4.0E0"^^xsd:float,"4"^^xsd:unsignedByte,4)");
4050
}
4151

4252
TEST_CASE("Literal short form") {

0 commit comments

Comments
 (0)