From 7c367506dbdece104af40519c8842b0810e735d9 Mon Sep 17 00:00:00 2001 From: Aliaksander Stsepaniuk Date: Wed, 10 Aug 2022 15:07:52 +0300 Subject: [PATCH 1/4] #815 Replace ObjArray with std::vector. ObjArray is removed from PropertiesMap class. std classes are used instead. --- api/c/indigo-renderer/src/indigo_render2d.cpp | 10 ++- .../common/base_cpp/properties_map.cpp | 64 +++++++------------ .../common/base_cpp/properties_map.h | 32 +++++----- .../molecule/src/multiple_cdx_loader.cpp | 4 +- core/indigo-core/molecule/src/rdf_loader.cpp | 42 ++++++------ core/indigo-core/molecule/src/sdf_loader.cpp | 7 +- 6 files changed, 73 insertions(+), 86 deletions(-) diff --git a/api/c/indigo-renderer/src/indigo_render2d.cpp b/api/c/indigo-renderer/src/indigo_render2d.cpp index 810a10f2dd..0c6f30a7a3 100644 --- a/api/c/indigo-renderer/src/indigo_render2d.cpp +++ b/api/c/indigo-renderer/src/indigo_render2d.cpp @@ -552,7 +552,10 @@ CEXPORT int indigoRenderGrid(int objects, int* refAtoms, int nColumns, int outpu rp.mols.add(new Molecule()); Array& title = rp.titles.push(); if (objs[i]->getProperties().contains(rp.cnvOpt.titleProp.ptr())) - title.copy(objs[i]->getProperties().valueBuf(rp.cnvOpt.titleProp.ptr())); + { + const auto& val = objs[i]->getProperties().valueBuf(rp.cnvOpt.titleProp.ptr()); + title.copy(val.c_str(), val.size() + 1); + } if (rp.rOpt.mode == DINGO_MODE::MODE_CDXML) { @@ -589,7 +592,10 @@ CEXPORT int indigoRenderGrid(int objects, int* refAtoms, int nColumns, int outpu rp.rxns.add(new Reaction()); Array& title = rp.titles.push(); if (objs[i]->getProperties().contains(rp.cnvOpt.titleProp.ptr())) - title.copy(objs[i]->getProperties().valueBuf(rp.cnvOpt.titleProp.ptr())); + { + const auto& val = objs[i]->getProperties().valueBuf(rp.cnvOpt.titleProp.ptr()); + title.copy(val.c_str(), val.size() + 1); + } rp.rxns.top()->clone(objs[i]->getBaseReaction(), 0, 0, 0); rp.rmode = RENDER_RXN; diff --git a/core/indigo-core/common/base_cpp/properties_map.cpp b/core/indigo-core/common/base_cpp/properties_map.cpp index 65a6283b77..abce549ec1 100644 --- a/core/indigo-core/common/base_cpp/properties_map.cpp +++ b/core/indigo-core/common/base_cpp/properties_map.cpp @@ -22,7 +22,7 @@ using namespace indigo; IMPL_ERROR(PropertiesMap, "properties map"); -void PropertiesMap::copy(RedBlackStringObjMap>& other) +void PropertiesMap::copy(const RedBlackStringObjMap>& other) { clear(); for (int i = other.begin(); i != other.end(); i = other.next(i)) @@ -40,45 +40,34 @@ void PropertiesMap::copy(PropertiesMap& other) } void PropertiesMap::insert(const char* key, const char* value) { - if (_properties.find(key)) + const auto it = _properties.find(key); + if (it != _properties.end()) { - auto& val = _properties.at(key); if (value != 0) - val.readString(value, true); + _properties.at(key) = value; } else { - auto& name = _propertyNames.push(); - name.readString(key, true); - int k = _properties.insert(key); - if (value != 0) - _properties.value(k).readString(value, true); + auto newIt = _properties.emplace(key, value).first; + _propertiesOrdered.push_back(std::move(newIt)); } } -Array& PropertiesMap::insert(const char* key) +std::string& PropertiesMap::insert(const char* key) { - insert(key, 0); + insert(key, ""); return valueBuf(key); } -const char* PropertiesMap::key(int i) +const char* PropertiesMap::key(int i) const { - return _propertyNames.at(i).ptr(); + return _propertiesOrdered.at(i)->first.c_str(); } -const char* PropertiesMap::value(int i) +const char* PropertiesMap::value(int i) const { - auto& buf = valueBuf(_propertyNames.at(i).ptr()); - if (buf.size() > 0) - { - return buf.ptr(); - } - else - { - return ""; - } + return _propertiesOrdered.at(i)->second.c_str(); } -Array& PropertiesMap::valueBuf(const char* key) +std::string& PropertiesMap::valueBuf(const char* key) { return _properties.at(key); } @@ -86,36 +75,29 @@ Array& PropertiesMap::valueBuf(const char* key) void PropertiesMap::clear() { _properties.clear(); - _propertyNames.clear(); + _propertiesOrdered.clear(); } bool PropertiesMap::contains(const char* key) const { - return _properties.find(key); + return _properties.find(key) != _properties.end(); } const char* PropertiesMap::at(const char* key) const { - return _properties.at(key).ptr(); + return _properties.at(key).c_str(); } void PropertiesMap::remove(const char* key) { - if (_properties.find(key)) + const auto it = _properties.find(key); + if (it != _properties.end()) { - _properties.remove(key); - int to_remove = -1; - for (auto i = 0; i < _propertyNames.size(); i++) - { - if (strcmp(_propertyNames.at(i).ptr(), key) == 0) - { - to_remove = i; - break; - } - } - if (to_remove >= 0) + _properties.erase(it); + const auto orderedIt = std::find(_propertiesOrdered.begin(), _propertiesOrdered.end(), it); + if (orderedIt != _propertiesOrdered.end()) { - _propertyNames.remove(to_remove); + _propertiesOrdered.erase(orderedIt); } else { @@ -150,5 +132,5 @@ int PropertiesMap::PrAuto::next(int k) } PropertiesMap::PrIter PropertiesMap::PrAuto::end() { - return PropertiesMap::PrIter(_owner, _owner._propertyNames.size()); + return PropertiesMap::PrIter(_owner, _owner._propertiesOrdered.size()); } \ No newline at end of file diff --git a/core/indigo-core/common/base_cpp/properties_map.h b/core/indigo-core/common/base_cpp/properties_map.h index a2df3a2eba..7d5d5e44aa 100644 --- a/core/indigo-core/common/base_cpp/properties_map.h +++ b/core/indigo-core/common/base_cpp/properties_map.h @@ -19,12 +19,15 @@ #ifndef __properties_map_h__ #define __properties_map_h__ -#include "base_cpp/array.h" +#include +#include +#include + #include "base_cpp/auto_iter.h" #include "base_cpp/exception.h" -#include "base_cpp/obj_array.h" #include "base_cpp/red_black.h" + namespace indigo { @@ -36,20 +39,15 @@ namespace indigo explicit PropertiesMap() { } - ~PropertiesMap() - { - } - // inline RedBlackStringObjMap< Array >& getProperties() { - // return _properties; - // } - void copy(RedBlackStringObjMap>& properties); + + void copy(const RedBlackStringObjMap>& properties); void copy(PropertiesMap&); void insert(const char* key, const char* value); - Array& insert(const char* key); + std::string& insert(const char* key); - const char* key(int); - const char* value(int); - Array& valueBuf(const char* key); + const char* key(int) const; + const char* value(int) const; + std::string& valueBuf(const char* key); bool contains(const char* key) const; const char* at(const char* key) const; @@ -83,9 +81,13 @@ namespace indigo PrAuto elements(); private: + // std::less<...> is used to avoid creation of temp string when searching by const char* index + using StorageType = std::map>; + PropertiesMap(const PropertiesMap&); - RedBlackStringObjMap> _properties; - ObjArray> _propertyNames; + + StorageType _properties; + std::vector _propertiesOrdered; }; } // namespace indigo diff --git a/core/indigo-core/molecule/src/multiple_cdx_loader.cpp b/core/indigo-core/molecule/src/multiple_cdx_loader.cpp index 5787a80f37..0bc62e4690 100644 --- a/core/indigo-core/molecule/src/multiple_cdx_loader.cpp +++ b/core/indigo-core/molecule/src/multiple_cdx_loader.cpp @@ -301,10 +301,10 @@ void MultipleCdxLoader::_getObject() { auto& propVal = properties.insert(name.ptr()); if (value.size() > 0) - propVal.readString(value.ptr(), true); + propVal = value.ptr(); else if (_latest_text.size() > 0) { - propVal.readString(_latest_text.ptr(), true); + propVal = _latest_text.ptr(); _latest_text.clear(); } } diff --git a/core/indigo-core/molecule/src/rdf_loader.cpp b/core/indigo-core/molecule/src/rdf_loader.cpp index 1f194d05af..62dd6a0217 100644 --- a/core/indigo-core/molecule/src/rdf_loader.cpp +++ b/core/indigo-core/molecule/src/rdf_loader.cpp @@ -164,7 +164,7 @@ void RdfLoader::readNext() /* * Current value for property reading */ - Array* current_datum = 0; + std::string* current_datum = 0; /* * Read properties */ @@ -214,7 +214,9 @@ void RdfLoader::readNext() scanner.skip(6); scanner.skipSpace(); - _readLine(scanner, *current_datum); + Array buffer; + _readLine(scanner, buffer); + *current_datum = buffer.ptr(); continue; } @@ -224,8 +226,8 @@ void RdfLoader::readNext() */ if (_innerBuffer.size() && current_datum && current_datum->size()) { - current_datum->appendString("\n", true); - current_datum->appendString(_innerBuffer.ptr(), true); + (*current_datum) += '\n'; + (*current_datum) += _innerBuffer.ptr(); } } while (_readLine(_getScanner(), _innerBuffer)); @@ -253,30 +255,26 @@ bool RdfLoader::_readIdentifiers(bool from_begin) word.push(0); if (strcmp(word.ptr(), "$MIREG") == 0 || strcmp(word.ptr(), "$RIREG") == 0) { - /* - * Insert new property key - */ - Array& val = properties.insert("internal-regno"); scanner.skipSpace(); - /* - * Insert new property value - */ - scanner.readWord(val, 0); - val.push(0); + + Array buffer; + scanner.readWord(buffer, 0); + buffer.push(0); + + properties.insert("internal-regno", buffer.ptr()); + result = true; } else if (strcmp(word.ptr(), "$MEREG") == 0 || strcmp(word.ptr(), "$REREG") == 0) { - /* - * Insert new property key - */ - Array& val = properties.insert("external-regno"); scanner.skipSpace(); - /* - * Insert new property value - */ - scanner.readWord(val, 0); - val.push(0); + + Array buffer; + scanner.readWord(buffer, 0); + buffer.push(0); + + properties.insert("mexternal-regno", buffer.ptr()); + result = true; } else if (from_begin) diff --git a/core/indigo-core/molecule/src/sdf_loader.cpp b/core/indigo-core/molecule/src/sdf_loader.cpp index 7dc4209465..8675ba1d6f 100644 --- a/core/indigo-core/molecule/src/sdf_loader.cpp +++ b/core/indigo-core/molecule/src/sdf_loader.cpp @@ -192,7 +192,7 @@ void SdfLoader::readNext() auto& propBuf = properties.insert(word.ptr()); // auto& propBuf = properties.valueBuf(word.ptr()); // int idx = properties.findOrInsert(word.ptr()); - propBuf.copy(str); + propBuf = str.ptr(); output.writeStringCR(str.ptr()); if (str.size() > 1) { @@ -205,9 +205,8 @@ void SdfLoader::readNext() output.writeStringCR(str.ptr()); if (str.size() > 1) { - propBuf.pop(); // Remove string end marker (0) - propBuf.push('\n'); - propBuf.appendString(str.ptr(), true); + propBuf += '\n'; + propBuf += str.ptr(); } } while (str.size() > 1); } From 07a19287a06b7991e57c5cff0b9187cfb582a795 Mon Sep 17 00:00:00 2001 From: Alexander Stepaniuk Date: Wed, 10 Aug 2022 17:32:26 +0300 Subject: [PATCH 2/4] Issue #815 Replace ObjArray with std::vector FIx CI issues --- core/indigo-core/common/base_cpp/properties_map.cpp | 4 +++- core/indigo-core/common/base_cpp/properties_map.h | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/core/indigo-core/common/base_cpp/properties_map.cpp b/core/indigo-core/common/base_cpp/properties_map.cpp index abce549ec1..ce968d559c 100644 --- a/core/indigo-core/common/base_cpp/properties_map.cpp +++ b/core/indigo-core/common/base_cpp/properties_map.cpp @@ -16,6 +16,8 @@ * limitations under the License. ***************************************************************************/ +#include + #include "base_cpp/properties_map.h" using namespace indigo; @@ -133,4 +135,4 @@ int PropertiesMap::PrAuto::next(int k) PropertiesMap::PrIter PropertiesMap::PrAuto::end() { return PropertiesMap::PrIter(_owner, _owner._propertiesOrdered.size()); -} \ No newline at end of file +} diff --git a/core/indigo-core/common/base_cpp/properties_map.h b/core/indigo-core/common/base_cpp/properties_map.h index 7d5d5e44aa..16fa9a3807 100644 --- a/core/indigo-core/common/base_cpp/properties_map.h +++ b/core/indigo-core/common/base_cpp/properties_map.h @@ -27,7 +27,6 @@ #include "base_cpp/exception.h" #include "base_cpp/red_black.h" - namespace indigo { From fdb8c409626cc5bf1f5a7688c3d430e5a7401f75 Mon Sep 17 00:00:00 2001 From: Aliaksandr Dziarkach <18146690+AliaksandrDziarkach@users.noreply.github.com> Date: Mon, 1 Apr 2024 16:09:35 +0300 Subject: [PATCH 3/4] fix formatin according to clang-format --- core/indigo-core/common/base_cpp/properties_map.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/indigo-core/common/base_cpp/properties_map.h b/core/indigo-core/common/base_cpp/properties_map.h index 4e59dfc88a..90b55b2f84 100644 --- a/core/indigo-core/common/base_cpp/properties_map.h +++ b/core/indigo-core/common/base_cpp/properties_map.h @@ -24,12 +24,12 @@ #pragma warning(disable : 4251) #endif -#include -#include -#include #include "base_cpp/auto_iter.h" #include "base_cpp/exception.h" #include "base_cpp/red_black.h" +#include +#include +#include namespace indigo { From 43b271e06fcac1fca20cb0ae9264b51d0ffcba56 Mon Sep 17 00:00:00 2001 From: Aliaksandr Dziarkach <18146690+AliaksandrDziarkach@users.noreply.github.com> Date: Mon, 1 Apr 2024 16:41:42 +0300 Subject: [PATCH 4/4] Fix warning --- core/indigo-core/common/base_cpp/properties_map.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/indigo-core/common/base_cpp/properties_map.cpp b/core/indigo-core/common/base_cpp/properties_map.cpp index 250e8cc2c0..f3006e69c8 100644 --- a/core/indigo-core/common/base_cpp/properties_map.cpp +++ b/core/indigo-core/common/base_cpp/properties_map.cpp @@ -152,5 +152,5 @@ int PropertiesMap::PrAuto::next(int k) } PropertiesMap::PrIter PropertiesMap::PrAuto::end() { - return PropertiesMap::PrIter(_owner, _owner._propertiesOrdered.size()); + return PropertiesMap::PrIter(_owner, static_cast(_owner._propertiesOrdered.size())); }