From 2fae7ac076bb5b9ffd135e482690b69c229b474b Mon Sep 17 00:00:00 2001 From: john30 Date: Sun, 8 Nov 2015 22:15:10 +0100 Subject: [PATCH] added DataField::clone() --- src/lib/ebus/data.cpp | 31 +++++++++++++++++++++++++++++++ src/lib/ebus/data.h | 30 ++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/src/lib/ebus/data.cpp b/src/lib/ebus/data.cpp index af860233..b61f4192 100644 --- a/src/lib/ebus/data.cpp +++ b/src/lib/ebus/data.cpp @@ -566,6 +566,10 @@ result_t SingleDataField::write(istringstream& input, return writeSymbols(input, offset, data); } +StringDataField* StringDataField::clone() +{ + return new StringDataField(*this); +} result_t StringDataField::derive(string name, string comment, string unit, const PartType partType, @@ -979,6 +983,11 @@ NumberDataField::NumberDataField(const string name, const string comment, break; } +NumberDataField* NumberDataField::clone() +{ + return new NumberDataField(*this); +} + result_t NumberDataField::derive(string name, string comment, string unit, const PartType partType, int divisor, map values, @@ -1159,6 +1168,11 @@ result_t NumberDataField::writeSymbols(istringstream& input, } +ValueListDataField* ValueListDataField::clone() +{ + return new ValueListDataField(*this); +} + result_t ValueListDataField::derive(string name, string comment, string unit, const PartType partType, int divisor, map values, @@ -1305,6 +1319,15 @@ DataFieldSet::~DataFieldSet() } } +DataFieldSet* DataFieldSet::clone() +{ + vector fields; + for (vector::iterator it = m_fields.begin(); it < m_fields.end(); it++) { + fields.push_back((*it)->clone()); + } + return new DataFieldSet(m_name, m_comment, fields); +} + unsigned char DataFieldSet::getLength(PartType partType) { unsigned char length = 0; @@ -1493,6 +1516,14 @@ result_t DataFieldSet::write(istringstream& input, } +DataFieldTemplates::DataFieldTemplates(DataFieldTemplates& other) + : FileReader::FileReader(false) +{ + for (map::iterator it = other.m_fieldsByName.begin(); it != other.m_fieldsByName.end(); it++) { + m_fieldsByName[it->first] = it->second->clone(); + } +} + void DataFieldTemplates::clear() { for (map::iterator it = m_fieldsByName.begin(); it != m_fieldsByName.end(); it++) { diff --git a/src/lib/ebus/data.h b/src/lib/ebus/data.h index 0cb22f0d..28bb23dd 100644 --- a/src/lib/ebus/data.h +++ b/src/lib/ebus/data.h @@ -156,6 +156,12 @@ public: */ virtual ~DataField() {} + /** + * Clone this instance. + * @return a clone of this instance. + */ + virtual DataField* clone() = 0; + /** * Factory method for creating new instances. * @param it the iterator to traverse for the definition parts. @@ -318,6 +324,9 @@ public: */ virtual ~SingleDataField() {} + // @copydoc + virtual SingleDataField* clone() = 0; + /** * Factory method for creating a new @a SingleDataField instance derived from a base type. * @param typeNameStr the base type name string. @@ -460,6 +469,9 @@ public: */ virtual ~StringDataField() {} + // @copydoc + virtual StringDataField* clone(); + // @copydoc virtual result_t derive(string name, string comment, string unit, const PartType partType, @@ -516,6 +528,9 @@ public: */ virtual ~NumericDataField() {} + // @copydoc + virtual NumericDataField* clone() = 0; + // @copydoc virtual bool hasFullByteOffset(bool after); @@ -576,6 +591,9 @@ public: */ virtual ~NumberDataField() {} + // @copydoc + virtual NumberDataField* clone(); + // @copydoc virtual result_t derive(string name, string comment, string unit, const PartType partType, @@ -636,6 +654,9 @@ public: */ virtual ~ValueListDataField() {} + // @copydoc + virtual ValueListDataField* clone(); + // @copydoc virtual result_t derive(string name, string comment, string unit, const PartType partType, int divisor, @@ -697,6 +718,9 @@ public: */ virtual ~DataFieldSet(); + // @copydoc + virtual DataFieldSet* clone(); + // @copydoc virtual unsigned char getLength(PartType partType); @@ -771,6 +795,12 @@ public: */ DataFieldTemplates() : FileReader::FileReader(false) {} + /** + * Constructs a new copied instance. + * @param other the @a DataFieldTemplates to copy from. + */ + DataFieldTemplates(DataFieldTemplates& other); + /** * Destructor. */