diff options
author | Benjamin Paassen <bpaassen@techfak.uni-bielefeld.de> | 2015-01-24 14:41:18 +0100 |
---|---|---|
committer | Benjamin Paassen <bpaassen@techfak.uni-bielefeld.de> | 2015-01-24 14:41:18 +0100 |
commit | 7ce3c040a19cd76a0d67c101920410927b84369f (patch) | |
tree | 9ac72ac188ef093d0858c335c8c74c5786db9dc5 /src/core/common | |
parent | ea775582db6b5e1f3df2e461bef47544e5093014 (diff) |
fixed some bugs in conversion functions and added new conversion functions for cardinalities.
Diffstat (limited to 'src/core/common')
-rw-r--r-- | src/core/common/VariantConverter.cpp | 80 |
1 files changed, 69 insertions, 11 deletions
diff --git a/src/core/common/VariantConverter.cpp b/src/core/common/VariantConverter.cpp index 65d2039..03eb2e8 100644 --- a/src/core/common/VariantConverter.cpp +++ b/src/core/common/VariantConverter.cpp @@ -111,8 +111,7 @@ bool VariantConverter::toInt(Variant &var, Logger &logger, Mode mode) case VariantType::STRING: case VariantType::MAGIC: { Number n; - n.parse(var.asString(), logger); - if (n.isInt()) { + if (n.parse(var.asString(), logger) && n.isInt()) { var = (Variant::intType)n.intValue(); return true; } @@ -122,13 +121,25 @@ bool VariantConverter::toInt(Variant &var, Logger &logger, Mode mode) try { // JavaScript behaviour when converting arrays to doubles const Variant::arrayType &a = var.asArray(); - var = (a.size() == 1) ? a[0].toInt() : 0.0; - return true; + if (a.size() == 1) { + var = a[0].toInt(); + return true; + } } catch (LoggableException ex) { logger.log(ex); + break; } } + case VariantType::CARDINALITY: { + const Variant::cardinalityType &card = var.asCardinality(); + if (card.getRanges().size() == 1 && + card.getRanges().begin()->isPrimitive()) { + var = (Variant::intType)card.getRanges().begin()->start; + return true; + } + break; + } default: break; } @@ -168,9 +179,11 @@ bool VariantConverter::toDouble(Variant &var, Logger &logger, Mode mode) case VariantType::STRING: case VariantType::MAGIC: { Number n; - n.parse(var.asString(), logger); - var = (Variant::doubleType)n.doubleValue(); - return true; + if (n.parse(var.asString(), logger)) { + var = (Variant::doubleType)n.doubleValue(); + return true; + } + break; } case VariantType::ARRAY: { try { @@ -181,8 +194,18 @@ bool VariantConverter::toDouble(Variant &var, Logger &logger, Mode mode) } catch (LoggableException ex) { logger.log(ex); + break; } } + case VariantType::CARDINALITY: { + const Variant::cardinalityType &card = var.asCardinality(); + if (card.getRanges().size() == 1 && + card.getRanges().begin()->isPrimitive()) { + var = (Variant::doubleType)card.getRanges().begin()->start; + return true; + } + break; + } default: break; } @@ -233,6 +256,40 @@ bool VariantConverter::toString(Variant &var, Logger &logger, Mode mode) // Perform lossy conversions if (mode == Mode::ALL) { switch (type) { + case VariantType::CARDINALITY: { + // Print cardinality syntax + Variant::cardinalityType card = var.asCardinality(); + std::stringstream ss; + ss << "<cardinality {"; + bool first = true; + for (Variant::rangeType r : card.getRanges()) { + if (first) { + first = false; + } else { + ss << ", "; + } + if (r.isPrimitive()) { + ss << std::to_string(r.start); + } else if (r.isCompact()) { + ss << std::to_string(r.start) << "-" + << std::to_string(r.end); + } else if (r.isOpenLow()) { + if (r.isOpenHigh()) { + // if it is open at both ends, we set a Kleene Star + ss << "*"; + } else { + ss << "<" << std::to_string(r.end + 1); + } + } else { + // because r is not compact and not open low, it must be + // open high. + ss << ">" << std::to_string(r.start - 1); + } + } + ss << "}>"; + var = ss.str().c_str(); + return true; + } case VariantType::ARRAY: case VariantType::MAP: { std::stringstream ss; @@ -343,7 +400,7 @@ bool VariantConverter::toCardinality(Variant &var, Logger &logger, Mode mode) "A value smaller 0 can not be converted to a cardinality!"); return false; } - card.merge({(unsigned int) value}); + card.merge({(unsigned int)value}); return true; } @@ -373,7 +430,7 @@ bool VariantConverter::toCardinality(Variant &var, Logger &logger, Mode mode) "cardinality!"); return false; } - card.merge({(unsigned int) value}); + card.merge({(unsigned int)value}); return true; } case VariantType::ARRAY: { @@ -416,14 +473,15 @@ bool VariantConverter::toCardinality(Variant &var, Logger &logger, Mode mode) std::to_string(end) + " of the Range."); return false; } - card.merge({(unsigned int) start, (unsigned int) end}); + card.merge({(unsigned int)start, (unsigned int)end}); it++; } return true; } case VariantType::STRING: { var.setCardinality(Variant::cardinalityType{}); -// Variant::cardinalityType &card = var.asCardinality(); + // Variant::cardinalityType &card = + // var.asCardinality(); // TODO: Implement! return false; } |