summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/value.cc28
-rw-r--r--src/value.h5
2 files changed, 33 insertions, 0 deletions
diff --git a/src/value.cc b/src/value.cc
index 1ebc3110..2d6d42d1 100644
--- a/src/value.cc
+++ b/src/value.cc
@@ -1747,6 +1747,34 @@ void value_t::print(std::ostream& out, const bool relaxed) const
}
}
+void value_t::read(std::istream& in)
+{
+ switch (static_cast<value_t::type_t>(binary::read_long<int>(in))) {
+ case BOOLEAN:
+ set_boolean(binary::read_bool(in));
+ break;
+ case INTEGER:
+ set_long(binary::read_long<long>(in));
+ break;
+ case DATETIME:
+ set_datetime(parse_datetime(binary::read_string(in)));
+ break;
+ case DATE:
+ set_date(parse_date(binary::read_string(in)));
+ break;
+ case AMOUNT: {
+ amount_t temp;
+ temp.read(in);
+ set_amount(temp);
+ break;
+ }
+ default:
+ break;
+ }
+
+ throw_(value_error, "Cannot read " << label() << " from a stream");
+}
+
void value_t::read(const char *& data)
{
switch (static_cast<value_t::type_t>(binary::read_long<int>(data))) {
diff --git a/src/value.h b/src/value.h
index 5c55a117..3c6c1d41 100644
--- a/src/value.h
+++ b/src/value.h
@@ -429,6 +429,10 @@ public:
*/
operator bool() const;
+ bool is_nonzero() const {
+ return ! is_zero();
+ }
+
bool is_realzero() const;
bool is_zero() const;
bool is_null() const {
@@ -892,6 +896,7 @@ public:
* stream or a character pointer, and it may be serialized to an
* output stream. The methods used are:
*/
+ void read(std::istream& in);
void read(const char *& data);
void write(std::ostream& out) const;