summaryrefslogtreecommitdiff
path: root/slicer/xml/serializer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'slicer/xml/serializer.cpp')
-rw-r--r--slicer/xml/serializer.cpp31
1 files changed, 25 insertions, 6 deletions
diff --git a/slicer/xml/serializer.cpp b/slicer/xml/serializer.cpp
index 27bf10b..56cdbaa 100644
--- a/slicer/xml/serializer.cpp
+++ b/slicer/xml/serializer.cpp
@@ -1,5 +1,6 @@
#include "serializer.h"
#include <boost/lexical_cast.hpp>
+#include <charconv>
#include <compileTimeFormatter.h>
#include <functional>
#pragma GCC diagnostic push
@@ -73,37 +74,37 @@ namespace Slicer {
void
set(Ice::Byte & v) const override
{
- v = boost::numeric_cast<Ice::Byte>(boost::lexical_cast<int>(value));
+ from_chars(v);
}
void
set(Ice::Short & v) const override
{
- v = boost::lexical_cast<Ice::Short>(value);
+ from_chars(v);
}
void
set(Ice::Int & v) const override
{
- v = boost::lexical_cast<Ice::Int>(value);
+ from_chars(v);
}
void
set(Ice::Long & v) const override
{
- v = boost::lexical_cast<Ice::Long>(value);
+ from_chars(v);
}
void
set(Ice::Float & v) const override
{
- v = boost::lexical_cast<Ice::Float>(value);
+ from_chars(v);
}
void
set(Ice::Double & v) const override
{
- v = boost::lexical_cast<Ice::Double>(value);
+ from_chars(v);
}
void
@@ -113,6 +114,16 @@ namespace Slicer {
}
private:
+ template<typename T>
+ void
+ from_chars(T & v) const
+ {
+ std::string_view raw {value.raw()};
+ if (std::from_chars(raw.begin(), raw.end(), v).ec != std::errc {}) {
+ throw BadNumericValue(value);
+ }
+ }
+
const Glib::ustring value;
};
@@ -489,4 +500,12 @@ namespace Slicer {
{
BadBooleanValueMsg::write(s, text);
}
+
+ AdHocFormatter(BadNumericValueMsg, "Bad numeric value [%?]");
+
+ void
+ BadNumericValue::ice_print(std::ostream & s) const
+ {
+ BadNumericValueMsg::write(s, text);
+ }
}